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 | } |
---|