Re: [dspam-users] Problem with history (web interface)

From: Kyle Johnson <kjohnson@fixertec.net>
Date: Sat Jan 21 2006 - 21:45:32 EST

/me is new to cgi/whatever.
Do I just replace the contents of the current dspam.cgi with this?
And if so, can you attach the modified file, because what you sent has a
bunch of < on each line (unless those are supposed to be there)
Thank you!
Kyle

Aaron Wolfe wrote:
> Ok, below is the "patch" for dspam.cgi.. its more a rewrite of the
> DisplayHistory sub.
> It works for me, I hope it works for anyone else that is bothered by
> the issues with the current webui history page.
> If you find errors or know a better way to do this, please let me know.
>
> -Aaron
>
>
> 186,188d185
> < if ($CONFIG{'HISTORY_PER_PAGE'} > 0) {
> <
> < $history_site = 1 if $history_site eq "";
> 190,196c187
> < open(LINES,"wc -l $LOG|");
> < while (<LINES>){
> < chomp;
> < s/^ +//;
> < if (/([0-9]*)/) { $all_lines = $1; }
> < }
> < close (LINES);
> ---
> > $history_site = 1 if $history_site eq "";
> 198,199c189
> < $end = $all_lines - (($history_site-1) *
> $CONFIG{'HISTORY_PER_PAGE'});
> < $begin = $end - $CONFIG{'HISTORY_PER_PAGE'} + 1 ;
> ---
> > #read through entire log
> 201,205c191
> < if ($begin < 0) {
> < $begin = 1;
> < } elsif ($begin < $all_lines - $CONFIG{'HISTORY_SIZE'} -
> $CONFIG{'HISTORY_PER_PAGE'}) {
> < $begin = $all_lines - $CONFIG{'HISTORY_SIZE'} + 1;
> < }
> ---
> > open (LOG,"< $LOG");
> 207,213c193,194
> < if ($all_lines < $CONFIG{'HISTORY_PER_PAGE'}) {
> < $history_pages = 1;
> < } elsif ($all_lines > $CONFIG{'HISTORY_SIZE'}) {
> < $history_pages = ($CONFIG{'HISTORY_SIZE'} +
> $CONFIG{'HISTORY_PER_PAGE'}) / $CONFIG{'HISTORY_PER_PAGE'};
> < } else {
> < $history_pages = $all_lines / $CONFIG{'HISTORY_PER_PAGE'};
> < }
> ---
> > while ($line = <LOG>) {
> > my($time, $class, $from, $signature, $subject, $info,
> $messageid) = split(/\t/, $line);
> 215,216c196,199
> < open(LOG, "sed -n \'$begin,$end\p\' $LOG|");
> < }
> ---
> > if ($signature eq "") {
> > warn "no sig?: $line";
> > warn "time: $time class: $class from: $from sig: $signature
> subj: $subject info: $info msgid: $messageid";
> > } #when/why/does this happen? am i totally lost?
> 218,221c201
> < while(<LOG>) {
> < push(@buffer, $_);
> < }
> < close(LOG);
> ---
> > if ($class eq "M" || $class eq "F" || $class eq "E") {
> 222a203
> > # process retrains and errors (should always occur after
> original message)
> 224,237c205,213
> < # Preseed retraining information and delivery errors
> <
> < foreach $line (@buffer) {
> < my($time, $class, $from, $signature, $subject, $info, $messageid)
> < = split(/\t/, $line);
> < next if ($signature eq "");
> < if ($class eq "M" || $class eq "F" || $class eq "E") {
> < if ($class eq "E") {
> < $rec{$signature}->{'info'} = $info;
> < } elsif ($class eq "F" || $class eq "M") {
> < $rec{$signature}->{'class'} = $class;
> < $rec{$signature}->{'info'} = $info
> < if ($rec{$signature}->{'info'} eq "");
> < }
> ---
> > unless (defined($rec{$signature})) { warn("where is msg for
> $signature ?"); next; }
> > if ($class eq "E") {
> > $rec{$signature}->{'info'} = $info;
> > } else {
> > $rec{$signature}->{'info'} = $info;
> > $rec{$signature}->{'retrain'} = "<b>Retrained</b>";
> > $rec{$signature}->{'rclass'} = "spam" if
> ($rec{$signature}->{'class'} eq "I" || $rec{$signature}->{'class'} eq
> "W");
> > $rec{$signature}->{'rclass'} = "innocent" if
> ($rec{$signature}->{'class'} eq "S");
> > $rec{$signature}->{'class'} = $class;
> 239c215
> < }
> ---
> > } else {
> 241,261c217
> < while($line = shift(@buffer)) {
> < chomp($line);
> < my($time, $class, $from, $signature, $subject, $info, $messageid)
> < = split(/\t/, $line);
> < next if ($signature eq "");
> < next if ($rec{$signature}->{'displayed'} ne "");
> < next if ($class eq "E");
> < $rec{$signature}->{'displayed'} = 1;
> <
> < # Resends of retrained messages will need the original
> from/subject line
> < if ($messageid ne "") {
> < $from = $rec{$messageid}->{'from'}
> < if ($from eq "<None Specified>");
> < $subject = $rec{$messageid}->{'subject'}
> < if ($subject eq "<None Specified>");
> <
> < $rec{$messageid}->{'from'} = $from
> < if ($rec{$messageid}->{'from'} eq "");
> < $rec{$messageid}->{'subject'} = $subject
> < if ($rec{$messageid}->{'subject'} eq "");
> < }
> ---
> > # process messages
> 266,294d221
> < my($ctime) = ctime($time);
> < my(@t) = split(/\:/, (split(/\s+/, $ctime))[3]);
> < my($x) = (split(/\s+/, $ctime))[0];
> < my($m) = "a";
> < if ($t[0]>12) { $t[0] -= 12; $m = "p"; }
> < if ($t[0] == 0) { $t[0] = 12; }
> < $ctime = "$x $t[0]:$t[1]$m";
> <
> < # Set the appropriate type and label for this message
> <
> < my($cl, $cllabel);
> < $class = $rec{$signature}->{'class'} if
> ($rec{$signature}->{'class'} ne "");
> < if ($class eq "S") { $cl = "spam"; $cllabel="SPAM"; }
> < elsif ($class eq "I") { $cl = "innocent"; $cllabel="Good"; }
> < elsif ($class eq "F") { $cl = "false"; $cllabel="Miss"; }
> < elsif ($class eq "M") { $cl = "missed"; $cllabel="Miss"; }
> < elsif ($class eq "N") { $cl = "inoculation"; $cllabel="Spam"; }
> < elsif ($class eq "C") { $cl = "blacklisted"; $cllabel="RBL"; }
> < elsif ($class eq "W") { $cl = "whitelisted"; $cllabel="Whitelist"; }
> < if ($messageid ne "") {
> < if ($rec{$messageid}->{'resend'} ne "") {
> < $cl = "relay";
> < $cllabel = "Resend";
> < }
> < $rec{$messageid}->{'resend'} = $signature;
> < }
> <
> < $info = $rec{$signature}->{'info'} if
> ($rec{$signature}->{'info'} ne "");
> <
> 302d228
> < $time = sprintf("%01.2f", $time);
> 304,310c230,266
> < my($retrain);
> < if ($rec{$signature}->{'class'} =~ /^(M|F)$/) {
> < $retrain = "<b>Retrained</b>";
> < } else {
> < my($rclass);
> < $rclass = "spam" if ($class eq "I" || $class eq "W");
> < $rclass = "innocent" if ($class eq "S");
> ---
> > $rec{$signature}->{'from'} = $from;
> > $rec{$signature}->{'subject'} = $subject;
> > $rec{$signature}->{'time'} = $time;
> > $rec{$signature}->{'class'} = $class;
> > $rec{$signature}->{'info'} = $info;
> > $rec{$signature}->{'rclass'} = "spam" if
> ($rec{$signature}->{'class'} eq "I" || $rec{$signature}->{'class'} eq
> "W");
> > $rec{$signature}->{'rclass'} = "innocent" if
> ($rec{$signature}->{'class'} eq "S");
> > $rec{$signature}->{'retrain'} = qq!<A
> HREF="$CONFIG{'ME'}?template=$FORM{'template'}&user=$FORM{'user'}&retrain=$rec{$signature}->{'rclass'}&signatureID=$signature&history_site=$history_site">As
> ! . ucfirst($rec{$signature}->{'rclass'}) . "</A>";
> > }
> > }
> > close(LOG);
> >
> > $all_lines = (keys %rec);
> >
> > my($key,$dnum);
> > $dnum = 0;
> >
> > foreach $key (sort { $rec{$a}->{'time'} cmp $rec{$b}->{'time'} }
> keys %rec) {
> >
> > #only show current page
> > $dnum++;
> > next unless (($dnum <= (keys(%rec) - $CONFIG{'HISTORY_PER_PAGE'}
> * ($history_site - 1)))
> > && ($dnum > (keys(%rec) - $CONFIG{'HISTORY_PER_PAGE'} *
> $history_site)));
> >
> > my($cl, $cllabel, $class);
> > $class = $rec{$key}->{'class'};
> >
> > if ($class eq "S") { $cl = "spam"; $cllabel="SPAM"; }
> > elsif ($class eq "I") { $cl = "innocent"; $cllabel="Good"; }
> > elsif ($class eq "F") { $cl = "false"; $cllabel="Miss"; }
> > elsif ($class eq "M") { $cl = "missed"; $cllabel="Miss"; }
> > elsif ($class eq "N") { $cl = "inoculation"; $cllabel="Spam"; }
> > elsif ($class eq "C") { $cl = "blacklisted"; $cllabel="RBL"; }
> > elsif ($class eq "W") { $cl = "whitelisted";
> $cllabel="Whitelist"; }
> >
> > my($ctime) = ctime($rec{$key}->{'time'});
> > my(@t) = split(/\:/, (split(/\s+/, $ctime))[3]);
> 312,316c268,278
> < if ($rclass ne "") {
> < $retrain = qq!<A
> HREF="$CONFIG{'ME'}?template=$FORM{'template'}&user=$FORM{'user'}&retrain=$rclass&signatureID=$signature">As
> ! . ucfirst($rclass) . "</
> < A>";
> < }
> < }
> ---
> > #show dates on messages older than 1 week
> > my($x);
> > if ($rec{$key}->{'time'} < (time - 604800)) {
> > $x = (split(/\s+/, $ctime))[1] . " " . (split(/\s+/, $ctime))[2];
> > }
> > else { $x = (split(/\s+/, $ctime))[0]; }
> >
> > my($m) = "a";
> > if ($t[0]>12) { $t[0] -= 12; $m = "p"; }
> > if ($t[0] == 0) { $t[0] = 12; }
> > $ctime = "$x $t[0]:$t[1]$m";
> 318c280
> < my($entry) = <<_END;
> ---
> > my($entry) = <<_END;
> 320,325c282,287
> < <td class="$cl $rowclass" nowrap="true"><small>$cllabel</td>
> < <td class="$rowclass" nowrap="true"><small>$retrain</td>
> < <td class="$rowclass" nowrap="true"><small>$ctime</td>
> < <td class="$rowclass" nowrap="true"><small>$from</td>
> < <td class="$rowclass" nowrap="true"><small>$subject</td>
> < <td class="$rowclass" nowrap="true"><small>$info</td>
> ---
> > <td class="$cl $rowclass" nowrap="true"><small>$cllabel</td>
> > <td class="$rowclass"
> nowrap="true"><small>$rec{$key}->{'retrain'}</td>
> > <td class="$rowclass" nowrap="true"><small>$ctime</td>
> > <td class="$rowclass"
> nowrap="true"><small>$rec{$key}->{'from'}</td>
> > <td class="$rowclass"
> nowrap="true"><small>$rec{$key}->{'subject'}</td>
> > <td class="$rowclass"
> nowrap="true"><small>$rec{$key}->{'info'}</td>
> 328c290
> < push(@history, $entry);
> ---
> > push(@history, $entry);
> 330,334c292,296
> < if ($rowclass eq "rowEven") {
> < $rowclass = "rowOdd";
> < } else {
> < $rowclass = "rowEven";
> < }
> ---
> > if ($rowclass eq "rowEven") {
> > $rowclass = "rowOdd";
> > } else {
> > $rowclass = "rowEven";
> > }
> 339a302
> > # add page selection html
> 340a304,312
> >
> > if ($all_lines < $CONFIG{'HISTORY_PER_PAGE'}) {
> > $history_pages = 1;
> > } elsif ($all_lines > $CONFIG{'HISTORY_SIZE'}) {
> > $history_pages = ($CONFIG{'HISTORY_SIZE'} +
> $CONFIG{'HISTORY_PER_PAGE'}) / $CONFIG{'HISTORY_PER_PAGE'};
> > } else {
> > $history_pages = $all_lines / $CONFIG{'HISTORY_PER_PAGE'};
> > }
> >
> 351a324
> >
>
> On 1/20/06, *Kyle Johnson* <kjohnson@fixertec.net
> <mailto:kjohnson@fixertec.net>> wrote:
>
> This sounds good. How do we get a hold of it?
>
> Kyle Johnson
> Fixertec <http://www.fixertec.net/> - Dynamic Computer and
> Technology Solutions
> 410-609-4191
>
>
>
> Aaron Wolfe wrote:
>> In a nutshell, rather than try to paginate by only viewing
>> portions of the log (which is hopeless), it reads the entire log
>> and creates a hash structure which identifies the correct current
>> status of each and every message once the entire log has been
>> processed. Then it displays only the correct portion of the hash
>> according to the "page" you're on.
>>
>> The obvious drawback is that more memory and processing time is
>> used, but I think it's going to have to be, since theoretically
>> the more recent log entry could be a retrain of the oldest message.
>>
>> In practice, it add no observable load to my server with ~100
>> users, but the increase might become noticeable on a huge
>> installation... dunno :)
>>
>> -Aaron
>>
>>
>>
>>
>> On 1/20/06, *Kyle Johnson* <kjohnson@fixertec.net
>> <mailto:kjohnson@fixertec.net>> wrote:
>>
>> What changes does this make?
>>
>> Kyle Johnson
>> Fixertec <http://www.fixertec.net/> - Dynamic Computer and
>> Technology Solutions
>> 410-609-4191
>>
>>
>>
>> Aaron Wolfe wrote:
>>> I have a fixed version of the cgi that I've given to a few
>>> people and sent to Jon... actually a few months ago. The
>>> problem is that the entire logic of the "paging" is broken,
>>> so its not just a patch but rather a replacement of the
>>> whole section of code. I'm not sure that my version is the
>>> best way to do things either, but it does take into account
>>> that fact that retrain events effecting a particular message
>>> are not neccesarily found nearby in the log.
>>> The fix is based on a 3.6 prerelease version, I'd be happy
>>> to integrate it into the current cgi if anyone is interested.
>>>
>>> -Aaron
>>>
>>>
>>> On 1/20/06, *Kyle Johnson* <kjohnson@fixertec.net
>>> <mailto:kjohnson@fixertec.net>> wrote:
>>>
>>> We hear you :)
>>> This has been discussed a lot in #dspam, as well as a
>>> few times here on the mailing list.... The WebUI does
>>> need a rewrite, however Jon in a busy man, so it's going
>>> to fall into our hands to do this (most likely)
>>> Until then, it's best to keep up on the training, so you
>>> won't have to remember that much, and to open trained
>>> links in a new tab (ctrl+click) in firefox, as it saves
>>> a lot of time.
>>>
>>> Kyle Johnson
>>> Fixertec <http://www.fixertec.net/> - Dynamic Computer
>>> and Technology Solutions
>>> 410-609-4191
>>>
>>>
>>>
>>> Pierre Girard wrote:
>>>> Kyle Johnson wrote:
>>>>
>>>>> Right now, the problem with the history of the WebUI
>>>>> is that when you click retrain on page > 2, you get
>>>>> sent back to page one. When you go back to page > 2,
>>>>> the message hasn't changed.
>>>>> This is only a visual bug, and the retraining should
>>>>> have still taken place...
>>>>
>>>> Yes that's the problem i have. I know it's some sort
>>>> of visual bug but given the amount of email and spam i
>>>> receive everyday it's still confusing not to be able to
>>>> determine if i trained the message or not since i have
>>>> to rescan the whole thing everytime and often have the
>>>> same spam more than once. I often end up retraining
>>>> the same message multiple times.
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>
>
Received on Sat Jan 21 21:47:16 2006

This archive was generated by hypermail 2.1.8 : Sun Jan 22 2006 - 00:00:01 EST