|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Al Zaharov 2:5005/58.88 28 Jul 2001 14:19:36 To : All Subject : посмотрите, плз, скрипт (рабочий), что с ним не так? --------------------------------------------------------------------------------
нормально, а идеологические ака религиозные.. может, местами можно сделать
лучше? и не смотрите, что не дописан он до конца, может, что посоветуете,
тогда допишу\перепишу.. и, кстати, от того форка можно как-нибудь
избавиться? как ни пытался - не вышло.. и еще: а не лучше ли будет сделать
вывод мультипартом и у кого это получалось? метод, описанный в perldoc CGI
не получилось завести..
#!/usr/bin/perl -w
require 5.004;
use locale;
use POSIX qw (locale_h);
use CGI qw (:standard);
use strict;
&main;
sub main {
$main::fetchipac = "/usr/local/sbin/fetchipac";
$main::fetchipac_options = "";
$main::ipacsum = "/usr/local/sbin/ipacsum";
$main::title = "Traffic statistics";
$main::form_head = "<H1> Show traffic statistics </H1>";
$main::submit_btn = "Show me!";
$main::sel = "Select period: ";
$main::ssl_is_a_must = "0";
$main::filter_to_ssl_user = "0";
$main::check_referer = "0";
@main::allow_referers = ('');
my $charset = "koi8-r";
###### There are no user adjustable parameters below this line #############
#############################################################################
my $now = time();
$main::me = $0;
$main::me =~ s|^.*/([^/]+)$|$1|;
# calculate time zone offset in seconds - use difference of output of date
# command and time function, round it
$main::tzoffset = 0; # ! makeunixtime needs this!
$main::tzoffset = int( ($now-makeunixtime(`date +"%Y%m%d%H%M%S"`)) / 60) *60;
# get time zone name
my $tzname = `date +%Z`; chop $tzname;
my $starttime = 0 + $main::tzoffset;
my $endtime = $now;
my $timestamps = "";
my $q = new CGI;
$main::machine_name = "";
my $options = "0";
my $show_graph = "0";
$main::skip_empty_lines = 0;
$main::skip_empty_times = 0;
$main::st_align = "center";
$main::rulenames = "";
$main::rulenumber = 0;
setlocale(LC_CTYPE, "");
if ($q->param('showpic')) {
&print_pic($q->param('showpic'), $q->param('frame'));
}
print $q->header(-type=>"text/html; charset=$charset"),
$q->start_html($main::title);
$options = print_get_form();
if ($options eq "0") {
print $q->end_html;
exit;
}
($starttime, $endtime) = split(/ /, set_time_frame($options), 2);
if ($options =~ /graph/i) {
$show_graph = "1";
$main::st_align = "left";
}
if ($options =~ /showempty/i) {
$main::skip_empty_lines = 1;
}
if ($options =~ /skiptimestamps/i) {
$main::skip_empty_times = 1;
}
print "<TABLE align=$main::st_align CELLPADDING=4 CELLSPACING=2 BORDER=1>";
open(DATA, "$main::fetchipac $main::fetchipac_options ".
"-t$starttime,$endtime -m|")
|| die "can't run $main::fetchipac\n";
my $count=<DATA>;
while(<DATA>)
{
if (/^(.)\s(\d+)$/) {
my $ts = $2;
if ($1 eq "*") {
push(@main::timestamps, $ts);
}
}
}
close DATA;
pipe(PREAD,PWRITE);
my $pid = fork();
die "$main::me: can't fork: $!\n" if (!defined($pid));
if ($pid == 0) {
close PREAD;
close STDOUT;
open(STDOUT, ">&PWRITE")
|| die "$main::me: cant redirect stdout to pipe\n";
open(FETCHIPAC, "|$main::fetchipac -r -m")
|| die "$main::me: can't exec $main::fetchipac\n";
print(FETCHIPAC $main::timestamps[0],"-",$main::timestamps[-1],"\n");
close(FETCHIPAC);
close(PWRITE);
exit;
}
close PWRITE;
while(<PREAD>)
{
/^ADD\s*$/i or die "$main::me: bad line from fetchipac: $_\n";
# second line of fetchipac output: timestamp no_of_records
$_ = <PREAD> || last;
/^(\d+)\s(\d+)$/ or die "$main::me: bad line from fetchipac: $_\n";
my $timestamp = $1;
# read each record
&read_data_record("PREAD", $timestamp);
}
close PREAD;
wait;
print "</TABLE>\n\n";
if ($show_graph eq "1") {
my @rules_sorted = sort {$main::rulenames{$a}<=>$main::rulenames{$b}}
keys %main::rulenames;
print "<TABLE align=right>";
my $iam = $q->url();
my $fr = $q->param('list');
foreach(@rules_sorted) {
s/ /_/g;
print "<TR><TD><IMG src=$iam?showpic=$_&frame=$fr>
</TD></TR>";
}
print "</TABLE>\n\n";
}
print $q->end_html;
} ######################### end of main proc #############################
sub read_data_record {
my($file, $irec);
my($pkts, $bytes, $rule);
my(@result);
$file=shift;
my $ttt=localtime(shift);
my $header_printed = 0;
$_ = <$file>;
chop;
/^\(\s*(.*)$/ or die "$main::me: bad line from fetchipac
(expecting machine name): $_\n";
$main::machine_name = $1; # remember final machine name
while(<$file>) {
last if (/^\)$/); # terminating line ')'
/^(\d+)\s(\d+)\s\|(.*)\|$/
or die "$main::me: bad line from fetchipac
(expecting rule item): $_\n";
$bytes = $1;
$pkts = $2;
$rule = $3;
if (!defined($main::rulenames{$rule})) {
$main::rulenames{$rule}=$main::rulenumber++;
}
if (!$main::skip_empty_times && !$header_printed) {
$header_printed = 1;
print "<TR><TD><STRONG> $ttt </STRONG></TD>
<TD> packets </TD>
<TD> bytes </TD></TR>";
}
if (($main::skip_empty_lines && ($bytes ne "0"))
|| !$main::skip_empty_lines) {
if (!$header_printed) { #print date, etc
$header_printed = 1;
print "<TR><TD><STRONG> $ttt </STRONG></TD>
<TD> packets </TD>
<TD> bytes </TD></TR>";
}
print "<TR><TD> $rule </TD><TD> $pkts </TD><TD>
$bytes </TD></TR>";
}
}
# read another emtpy line (data format consistency)
$_ = <$file>;
die "$main::me: bad data from fetchipac (expected emtpy line): $_\n"
if ($_ !~ /^$/);
}
sub set_time_frame {
my($opt_t) = shift;
my $starttime="";
my $endtime="";
my $i="";
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
my @mofg = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if ($opt_t =~ /^this\s*hour/i) {
$opt_t = "the hour 0 hours ago";
} elsif ($opt_t =~ /^last\s*hour/i) {
$opt_t = "the hour 1 hour ago";
} elsif ($opt_t =~ /^today/i) {
$opt_t = "the day 0 days ago";
} elsif ($opt_t =~ /^yesterday/i) {
$opt_t = "the day 1 day ago";
} elsif ($opt_t =~ /^the\s*day\s*before\s*yesterday/i) {
$opt_t = "the day 2 days ago";
} elsif ($opt_t =~ /^this\s*week/i) {
$opt_t = "the week 0 weeks ago";
} elsif ($opt_t =~ /^last\s*week/i) {
$opt_t = "the week 1 week ago";
} elsif ($opt_t =~ /^the\s*week\s*before\s*last\s*week/i) {
$opt_t = "the week 2 weeks ago";
} elsif ($opt_t =~ /^this\s*month/i) {
$opt_t = "the month 0 months ago";
} elsif ($opt_t =~ /^last\s*month/i) {
$opt_t = "the month 1 month ago";
} elsif ($opt_t =~ /^this\s*year/i) {
$opt_t = "the year 0 years ago";
} elsif ($opt_t =~ /^last\s*year/i) {
$opt_t = "the year 1 year ago";
} if ($opt_t =~ /^the\s*hour\s*(\d+)\s*hours?\s*ago/i) {
$i=$1;
my($thishour)=makeunixtime(sprintf("%04d%02d%02d%02d0000",
1900+$year, $mon+1, $mday, $hour));
$starttime=$thishour - 60*60 * $i;
$endtime = $thishour - 60*60 * ($i-1);
} elsif ($opt_t =~ /^the\s*day\s*(\d+)\s*days?\s*ago/i) {
$i=$1;
my($thismorning)=makeunixtime(sprintf("%04d%02d%02d000000",
1900+$year, $mon+1, $mday));
$starttime=$thismorning - 60*60*24 * $i;
$endtime=$thismorning - 60*60*24 * ($i-1);
} elsif ($opt_t =~ /^the\s*week\s*(\d+)\s*weeks?\s*ago/i) {
$i=$1;
$mday = $mday-($wday >0 ? $wday-1 : 6);
if ($mday < 1) {
$mon--;
if ($mon < 0) {
$mon += 12;
$year--;
}
$mday += $mofg[$mon];
}
my($monday)=makeunixtime(sprintf("%04d%02d%02d000000",
1900+$year, $mon+1, $mday));
$starttime=$monday - 60*60*24*7 * $i;
$endtime=$monday- 60*60*24*7 * ($i-1);
} elsif ($opt_t =~ /^the\s*month\s*(\d+)\s*months?\s*ago/i) {
$mon = $mon - $1;
while ($mon < 0) {
$year--;
$mon += 12;
}
$starttime=makeunixtime(sprintf("%04d%02d01000000",
1900+$year, $mon+1));
$endtime=$starttime + 60*60*24*$mofg[$mon];
$endtime += 60*60*24 if ((1900+$year)%4 ==0 && $mon==1);
} elsif ($opt_t =~ /^the\s*year\s*(\d+)\s*years?\s*ago/i) {
$i=$1;
$starttime=makeunixtime(sprintf("%04d0101000000",
1900+$year-$i));
$endtime=makeunixtime(sprintf("%04d0101000000",
1900+$year-$i+1));
} elsif ($opt_t =~ /^ever/i) {
$starttime=0;
$endtime=time();
} else {
die "$main::me: Unknown time frame: \"$opt_t\"\n";
}
return sprintf "%s %s", $starttime, $endtime;
}
sub makeunixtime {
my($y, $m, $d, $h, $i, $e);
my $s = shift;
my @moff = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 );
$h=0; $i=0; $e=0;
if ($s =~ /^(\d\d\d\d)(\d\d)(\d\d)/) {
($y, $m, $d) = ($1, $2, $3);
if ($s =~ /^\d\d\d\d\d\d\d\d-?(\d\d)/) {
$h=$1;
if ($s =~ /^\d\d\d\d\d\d\d\d-?\d\d(\d\d)/) {
$i=$1;
if($s =~ /^\d\d\d\d\d\d\d\d-?\d\d\d\d(\d\d)/){
$e=$1;
}
}
}
} else {
return 0;
}
$y-=1970;
$s = (($y)*365) + int(($y+2)/4);
$s+=$moff[$m-1];
$s+=$d-1;
$s-- if (($y+2)%4 == 0 && $m < 3);
$s*86400 + $h*3600 + $i*60 + $e + $main::tzoffset;
}
sub print_pic {
my $pic=shift;
my $frame=shift;
$pic=~s/\_/ /g;
if (defined($pic) && ($ENV{'HTTP_REFERER'} eq url())) {
open (DATA, "$main::ipacsum -f\"$pic\" ".
"-t\"$frame\" --png --png-asis --png-to-stdout|")
|| die "$main::me: can't run $main::ipacsum\n";
binmode DATA;
binmode STDOUT;
print <DATA>;
close DATA;
} else {
print header, start_html('Error'),
h1({-align=>"center"}, 'This script is not intended for',
'such a use. Sorry for any inconveniecies.'), end_html;
}
exit;
}
sub print_get_form {
my $q = new CGI;
my %labels = ('today'=>'today', 'yesterday'=>'yesterday',
'thishour'=>'this hour', 'lasthour'=>'last hour',
'thisweek'=>'this week', 'lastweek'=>'last week',
'thismonth'=>'this month', 'lastmonth'=>'last month',
'thisyear'=>'this year', 'lastyear'=>'last year');
my %opt_labels = ('graph'=>' build graphs',
'showempty'=>' skip lines with 0s only',
'skiptimestamps'=>' skip timestamp with no data');
print $q->startform,
$main::form_head,
"<P><TABLE CELLPADDING=4 CELLSPACING=2 BORDER=0>",
"<TR><TD>$main::sel</TD><TD>",
$q->popup_menu('list',
['today','yesterday','thishour','lasthour',
'thisweek','lastweek','thismonth','lastmonth',
'thisyear','lastyear'],
'today',\%labels), "</TD><TD>",
$q->checkbox_group('options',
['graph','showempty','skiptimestamps'],
['showempty','skiptimestamps'],
'true', \%opt_labels), "</TD>",
# "<TD>Rules regexp: ", $q->textfield('regex','', 30, 50), "</TD>",
"</TR></TABLE><P>",
$q->submit(-value=>$main::submit_btn),
$q->endform;
if ($q->param) {
return sprintf("%s %s", $q->param('list'),
join(" ", $q->param('options')));
}
}
--
wbw, kaiser
--- tin/1.4.4-20000803 ("Vet for the Insane") (UNIX) (Linux/2.4.6 (i686))
* Origin: e-will (2:5005/58.88)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/2489529cb36a6.html, оценка из 5, голосов 10
|