source: npl/mailserver/dspam/dspam-3.10.2/webui/cgi-bin/admin.cgi @ c5c522c

gcc484ntopperl-5.22
Last change on this file since c5c522c was c5c522c, checked in by Edwin Eefting <edwin@datux.nl>, 8 years ago

initial commit, transferred from cleaned syn3 svn tree

  • Property mode set to 100755
File size: 29.3 KB
Line 
1#!/usr/bin/perl
2
3# $Id: admin.cgi,v 1.25 2011/06/28 00:13:48 sbajic Exp $
4# DSPAM
5# COPYRIGHT (C) 2002-2012 DSPAM PROJECT
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
20use strict;
21use Time::Local;
22use vars qw { %CONFIG %DATA %FORM %LANG $LANGUAGE };
23
24#
25# Read configuration parameters common to all CGI scripts
26#
27if (!(-e "configure.pl") || !(-r "configure.pl")) {
28  &htmlheader;
29  print "<html><head><title>Error!</title></head><body bgcolor='white' text='black'><center><h1>";
30  print "Missing file configure.pl";
31  print "</h1></center></body></html>\n";
32  exit;
33}
34require "configure.pl";
35
36#
37# The current CGI script
38#
39
40$CONFIG{'ME'}               = "admin.cgi";
41
42#
43# Parse form
44#
45
46%FORM = &ReadParse;
47
48#
49# Configure languages
50#
51
52if ($FORM{'language'} ne "") {
53  $LANGUAGE = $FORM{'language'};
54} else {
55  $LANGUAGE = $CONFIG{'LANGUAGE_USED'};
56}
57if (! defined $CONFIG{'LANG'}->{$LANGUAGE}->{'NAME'}) {
58  $LANGUAGE = $CONFIG{'LANGUAGE_USED'};
59}
60my @dslanguages = ();
61for (split(/\n/,$CONFIG{'LANGUAGES'})) {
62  my $lang = $_;
63  $lang =~ s/\s*selected>/>/;
64  if ($lang =~ /value="([^"]+)"/) {
65    $lang =~ s/>/ selected>/ if ($1 eq $LANGUAGE);
66  }
67  push(@dslanguages, $lang);
68}
69$CONFIG{'LANGUAGES'} = join("\n", @dslanguages);
70$CONFIG{'TEMPLATES'} = $CONFIG{'LANG'}->{$LANGUAGE}->{'TEMPLATEDIR'};
71
72#
73# Check Permissions
74#
75do {
76  my($admin) = 0;
77  open(FILE, "<./admins");
78  while(<FILE>) {
79    chomp;
80    if ($_ eq $ENV{'REMOTE_USER'}) {
81      $admin = 1;
82      last;
83    }
84  }
85  close(FILE);
86  if (!$admin) {
87    &error("$CONFIG{'LANG'}->{$LANGUAGE}->{'error_access_denied'}");
88  }
89};
90
91$| = 1;
92
93#
94# Determine which extensions are available
95#
96                                                                               
97if ($CONFIG{'AUTODETECT'} == 1 || $CONFIG{'AUTODETECT'} eq "") {
98  $CONFIG{'PREFERENCES_EXTENSION'} = 0;
99  $CONFIG{'LARGE_SCALE'} = 0;
100  $CONFIG{'DOMAIN_SCALE'} = 0;
101  do {
102    my $x = `$CONFIG{'DSPAM'} --version`;
103    if ($x =~ /--enable-preferences-extension/) {
104      $CONFIG{'PREFERENCES_EXTENSION'} = 1;
105    }
106    if ($x =~ /--enable-large-scale/) {
107      $CONFIG{'LARGE_SCALE'} = 1;
108    }
109    if ($x =~ /--enable-domain-scale/) {
110      $CONFIG{'DOMAIN_SCALE'} = 1;
111    }
112  };
113}
114
115if ($ENV{'REMOTE_USER'} eq "") {
116  &error("$CONFIG{'LANG'}->{$LANGUAGE}->{'error_no_identity'}");
117}
118
119if ($FORM{'template'} eq "" || $FORM{'template'} !~ /^([A-Z0-9]*)$/i) {
120  $FORM{'template'} = "status";
121}
122
123#
124# Set up initial display variables
125#
126$DATA{'REMOTE_USER'} = $ENV{'REMOTE_USER'};
127
128#
129# Display DSPAM Version
130#
131$DATA{'DSPAMVERSION'} = $CONFIG{'DSPAM_VERSION'};
132
133#
134# Process Commands
135#
136
137# Status
138if ($FORM{'template'} eq "status") {
139  &DisplayStatus;
140
141# User Statistics
142
143} elsif ($FORM{'template'} eq "user") {
144  &DisplayUserStatistics;
145
146# Preferences
147} elsif ($FORM{'template'} eq "preferences") {
148  &DisplayPreferences;
149}
150
151&error("$CONFIG{'LANG'}->{$LANGUAGE}->{'error_invalid_command'} $FORM{'COMMAND'}");
152
153#
154# Preferences Functions
155#
156
157sub DisplayPreferences {
158  my(%PREFS, $FILE, $USER);
159
160  if ($FORM{'username'} eq "") {
161    $USER = "default";
162  } else {
163    $USER = $FORM{'username'};
164  }
165
166  $DATA{'USERNAME'} = $USER;
167
168  if ($FORM{'username'} eq "") {
169    $FILE = "./default.prefs";
170    if ($CONFIG{'PREFERENCES_EXTENSION'} != 1 && ! -l "$CONFIG{'DSPAM_HOME'}/default.prefs") {
171      $DATA{'ERROR'} = "<em>WARNING:</em> " .
172        "These default preferences will not be loaded by DSPAM, but only by ".
173        " the CGI interface when a user initially sets up their preferences. ".
174        "To have DSPAM override its configuration with these default ".
175        "preferences, symlink $CONFIG{'DSPAM_HOME'}/default.prefs to the ".
176        "default.prefs file in the CGI directory.<BR><BR>";
177    }
178  } else {
179    $FILE = GetPath($FORM{'username'}) . ".prefs";
180  }
181
182  if ($FORM{'submit'} ne "") {
183
184    if ($FORM{'enableBNR'} ne "on") {
185      $FORM{'enableBNR'} = "off";
186    }
187                                                                               
188    if ($FORM{'optIn'} ne "on") {
189      $FORM{'optIn'} = "off";
190    }
191
192    if ($FORM{'optOut'} ne "on") {
193      $FORM{'optOut'} = "off";
194    }
195
196    if ($FORM{'enableWhitelist'} ne "on") {
197      $FORM{'enableWhitelist'} = "off";
198    }
199
200    if ($FORM{'showFactors'} ne "on") {
201      $FORM{'showFactors'} = "off";
202    }
203    if ($FORM{'dailyQuarantineSummary'} ne "on") {
204      $FORM{'dailyQuarantineSummary'} = "off";
205    }
206
207    if ($CONFIG{'PREFERENCES_EXTENSION'} == 1) {
208
209      if ($FORM{'spamSubject'} eq "") {
210        $FORM{'spamSubject'} = "''";
211      } else {
212        $FORM{'spamSubject'} = quotemeta($FORM{'spamSubject'});
213      }
214
215      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
216        "' trainingMode " . quotemeta($FORM{'trainingMode'}) . " > /dev/null");
217      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
218        "' spamAction " . quotemeta($FORM{'spamAction'}) . " > /dev/null");
219      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
220        "' signatureLocation "
221        . quotemeta($FORM{'signatureLocation'}) . " > /dev/null");
222      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
223        "' spamSubject " . $FORM{'spamSubject'} . " > /dev/null");
224      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
225        "' statisticalSedation "
226        . quotemeta($FORM{'statisticalSedation'}) . " > /dev/null");
227      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
228        "' enableBNR "
229        . quotemeta($FORM{'enableBNR'}) . "> /dev/null");
230      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
231        "' optOut "
232        . quotemeta($FORM{'optOut'}) . ">/dev/null");
233      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
234        "' optIn "
235        . quotemeta($FORM{'optIn'}) . ">/dev/null");
236      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
237        "' showFactors "
238        . quotemeta($FORM{'showFactors'}) . "> /dev/null");
239      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
240        "' enableWhitelist "
241        . quotemeta($FORM{'enableWhitelist'}) . "> /dev/null");
242      system("$CONFIG{'DSPAM_BIN'}/dspam_admin ch pref '".quotemeta($USER).
243        "' dailyQuarantineSummary "
244        . quotemeta($FORM{'dailyQuarantineSummary'}) . "> /dev/null");
245
246    } else {
247      open(FILE, ">$FILE") || do { &error("$CONFIG{'LANG'}->{$LANGUAGE}->{'error_cannot_write_prefs'}: $!"); };
248      print FILE <<_END;
249trainingMode=$FORM{'trainingMode'}
250spamAction=$FORM{'spamAction'}
251spamSubject=$FORM{'spamSubject'}
252statisticalSedation=$FORM{'statisticalSedation'}
253enableBNR=$FORM{'enableBNR'}
254enableWhitelist=$FORM{'enableWhitelist'}
255signatureLocation=$FORM{'signatureLocation'}
256showFactors=$FORM{'showFactors'}
257dailyQuarantineSummary=$FORM{'dailyQuarantineSummary'}
258_END
259      close(FILE);
260    }
261  }
262
263  if (! -e $FILE) {
264    %PREFS = GetPrefs($USER, "./default.prefs");
265  } else {
266    %PREFS = GetPrefs($USER, $FILE);
267  }
268
269  $DATA{"SEDATION_$PREFS{'statisticalSedation'}"} = "CHECKED";
270  $DATA{"S_".$PREFS{'trainingMode'}} = "CHECKED";
271  $DATA{"S_LOC_".uc($PREFS{'signatureLocation'})} = "CHECKED";
272  $DATA{"S_ACTION_".uc($PREFS{'spamAction'})} = "CHECKED";
273  $DATA{"SPAM_SUBJECT"} = $PREFS{'spamSubject'};
274  if ($PREFS{'optIn'} eq "on") {
275    $DATA{'C_OPTIN'} = "CHECKED";
276  }
277  if ($PREFS{'optOut'} eq "on") {
278    $DATA{'C_OPTOUT'} = "CHECKED";
279  }
280
281  if ($PREFS{"enableBNR"} eq "on") {
282    $DATA{"C_BNR"} = "CHECKED";
283  }
284  if ($PREFS{"showFactors"} eq "on") {
285    $DATA{"C_FACTORS"} = "CHECKED";
286  }
287  if ($PREFS{"enableWhitelist"} eq "on") {
288    $DATA{"C_WHITELIST"} = "CHECKED";
289  }
290  if ($PREFS{"dailyQuarantineSummary"} eq "on") {
291    $DATA{"C_SUMMARY"} = "CHECKED";
292  }
293
294
295  &output(%DATA);
296}
297
298#
299# User Statistics
300#
301
302sub DisplayUserStatistics {
303  my($b) = "rowEven";
304
305  my ($sl_total) = 0;
306  my ($il_total) = 0;
307  my ($sm_total) = 0;
308  my ($fp_total) = 0;
309  my ($sc_total) = 0;
310  my ($ic_total) = 0;
311  my ($mailbox_total) = 0;
312 
313  open(IN, "$CONFIG{'DSPAM_STATS'}|");
314  while(<IN>) {
315    chomp;
316    if ($b eq "rowEven") {
317      $b = "rowOdd";
318    } else {
319      $b = "rowEven";
320    }
321    s/:/ /g;
322    # sl = Spam Learned = TP True Positives
323    # il = Innocent Learned = TN True Negatives
324    # fp = False Positive = FP False Positives
325    # sm = Spam Missed = FN False Negatives
326    # sc = Spam Corpusfed = SC Spam Corpusfed
327    # ic = Innocent Corpusfed = NC Nonspam Corpusfed
328    my($username, $sl, $il, $fp, $sm, $sc, $ic) = (split(/\s+/))[0,2,4,6,8,10,12];
329    if ($sl eq "") {
330      $_ = <IN>;
331      s/:/ /g;
332      ($sl, $il, $fp, $sm, $sc, $ic) = (split(/\s+/))[2,4,6,8,10,12];
333    }
334
335    my(%PREFS) = GetPrefs($username, GetPath($username).".prefs");
336    $PREFS{'enableBNR'} = "OFF" if ($PREFS{'enableBNR'} ne "on");
337    $PREFS{'enableWhitelist'} = "OFF" if ($PREFS{'enableWhitelist'} ne "on");
338    $PREFS{'spamAction'} = ucfirst($PREFS{'spamAction'});
339    $PREFS{'enableBNR'} = uc($PREFS{'enableBNR'});
340    $PREFS{'enableWhitelist'} = uc($PREFS{'enableWhitelist'});
341     
342    my($mailbox) = GetPath($username).".mbox";
343    my($mailbox_size, $mailbox_display);
344    if ( -e $mailbox ) {
345        $mailbox_size = -s $mailbox;
346        $mailbox_display = sprintf("%2.1f KB", ($mailbox_size / 1024));
347        $mailbox_total += $mailbox_size;
348    }
349    else {
350        $mailbox_display = "--";
351    }
352   
353    $sl_total += $sl;
354    $il_total += $il;
355    $sm_total += $sm;
356    $fp_total += $fp;
357    $sc_total += $sc;
358    $ic_total += $ic;
359   
360    $DATA{'TABLE'} .= qq!<tr><td class=\"$b\"><a href="$CONFIG{'DSPAM_CGI'}?user=$username">$username</A></td>!.
361                      " <td class=\"$b rowDivider\" align=\"right\">$mailbox_display</td>".
362                      " <td class=\"$b rowDivider\">$sl</td>".
363                      " <td class=\"$b\">$il</td>".
364                      " <td class=\"$b\">$fp</td>".
365                      " <td class=\"$b\">$sm</td>".
366                      " <td class=\"$b\">$sc</td>".
367                      " <td class=\"$b\">$ic</td>".
368                      " <td class=\"$b rowDivider\">$PREFS{'trainingMode'}</td>".
369                      " <td class=\"$b\">$PREFS{'spamAction'}</td>".
370                      " <td class=\"$b\">$PREFS{'enableBNR'}</td>".
371                      " <td class=\"$b\">$PREFS{'enableWhitelist'}</td>".
372                      " <td class=\"$b\">$PREFS{'statisticalSedation'}</td>".
373                      " <td class=\"$b\">$PREFS{'signatureLocation'}</td>".
374                      "</tr>\n";
375  }
376  close(IN);
377
378  my($mailbox_total_display) = sprintf("%2.1f KB", ($mailbox_total / 1024));
379
380  $b = "rowHighlight";
381  $DATA{'TABLE'} .= "<tr><td class=\"$b\">Total</td>".
382                    "   <td class=\"$b rowDivider\" align=\"right\">$mailbox_total_display</td>".
383                    "   <td class=\"$b rowDivider\">$sl_total</td>".
384                    "   <td class=\"$b\">$il_total</td>".
385                    "   <td class=\"$b\">$fp_total</td>".
386                    "   <td class=\"$b\">$sm_total</td>".
387                    "   <td class=\"$b\">$sc_total</td>".
388                    "   <td class=\"$b\">$ic_total</td>".
389                    "   <td class=\"$b rowDivider\">&nbsp;</td>".
390                    "   <td class=\"$b\">&nbsp;</td>".
391                    "   <td class=\"$b\">&nbsp;</td>".
392                    "   <td class=\"$b\">&nbsp;</td>".
393                    "   <td class=\"$b\">&nbsp;</td>".
394                    "   <td class=\"$b\">&nbsp;</td>".
395                   "</tr>\n";
396
397  &output(%DATA);
398}
399
400#
401# Status Functions
402#
403
404sub DisplayStatus {
405  my($LOG) = "$CONFIG{'DSPAM_HOME'}/system.log";
406  my(@spam_daily, @nonspam_daily, @period_daily, @fp_daily, @sm_daily,
407     @inoc_daily, @whitelist_daily, @corpus_daily, @virus_daily,
408     @black_daily, @block_daily);
409  my(@spam_weekly, @nonspam_weekly, @period_weekly, @fp_weekly, @sm_weekly,
410     @inoc_weekly, @whitelist_weekly, @corpus_weekly, @virus_weekly,
411     @black_weekly, @block_weekly);
412  my(%msgpersecond);
413  my($keycount_exectime);
414  my($last_message);
415  my(%classes);
416
417  my ($min, $hour, $mday, $mon, $year) = (localtime(time))[1,2,3,4,5];
418  my ($hmstart) = time - 60;
419  my ($daystart) = timelocal(0, 0, 0, $mday, $mon, $year);
420  my ($periodstart) = $daystart - (3600*24*24); # 2 Weeks ago
421  my ($dailystart) = time - (3600*23);
422  my ($c_weekly) = 0; # Cursor to most recent time slot
423  my ($c_daily) = 0;
424
425  if (! -e $LOG) {
426    &error("$CONFIG{'LANG'}->{$LANGUAGE}->{'error_no_historic'}");
427  }
428
429  # Initialize each individual time period
430
431  for(0..23) {
432    my($h) = To12Hour($hour-(23-$_));
433    $period_daily[$_]           = $h;
434    $spam_daily[$_]             = 0;
435    $nonspam_daily[$_]          = 0;
436    $sm_daily[$_]               = 0;
437    $fp_daily[$_]               = 0;
438    $inoc_daily[$_]             = 0;
439    $whitelist_daily[$_]        = 0;
440    $corpus_daily[$_]           = 0;
441    $virus_daily[$_]            = 0;
442    $black_daily[$_]            = 0;
443    $block_daily[$_]            = 0;
444  }
445
446  for(0..24) {
447    my($d) = $daystart - (3600*24*(24-$_));
448    my ($lday, $lmon, $lyear) = (localtime($d))[3,4,5];
449    $lmon++;
450    $lyear += 1900;
451    $period_weekly[$_]          = "$lmon/$lday/$lyear";
452    $spam_weekly[$_]            = 0;
453    $nonspam_weekly[$_]         = 0;
454    $sm_weekly[$_]              = 0;
455    $fp_weekly[$_]              = 0;
456    $inoc_weekly[$_]            = 0;
457    $whitelist_weekly[$_]       = 0;
458    $corpus_weekly[$_]          = 0;
459    $virus_weekly[$_]           = 0;
460    $black_weekly[$_]           = 0;
461    $block_weekly[$_]           = 0;
462  }
463
464  open(LOG, "<$LOG") || &error("$CONFIG{'LANG'}->{$LANGUAGE}->{'error_cannot_open_log'}: $!");
465  while(<LOG>) {
466    my($t_log, $c_log, $signature, $e_log) = (split(/\t/))[0,1,3,5];
467    next if ($t_log > time);
468
469    $last_message = $t_log;
470
471    # Only Parse Log Data in our Time Period
472    if ($t_log>=$periodstart) {
473      my($tmin, $thour, $tday, $tmon, $tyear) = (localtime($t_log))[1,2,3,4,5];
474      $tmon++;
475      $tyear += 1900;
476
477      # Weekly Graph
478      $c_weekly = 0;
479      while($period_weekly[$c_weekly] ne "$tmon/$tday/$tyear" && $c_weekly<24) {
480        $c_weekly++;
481      }
482
483      if ($c_log eq "E") {
484        if ($classes{$signature} eq "S") {
485          $spam_weekly[$c_weekly]--;
486          $spam_weekly[$c_weekly] = 0 if ($spam_weekly[$c_weekly]<0);
487        } elsif ($classes{$signature} eq "I") {
488          $nonspam_weekly[$c_weekly]--;
489          $nonspam_weekly[$c_weekly] = 0 if ($nonspam_weekly[$c_weekly]<0);
490        } elsif ($classes{$signature} eq "W") {
491          $whitelist_weekly[$c_weekly]--;
492          $whitelist_weekly[$c_weekly] = 0 if ($whitelist_weekly[$c_weekly]<0);
493        } elsif ($classes{$signature} eq "F") {
494          $spam_weekly[$c_weekly]++; $fp_weekly[$c_weekly]--;
495          $fp_weekly[$c_weekly] = 0 if ($fp_weekly[$c_weekly]<0);
496        } elsif ($classes{$signature} eq "M") {
497          $sm_weekly[$c_weekly]--; $nonspam_weekly[$c_weekly]++;
498          $sm_weekly[$c_weekly] = 0 if ($sm_weekly[$c_weekly]<0);
499        } elsif ($classes{$signature} eq "N") {
500          $inoc_weekly[$c_weekly]--;
501          $inoc_weekly[$c_weekly] = 0 if ($inoc_weekly[$c_weekly]<0);
502        } elsif ($classes{$signature} eq "C") {
503          $corpus_weekly[$c_weekly]--;
504          $corpus_weekly[$c_weekly] = 0 if ($corpus_weekly[$c_weekly]<0);
505        } elsif ($classes{$signature} eq "V") {
506          $virus_weekly[$c_weekly]--;
507          $virus_weekly[$c_weekly] = 0 if ($virus_weekly[$c_weekly]<0);
508        } elsif ($classes{$signature} eq "A") {
509          $black_weekly[$c_weekly]--;
510          $black_weekly[$c_weekly] = 0 if ($black_weekly[$c_weekly]<0);
511        } elsif ($classes{$signature} eq "O") {
512          $block_weekly[$c_weekly]--;
513          $block_weekly[$c_weekly] = 0 if ($block_weekly[$c_weekly]<0);
514        }
515      } else {
516       $classes{$signature} = $c_log;
517      }
518
519      if ($c_log eq "S") { $spam_weekly[$c_weekly]++; }
520      if ($c_log eq "I") { $nonspam_weekly[$c_weekly]++; }
521      if ($c_log eq "W") { $whitelist_weekly[$c_weekly]++; }
522      if ($c_log eq "F")
523        { $spam_weekly[$c_weekly]--; $fp_weekly[$c_weekly]++;
524          $spam_weekly[$c_weekly] = 0 if ($spam_weekly[$c_weekly]<0); }
525      if ($c_log eq "M")
526        { $sm_weekly[$c_weekly]++; $nonspam_weekly[$c_weekly]--;
527          $nonspam_weekly[$c_weekly] = 0 if ($nonspam_weekly[$c_weekly]<0); }
528      if ($c_log eq "N") { $inoc_weekly[$c_weekly]++; }
529      if ($c_log eq "C") { $corpus_weekly[$c_weekly]++; }
530      if ($c_log eq "V") { $virus_weekly[$c_weekly]++; }
531      if ($c_log eq "A") { $black_weekly[$c_weekly]++; }
532      if ($c_log eq "O") { $block_weekly[$c_weekly]++; }
533
534
535      # Daily Graph
536      if ($t_log>=$dailystart) {
537        while($period_daily[$c_daily] ne To12Hour($thour) && $c_daily<24) {
538          $c_daily++;
539        }
540
541
542        if ($c_log eq "E") {
543          if ($classes{$signature} eq "S") {
544            $spam_daily[$c_daily]--;
545            $spam_daily[$c_daily] = 0 if ($spam_daily[$c_daily]<0);
546          } elsif ($classes{$signature} eq "I") {
547            $nonspam_daily[$c_daily]--;
548            $nonspam_daily[$c_daily] = 0 if ($nonspam_daily[$c_daily]<0);
549          } elsif ($classes{$signature} eq "W") {
550            $whitelist_daily[$c_daily]--;
551            $whitelist_daily[$c_daily] = 0 if ($whitelist_daily[$c_daily]<0);
552          } elsif ($classes{$signature} eq "F") {
553            $spam_daily[$c_daily]++; $fp_daily[$c_daily]--;
554            $fp_daily[$c_daily] = 0 if ($fp_daily[$c_daily]<0);
555          } elsif ($classes{$signature} eq "M") {
556            $sm_daily[$c_daily]--; $nonspam_daily[$c_daily]++;
557            $sm_daily[$c_daily] = 0 if ($sm_daily[$c_daily]<0);
558          } elsif ($classes{$signature} eq "N") {
559            $inoc_daily[$c_daily]--;
560            $inoc_daily[$c_daily] = 0 if ($inoc_daily[$c_daily]<0);
561          } elsif ($classes{$signature} eq "C") {
562            $corpus_daily[$c_daily]--;
563            $corpus_daily[$c_daily] = 0 if ($corpus_daily[$c_daily]<0);
564          } elsif ($classes{$signature} eq "V") {
565            $virus_daily[$c_daily]--;
566            $virus_daily[$c_daily] = 0 if ($virus_daily[$c_daily]<0);
567          } elsif ($classes{$signature} eq "A") {
568            $black_daily[$c_daily]--;
569            $black_daily[$c_daily] = 0 if ($black_daily[$c_daily]<0);
570          } elsif ($classes{$signature} eq "O") {
571            $block_daily[$c_daily]--;
572            $block_daily[$c_daily] = 0 if ($block_daily[$c_daily]<0);
573          }
574        }
575
576        if ($c_log eq "S") { $spam_daily[$c_daily]++; }
577        if ($c_log eq "I") { $nonspam_daily[$c_daily]++; }
578        if ($c_log eq "W") { $whitelist_daily[$c_daily]++; }
579        if ($c_log eq "F")
580          { $spam_daily[$c_daily]--; $fp_daily[$c_daily]++;
581            $spam_daily[$c_daily] = 0 if ($spam_daily[$c_daily]<0); }
582        if ($c_log eq "M")
583          { $sm_daily[$c_daily]++; $nonspam_daily[$c_daily]--;
584            $nonspam_daily[$c_daily] = 0 if ($nonspam_daily[$c_daily]<0); }
585        if ($c_log eq "N") { $inoc_daily[$c_daily]++; }
586        if ($c_log eq "C") { $corpus_daily[$c_daily]++; }
587        if ($c_log eq "V") { $virus_daily[$c_daily]++; }
588        if ($c_log eq "A") { $black_daily[$c_daily]++; }
589        if ($c_log eq "O") { $block_daily[$c_daily]++; }
590      }
591
592      # Last Half-Minute
593      if ($t_log>=$hmstart) {
594        $msgpersecond{$t_log}++;
595        $DATA{'AVG_PROCESSING_TIME'} += $e_log;
596        $keycount_exectime++;
597      }
598    }
599  }
600
601  close(LOG);
602
603  # Calculate Avg. Messages Per Second
604  foreach(values(%msgpersecond)) {
605    $DATA{'AVG_MSG_PER_SECOND'} += $_;
606  }
607  $DATA{'AVG_MSG_PER_SECOND'} /= 60;
608  $DATA{'AVG_MSG_PER_SECOND'} = sprintf("%2.2f", $DATA{'AVG_MSG_PER_SECOND'});
609
610  # Calculate Avg. Processing Time
611  if ($keycount_exectime == 0) {
612    $DATA{'AVG_PROCESSING_TIME'} = 0;
613  } else {
614    $DATA{'AVG_PROCESSING_TIME'} /= $keycount_exectime;
615  }
616  $DATA{'AVG_PROCESSING_TIME'} = sprintf("%01.6f", $DATA{'AVG_PROCESSING_TIME'});
617
618  # Calculate Number of processes, Uptime and Mail Queue length
619  $DATA{'DSPAM_PROCESSES'} = `$CONFIG{'DSPAM_PROCESSES'}`;
620  $DATA{'UPTIME'} = `uptime`;
621  $DATA{'MAIL_QUEUE'} = `$CONFIG{'MAIL_QUEUE'}`;
622 
623  # Calculate Graphs
624  $DATA{'SPAM_TODAY'}               = $spam_weekly[24];
625  $DATA{'NONSPAM_TODAY'}            = $nonspam_weekly[24];
626  $DATA{'SM_TODAY'}                 = $sm_weekly[24];
627  $DATA{'FP_TODAY'}                 = $fp_weekly[24];
628  $DATA{'INOC_TODAY'}               = $inoc_weekly[24];
629  $DATA{'WHITE_TODAY'}              = $whitelist_weekly[24];
630  $DATA{'CORPUS_TODAY'}             = $corpus_weekly[24];
631  $DATA{'VIRUS_TODAY'}              = $virus_weekly[24];
632  $DATA{'BLACK_TODAY'}              = $black_weekly[24];
633  $DATA{'BLOCK_TODAY'}              = $block_weekly[24];
634  $DATA{'TOTAL_TODAY'}              = $DATA{'SPAM_TODAY'}
635                                      + $DATA{'NONSPAM_TODAY'}
636                                      + $DATA{'SM_TODAY'}
637                                      + $DATA{'FP_TODAY'}
638                                      + $DATA{'INOC_TODAY'}
639                                      + $DATA{'WHITE_TODAY'}
640                                      + $DATA{'CORPUS_TODAY'}
641                                      + $DATA{'VIRUS_TODAY'}
642                                      + $DATA{'BLACK_TODAY'}
643                                      + $DATA{'BLOCK_TODAY'};
644
645  $DATA{'SPAM_THIS_HOUR'}           = $spam_daily[23];
646  $DATA{'NONSPAM_THIS_HOUR'}        = $nonspam_daily[23];
647  $DATA{'SM_THIS_HOUR'}             = $sm_daily[23];
648  $DATA{'FP_THIS_HOUR'}             = $fp_daily[23];
649  $DATA{'INOC_THIS_HOUR'}           = $inoc_daily[23];
650  $DATA{'WHITE_THIS_HOUR'}          = $whitelist_daily[23];
651  $DATA{'CORPUS_THIS_HOUR'}         = $corpus_daily[23];
652  $DATA{'VIRUS_THIS_HOUR'}          = $virus_daily[23];
653  $DATA{'BLACK_THIS_HOUR'}          = $black_daily[23];
654  $DATA{'BLOCK_THIS_HOUR'}          = $block_daily[23];
655  $DATA{'TOTAL_THIS_HOUR'}          = $DATA{'SPAM_THIS_HOUR'} +
656                                      + $DATA{'NONSPAM_THIS_HOUR'}
657                                      + $DATA{'SM_THIS_HOUR'}
658                                      + $DATA{'FP_THIS_HOUR'}
659                                      + $DATA{'INOC_THIS_HOUR'}
660                                      + $DATA{'WHITE_THIS_HOUR'}
661                                      + $DATA{'CORPUS_THIS_HOUR'}
662                                      + $DATA{'VIRUS_THIS_HOUR'}
663                                      + $DATA{'BLACK_THIS_HOUR'}
664                                      + $DATA{'BLOCK_THIS_HOUR'};
665
666  $DATA{'DATA_DAILY'} = join(",", @spam_daily)
667                      . "_"
668                      . join(",", @nonspam_daily)
669                      . "_"
670                      . join(",", @sm_daily)
671                      . "_"
672                      . join(",", @fp_daily)
673                      . "_"
674                      . join(",", @inoc_daily)
675                      . "_"
676                      . join(",", @whitelist_daily)
677                      . "_"
678                      . join(",", @corpus_daily)
679                      . "_"
680                      . join(",", @virus_daily)
681                      . "_"
682                      . join(",", @black_daily)
683                      . "_"
684                      . join(",", @block_daily)
685                      . "_"
686                      . join(",", @period_daily);
687
688  $DATA{'DATA_WEEKLY'} = join(",", @spam_weekly)
689                      . "_"
690                      . join(",", @nonspam_weekly)
691                      . "_"
692                      . join(",", @sm_weekly)
693                      . "_"
694                      . join(",", @fp_weekly)
695                      . "_"
696                      . join(",", @inoc_weekly)
697                      . "_"
698                      . join(",", @whitelist_weekly)
699                      . "_"
700                      . join(",", @corpus_weekly)
701                      . "_"
702                      . join(",", @virus_weekly)
703                      . "_"
704                      . join(",", @black_weekly)
705                      . "_"
706                      . join(",", @block_weekly)
707                      . "_"
708                      . join(",", @period_weekly);
709
710  foreach(@spam_daily)          { $DATA{'TS_DAILY'} += $_; };
711  foreach(@nonspam_daily)       { $DATA{'TI_DAILY'} += $_; }
712  foreach(@sm_daily)            { $DATA{'SM_DAILY'} += $_; }
713  foreach(@fp_daily)            { $DATA{'FP_DAILY'} += $_; }
714  foreach(@inoc_daily)          { $DATA{'INOC_DAILY'} += $_; }
715  foreach(@whitelist_daily)     { $DATA{'TI_DAILY'} += $_; $DATA{'WHITE_DAILY'} += $_; }
716  foreach(@corpus_daily)        { $DATA{'CORPUS_DAILY'} += $_; }
717  foreach(@virus_daily)         { $DATA{'TS_DAILY'} += $_; $DATA{'VIRUS_DAILY'} += $_; }
718  foreach(@black_daily)         { $DATA{'TS_DAILY'} += $_; $DATA{'BLACK_DAILY'} += $_; }
719  foreach(@block_daily)         { $DATA{'TS_DAILY'} += $_; $DATA{'BLOCK_DAILY'} += $_; }
720
721  foreach(@spam_weekly)         { $DATA{'TS_WEEKLY'} += $_; }
722  foreach(@nonspam_weekly)      { $DATA{'TI_WEEKLY'} += $_; }
723  foreach(@sm_weekly)           { $DATA{'SM_WEEKLY'} += $_; }
724  foreach(@fp_weekly)           { $DATA{'FP_WEEKLY'} += $_; }
725  foreach(@inoc_weekly)         { $DATA{'INOC_WEEKLY'} += $_; }
726  foreach(@whitelist_weekly)    { $DATA{'TI_WEEKLY'} += $_; $DATA{'WHITE_WEEKLY'} += $_; }
727  foreach(@corpus_weekly)       { $DATA{'CORPUS_WEEKLY'} += $_; }
728  foreach(@virus_weekly)        { $DATA{'TS_WEEKLY'} += $_; $DATA{'VIRUS_WEEKLY'} += $_; }
729  foreach(@black_weekly)        { $DATA{'TS_WEEKLY'} += $_; $DATA{'BLACK_WEEKLY'} += $_; }
730  foreach(@block_weekly)        { $DATA{'TS_WEEKLY'} += $_; $DATA{'BLOCK_WEEKLY'} += $_; }
731
732  &output(%DATA);
733}
734
735#
736# Global Functions
737#
738
739sub htmlheader {
740  print "Expires: now\n";
741  print "Pragma: no-cache\n";
742  print "Cache-control: no-cache\n";
743  print "Content-type: text/html\n\n";
744}
745
746sub output {
747  if ($FORM{'template'} eq "" || $FORM{'template'} !~ /^([A-Z0-9]*)$/i) {
748    $FORM{'template'} = "performance";
749  }
750  &htmlheader;
751  my(%DATA) = @_;
752  $DATA{'WEB_ROOT'} = $CONFIG{'WEB_ROOT'};
753  $DATA{'LANG'} = $LANGUAGE;
754
755  $DATA{'FORM_ADMIN'} = qq!<form action="$CONFIG{'ME'}"><input type=hidden name="template" value="$FORM{'template'}">$CONFIG{'LANG'}->{$LANGUAGE}->{'admin_form'}&nbsp;<strong>($ENV{'REMOTE_USER'})</strong>&nbsp;&nbsp;&nbsp;&nbsp;$CONFIG{'LANG'}->{$LANGUAGE}->{'lang_select'}$CONFIG{'LANGUAGES'}&nbsp;&nbsp;<input type=submit value="$CONFIG{'LANG'}->{$LANGUAGE}->{'admin_form_submit'}"></form>!;
756
757  open(FILE, "<$CONFIG{'TEMPLATES'}/nav_admin_$FORM{'template'}.html");
758  while(<FILE>) {
759    s/\$CGI\$/$CONFIG{'ME'}/g;
760    s/\$([A-Z0-9_]*)\$/$DATA{$1}/g;
761    print;
762  }
763  close(FILE);
764  exit;
765}
766
767sub SafeVars {
768  my(%PAIRS) = @_;
769  my($url, $key);
770  foreach $key (keys(%PAIRS)) {
771    my($value) = $PAIRS{$key};
772    $value =~ s/([^A-Z0-9])/sprintf("%%%x", ord($1))/gie;
773    $url .= "$key=$value&";
774  }
775  $url =~ s/\&$//;
776  return $url;
777}
778
779sub error {
780  my($error) = @_;
781  $FORM{'template'} = "error";
782  $DATA{'MESSAGE'} = <<_end;
783$CONFIG{'LANG'}->{$LANGUAGE}->{'error_message_part1'}
784<BR>
785<B>$error</B><BR>
786<BR>
787$CONFIG{'LANG'}->{$LANGUAGE}->{'error_message_part2'}
788_end
789  &output(%DATA);
790}
791
792sub ReadParse {
793  my(@pairs, %FORM);
794  if ($ENV{'REQUEST_METHOD'} =~ /GET/i)
795    { @pairs = split(/&/, $ENV{'QUERY_STRING'}); }
796  else {
797    my($buffer);
798    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
799    @pairs = split(/\&/, $buffer);
800  }
801  foreach(@pairs) {
802    my($name, $value) = split(/\=/, $_);
803
804    $name =~ tr/+/ /;
805    $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
806    $value =~ tr/+/ /;
807    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
808    $value =~ s/<!--(.|\n)*-->//g;
809    $FORM{$name} = $value;
810  }
811  return %FORM;
812}
813
814sub To12Hour {
815  my($h) = @_;
816  if ($h < 0) { $h += 24; }
817  if ($h>11) { $h -= 12 if ($h>12) ; $h .= ":00pm"; }
818  else { $h = "12" if ($h == 0); $h .= ":00am"; }
819  return $h;
820}
821
822
823sub GetPath {
824  my($USER, $VPOPUSERNAME, $VPOPDOMAIN);
825  my($UN) = @_;
826
827  # Domain-scale
828  if ($CONFIG{'DOMAIN_SCALE'} == 1) {
829    $VPOPUSERNAME = (split(/@/, $UN))[0];
830    $VPOPDOMAIN = (split(/@/, $UN))[1];
831    $VPOPDOMAIN = "local" if ($VPOPDOMAIN eq "");
832    ($VPOPUSERNAME = $VPOPDOMAIN, $VPOPDOMAIN = "local") if ($VPOPUSERNAME eq "" && $VPOPDOMAIN ne "");
833
834    $USER = "$CONFIG{'DSPAM_HOME'}/data/$VPOPDOMAIN/$VPOPUSERNAME/$VPOPUSERNAME";
835
836  # Normal scale
837  } elsif ($CONFIG{'LARGE_SCALE'} == 0) {
838    $USER = "$CONFIG{'DSPAM_HOME'}/data/$UN/$UN";
839
840  # Large-scale
841  } else {
842    if (length($UN)>1) {
843      $USER = "$CONFIG{'DSPAM_HOME'}/data/" . substr($UN, 0, 1) .
844      "/". substr($UN, 1, 1) . "/$UN/$UN";
845    } else {
846      $USER = "$CONFIG{'DSPAM_HOME'}/data/$UN/$UN/$UN";
847    }
848  }
849
850  return $USER;
851}
852
853sub GetPrefs {
854  my(%PREFS);
855  my($USER, $FILE) = @_;
856
857  if ($CONFIG{'PREFERENCES_EXTENSION'} == 1) {
858
859    if ($USER eq "") {
860      $USER = "default";
861    }
862
863    open(PIPE, "$CONFIG{'DSPAM_BIN'}/dspam_admin agg pref ".quotemeta($USER)."|");
864    while(<PIPE>) {
865      chomp;
866      my($directive, $value) = split(/\=/);
867      $PREFS{$directive} = $value;
868    }
869    close(PIPE);
870  } else {
871    if (! -e $FILE) {
872      $FILE = "./default.prefs";
873    }
874                                                                               
875    if (! -e $FILE) {
876      &error("$CONFIG{'LANG'}->{$LANGUAGE}->{'error_load_default_prefs'}");
877    }
878                                                                               
879    open(FILE, "<$FILE");
880    while(<FILE>) {
881      chomp;
882      my($directive, $value) = split(/\=/);
883      $PREFS{$directive} = $value;
884    }
885    close(FILE);
886  }
887
888  return %PREFS;
889}
Note: See TracBrowser for help on using the repository browser.