Стоял у меня дспам, работал себе, у каждого пользователя была своя база токенов. Работал он так до тех пор, пока мне не перестали нравиться размеры базы и я решил поэкспериментировать. Захотелось мне узнать какие будут результаты работы, если база токенов для всех будет общей. Добавил shared группу в group файл и наступил на грабли.

Оказалось, что переобучение в веб-интерфейсе не работает для тех сообщений, которые пришли пользователям в shared группе. На поверку выяснилось, что переобучение все таки происходит, но вот результаты переобучения не отображаются. Пришлось выяснять какого собственно хрена…

Предположим у нас есть пользователь [email protected], который имеет виртуальный id 10, и есть shared группа users, которая имеет id 20. Если пользователь [email protected] не принадлежит ни одной shared группе, то результаты анализа заносятся в файл …/dspam/data/[email protected]/[email protected] и сигнатура имеет вид: “10,<сигнатура>”. В этом случае переобучение в WebUI отлично работает.

Совсем другая картина наблюдается, когда [email protected] принадлежит shared группе, к примеру, users. В этом случае результаты анализа заносятся тоже в файл …/dspam/data/[email protected]/[email protected], но уже с сигнатурой “20,<сигнатура>”. В дальнейшем, если попытаться переобучить фильтр из WebUI, то скрипт возьмет сигнатуру, скормит ее дспаму, который в свою очередь результаты переобучения запишет не в …/dspam/data/[email protected]/[email protected], а в …/dspam/data/users/users.log. Соответственно пользователь [email protected] не увидет у себя в WebUI результатов переобучения, сколько бы он не тыкал в кнопку “переобучить”.

Почесав затылок и подумав: “и как теперь с этим взлететь?”, я пришел к мысли, что надо бы научить скрипт писать результаты в файл пользователя.

В итоге, вот:

233c233
< &ProcessFalsePositive();

> &w_ProcessFalsePositive();
235c235
< system(”$CONFIG{’DSPAM’} –-source=error –-class=” . quotemeta($FORM{’retrain’}) . ” –-signature=” . quotemeta($FORM{’signatureID’}) . ” –-user ” . quotemeta(”$CURRENT_USER”));

> &w_ProcessFalseNegative;
705a706,730
>
> sub w_ProcessFalsePositive{
> my($w_log) = “$USER.log”;
> my($w_stamp) = time;
> my($w_status) = “F”;
> my($w_info) = “NA”;
> my($w_result) = “Retrained”;
> system(”$CONFIG{’DSPAM’} –-source=error --class=” . quotemeta($FORM{’retrain’}) . ” –-signature=” . quotemeta($FORM{’signatureID’}) . ” -–user ” . quotemeta(”$CURRENT_USER”));
> open (FILE, ‘>>’ . $w_log);
> print(FILE join(”t”, $w_stamp, $w_status, $w_info, $FORM{’signatureID’}, $w_info, $w_result ), “nn”);
> close FILE;
> }
>
> sub w_ProcessFalseNegative{
> my($w_log) = “$USER.log”;
> my($w_stamp) = time;
> my($w_status) = “M”;
> my($w_info) = “NA”;
> my($w_result) = “Retrained”;
> system(”$CONFIG{’DSPAM’} –-source=error –-class=” . quotemeta($FORM{’retrain’}) . ” –-signature=” . quotemeta($FORM{’signatureID’}) . ” –-user ” . quotemeta(”$CURRENT_USER”));
> open (FILE, ‘>>’ . $w_log);
> print(FILE join(”t”, $w_stamp, $w_status, $w_info, $FORM{’signatureID’}, $w_info, $w_result ), “nn”);
> close FILE;
> }
>


Дополнительные записи: