DSPAM, shared группа и WebUI (дополнение)
Парой постов раньше я уже описывал о проблеме обучения DSPAM’а через web интерфейс. Я не заметил, что обучение нажатием на ссылку описывается в скрипте отдельно от обучения проставлением галочек и нажатием на кнопку. В итоге групповая пометка писем не работала. Вот кусок кода который за это отвечает:
if ($FORM{’command’} eq “retrainChecked”) {
foreach my $i (0 .. $#{ $FORM{retrain_checked} }) {
my ($retrain, $signature) = split(/:/, $FORM{retrain_checked}[$i]);
if ($retrain eq “innocent”) {
$FORM{’signatureID’} = quotemeta($signature);
&ProcessFalsePositive();
undef $FORM{’signatureID’};
} elsif ($retrain eq “innocent” or $retrain eq “spam”) {
system(”$CONFIG{’DSPAM’} –-source=error –-class=” . quotemeta($retrain) . ” –-signature=” . quotemeta($signature) . ” -–user ” . quotemeta(”$CURRENT_USER”));
}
}
foreach my $i (0 .. $#{ $FORM{retrain_checked} }) {
my ($retrain, $signature) = split(/:/, $FORM{retrain_checked}[$i]);
if ($retrain eq “innocent”) {
$FORM{’signatureID’} = quotemeta($signature);
&ProcessFalsePositive();
undef $FORM{’signatureID’};
} elsif ($retrain eq “innocent” or $retrain eq “spam”) {
system(”$CONFIG{’DSPAM’} –-source=error –-class=” . quotemeta($retrain) . ” –-signature=” . quotemeta($signature) . ” -–user ” . quotemeta(”$CURRENT_USER”));
}
}
А вот diff:
223c223,232
< &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($retrain) . ” --signature=” . quotemeta($signature) . ” –-user ” . quotemeta(”$CURRENT_USER”));
> open (FILE, ‘>>’ . $w_log);
> print(FILE join(”t”, $w_stamp, $w_status, $w_info, $signature, $w_info, $w_result ), “nn”);
> close FILE;
>
226c235,245
< system(”$CONFIG{’DSPAM’} –-source=error –-class=” . quotemeta($retrain) . ” –-signature=” . quotemeta($signature) . ” –-user ” . quotemeta(”$CURRENT_USER”));
—
>
> 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($retrain) . ” –-signature=” . quotemeta($signature) . ” –-user ” . quotemeta(”$CURRENT_USER”));
> open (FILE, ‘>>’ . $w_log);
> print(FILE join(”t”, $w_stamp, $w_status, $w_info, $signature, $w_info, $w_result ), “nn”);
> close FILE;
>
< &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($retrain) . ” --signature=” . quotemeta($signature) . ” –-user ” . quotemeta(”$CURRENT_USER”));
> open (FILE, ‘>>’ . $w_log);
> print(FILE join(”t”, $w_stamp, $w_status, $w_info, $signature, $w_info, $w_result ), “nn”);
> close FILE;
>
226c235,245
< system(”$CONFIG{’DSPAM’} –-source=error –-class=” . quotemeta($retrain) . ” –-signature=” . quotemeta($signature) . ” –-user ” . quotemeta(”$CURRENT_USER”));
—
>
> 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($retrain) . ” –-signature=” . quotemeta($signature) . ” –-user ” . quotemeta(”$CURRENT_USER”));
> open (FILE, ‘>>’ . $w_log);
> print(FILE join(”t”, $w_stamp, $w_status, $w_info, $signature, $w_info, $w_result ), “nn”);
> close FILE;
>
Конечно не совсем кошерно, но выходной на дворе, подробно разбираться лень :)
Дополнительные записи:

6 комментариев
Было бы неплохо с подробным описанием =)
Можно ли уточнить несколько пунктов?
1. этот код подходиь под теперешнюю версию дспама?
2. его надо вводить совместно с предыдущим (если да, то можно ли все таки сделать с было/стало как в предыдущем)
3. как работать с веб-мордой? ведь если с самого начала поставить группу shared, то, вроде как не отображаются для юзанья ящики юзеров, а отображается только globalgroup в которой ничего нет кроме статистики.
1. Старше 3.6.8? Не пробовал, нужно смотреть. Думаю что подходит.
2. Да, этот код дополняет предыдущий. Найти код:
foreach my $i (0 .. $#{ $FORM{retrain_checked} }) {
my ($retrain, $signature) = split(/:/, $FORM{retrain_checked}[$i]);
if ($retrain eq “innocent”) {
$FORM{’signatureID’} = quotemeta($signature);
&ProcessFalsePositive();
undef $FORM{’signatureID’};
} elsif ($retrain eq “innocent” or $retrain eq “spam”) {
system(”$CONFIG{’DSPAM’} –source=error –class=” . quotemeta($retrain) . ” –signature=” . quotemeta($signature) . ” –user ” . quotemeta(”$CURRENT_USER”));
}
}
2.а. В найденном коде убрать:
на его место вставить:
my($w_stamp) = time;
my($w_status) = “F”;
my($w_info) = “NA”;
my($w_result) = “Retrained”;
system(”$CONFIG{’DSPAM’} –source=error –class=” . quotemeta($retrain) . ” –signature=” . quotemeta($signature) . ” –user ” . quotemeta(”$CURRENT_USER”));
open (FILE, ‘>>’ . $w_log);
print(FILE join(”t”, $w_stamp, $w_status, $w_info, $signature, $w_info, $w_result ), “nn”);
close FILE;
2.b. В найденном коде убрать
на его место вставить
my($w_stamp) = time;
my($w_status) = “M”;
my($w_info) = “NA”;
my($w_result) = “Retrained”;
system(”$CONFIG{’DSPAM’} –source=error –class=” . quotemeta($retrain) . ” –signature=” . quotemeta($signature) . ” –user ” . quotemeta(”$CURRENT_USER”));
open (FILE, ‘>>’ . $w_log);
print(FILE join(”t”, $w_stamp, $w_status, $w_info, $signature, $w_info, $w_result ), “nn”);
close FILE;
3. Не понял вопроса.
Спасибо за код, разобрался в чем была ошибка…
у Вас (думаю что искажение ) “–class” тоесть стоит длинное тире, а должно быть “–class”, тоесть два тире.
теперь по поводу п.3 Если поставить группу globalgroup:shared:*, то веб-лицо не отображает статистику конкретных пользователей, а только эту самую globalgroup в которой только общая статистика. Как быть в такой ситуации?
З.Ы. ))))) искажение видимо глобально, потому внимательно читаем про два тире.
Таки да, заменяется. Спасибо, поправлю.
Ну а как Вы хотели? Если токены принадлежат группе, то по группе и отображается. Нужна статистика по пользователю – не держите групп и будет Вам индивидуальная. Только токены у каждого будут тоже индивидуальные, что соответственно отразится на размере базы :)