[c5c522c] | 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 | |
---|
| 20 | use strict; |
---|
| 21 | use Time::Local; |
---|
| 22 | use vars qw { %CONFIG %DATA %FORM %LANG $LANGUAGE }; |
---|
| 23 | |
---|
| 24 | # |
---|
| 25 | # Read configuration parameters common to all CGI scripts |
---|
| 26 | # |
---|
| 27 | if (!(-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 | } |
---|
| 34 | require "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 | |
---|
| 52 | if ($FORM{'language'} ne "") { |
---|
| 53 | $LANGUAGE = $FORM{'language'}; |
---|
| 54 | } else { |
---|
| 55 | $LANGUAGE = $CONFIG{'LANGUAGE_USED'}; |
---|
| 56 | } |
---|
| 57 | if (! defined $CONFIG{'LANG'}->{$LANGUAGE}->{'NAME'}) { |
---|
| 58 | $LANGUAGE = $CONFIG{'LANGUAGE_USED'}; |
---|
| 59 | } |
---|
| 60 | my @dslanguages = (); |
---|
| 61 | for (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 | # |
---|
| 75 | do { |
---|
| 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 | |
---|
| 97 | if ($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 | |
---|
| 115 | if ($ENV{'REMOTE_USER'} eq "") { |
---|
| 116 | &error("$CONFIG{'LANG'}->{$LANGUAGE}->{'error_no_identity'}"); |
---|
| 117 | } |
---|
| 118 | |
---|
| 119 | if ($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 |
---|
| 138 | if ($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 | |
---|
| 157 | sub 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; |
---|
| 249 | trainingMode=$FORM{'trainingMode'} |
---|
| 250 | spamAction=$FORM{'spamAction'} |
---|
| 251 | spamSubject=$FORM{'spamSubject'} |
---|
| 252 | statisticalSedation=$FORM{'statisticalSedation'} |
---|
| 253 | enableBNR=$FORM{'enableBNR'} |
---|
| 254 | enableWhitelist=$FORM{'enableWhitelist'} |
---|
| 255 | signatureLocation=$FORM{'signatureLocation'} |
---|
| 256 | showFactors=$FORM{'showFactors'} |
---|
| 257 | dailyQuarantineSummary=$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 | |
---|
| 302 | sub 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\"> </td>". |
---|
| 390 | " <td class=\"$b\"> </td>". |
---|
| 391 | " <td class=\"$b\"> </td>". |
---|
| 392 | " <td class=\"$b\"> </td>". |
---|
| 393 | " <td class=\"$b\"> </td>". |
---|
| 394 | " <td class=\"$b\"> </td>". |
---|
| 395 | "</tr>\n"; |
---|
| 396 | |
---|
| 397 | &output(%DATA); |
---|
| 398 | } |
---|
| 399 | |
---|
| 400 | # |
---|
| 401 | # Status Functions |
---|
| 402 | # |
---|
| 403 | |
---|
| 404 | sub 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 | |
---|
| 739 | sub 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 | |
---|
| 746 | sub 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'} <strong>($ENV{'REMOTE_USER'})</strong> $CONFIG{'LANG'}->{$LANGUAGE}->{'lang_select'}$CONFIG{'LANGUAGES'} <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 | |
---|
| 767 | sub 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 | |
---|
| 779 | sub 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 | |
---|
| 792 | sub 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 | |
---|
| 814 | sub 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 | |
---|
| 823 | sub 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 | |
---|
| 853 | sub 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 | } |
---|