📄 pure-stat.pl
字号:
#!/usr/bin/perl#--------------------------------------------------------------# PROJECT : pure-ftpd statistics# FILE : pure-stat.pl# DESCRIPTION : see below (Purpose)# AUTHOR : Chill# DATE : 08/01/2002# COMMENT:# PARAMETER : none# FROM FILE : none#--------------------------------------------------------------# PURPOSE# get the log file $CONST_LOGFILE# parse it and generate stats# to avoid loading a huge log file, a summary file ($CONST_SUMFILE),# is generated#--------------------------------------------------------------# TO DO# - clean ugly code#--------------------------------------------------------------#CONSTANT DELCARATIONmy $CONST_USER=0;my $CONST_TUPLOAD=1;my $CONST_TDOWNLOAD=2;my $CONST_LCONNECTION=3;my $CONST_LOGFILE="/var/log/pureftpd.log";my $CONST_SUMFILE="/var/log/pureftpd.stat.log";#FUNCTION DECLARATIONsub castSize; #CREATE USERS ARRAY (UGLY, BUT USEFUL FOR DISPLAY)my @users = (["login", "upload", "download", "last connection"]);#MAIN VARIABLES INITmy $total_upload = 0;my $total_download = 0;#FUNCTION DEFINITION#MODIFY 1234bytes => 1.2Mb...sub castSize{ my $value = shift; if ($value > 1073741824) { $value = $value / 1073741824; @fvalue = ($value, "Gb"); } elsif ($value > 1048576) { $value = $value / 1048576; @fvalue = ($value, "Mb"); } elsif ($value > 1024) { $value = $value / 1024; @fvalue = ($value, "Kb"); } else { @fvalue = ($value, "b"); } return @fvalue;}#END sub castSize#LOAD SUMMARY FILE INTO ARRAYopen(SUMF,$CONST_SUMFILE);my @sumlist = <SUMF>;close SUMF;#PARSING SUMMARY FILE INTO ARRAYforeach $sumentry (@sumlist){ ($slogin, $sbytes_ul, $sbytes_dl, $sdate) = $sumentry =~ m/^(\S+) (\S+) (\S+) \[([^\]\[]+)\]/; push @users, [$slogin, $sbytes_ul, $sbytes_dl, $sdate]; $total_upload += $sbytes_ul; $total_download += $sbytes_dl;}#DEBUG# CHECKING ARRAY CONTENT#for $i ( 1 .. $#users )#{# $dactual_upload = $users[$i][$CONST_TUPLOAD];# $dactual_download = $users[$i][$CONST_TDOWNLOAD];## #PRINT ON STDOUT# printf "%s\t|\t%d\t\t|\t%d\t\t|\t%s\n", ($users[$i][$CONST_USER],$dactual_upload,$dactual_download,$users[$i][$CONST_LCONNECTION]);#}#END DEBUG##LOAD LOG FILE INTO ARRAYopen(LOG,$CONST_LOGFILE);my @loglist = <LOG>;close LOG;#PARSING ARRAY IF NOT EMPTYif ($#loglist != -1){ #GENERATE FILE EXTENSTION AS yearmonthmdayhourmin @dlist = gmtime(time); $ext = sprintf("%02d%02d%02d%02d%02d", $dlist[5], $dlist[4]+1, $dlist[3], $dlist[2]+2, $dlist[1]); undef @dlist; #WE BACKUP THE LOG FILE system ("gzip $CONST_LOGFILE -S .$ext.gz && touch $CONST_LOGFILE"); foreach $logentry (@loglist) { #LET'S GRAB THE LOG ENTRY ($ip, $tiret, $login, $date, $request, $status, $bytes) = $logentry =~ m/^(\S+) (\S+) (\S+) \[([^\]\[]+)\] \"([^"]*)\" (\S+) (\S+)/; #DEBUG STRING #print "ip = $ip| tiret = $tiret| login = $login| date = $date| request = $request| status = $status| bytes = $bytes\n\n"; #print "login = $login| request = $request| bytes = $bytes\n"; #ADD OR MODIFY USERS #IS THE USER IN THE SUMMARY FILE my $gotuser = 0; my $indexuser = 0; for $i ( 1 .. $#users ) { if ($users[$i][$CONST_USER] eq $login) { $gotuser = 1; $indexuser = $i; last; } } #YES, WE DON'T ADD HIM, WE UPGRADE HIM if ($gotuser) { if ( $request =~ "PUT") { #UPLOAD CASE $users[$indexuser][$CONST_TUPLOAD] += $bytes; $total_upload += $bytes; } elsif ( $request =~ "GET") { #DOWNLOAD CASE $users[$indexuser][$CONST_TDOWNLOAD] += $bytes; $total_download += $bytes; } #LAST CONNECTION $users[$indexuser][$CONST_LCONNECTION] = $date; } else { #NOPE, WE ADD HIM if ( $request =~ "GET") { #DOWNLOAD CASE push @users, [$login, 0, $bytes, $date]; $total_download += $bytes; } elsif ( $request =~ "PUT") { #UPLOAD CASE push @users, [$login, $bytes, 0, $date]; $total_upload += $bytes; } } }} #PRINT RESULTS#LET'S CLEAN THE SUMMARY FILEsystem ("rm -f $CONST_SUMFILE && touch $CONST_SUMFILE");#TABLE HEADERprint "----------------------------------------------\n";print "$users[$i][$CONST_USER]\t|\t$users[$i][$CONST_TUPLOAD]\t\t|\t$users[$i][$CONST_TDOWNLOAD]\t\t|\t$users[$i][$CONST_LCONNECTION]\n";print "----------------------------------------------\n";#TABLE BODYfor $i ( 1 .. $#users ){ if ($total_upload <= 0) { $percent_upload=0; } else { $percent_upload= 100*$users[$i][$CONST_TUPLOAD]/$total_upload; } if ($total_download <= 0) { $percent_download=0; } else { $percent_download= 100*$users[$i][$CONST_TDOWNLOAD]/$total_download; } @actual_upload = castSize $users[$i][$CONST_TUPLOAD]; @actual_download = castSize $users[$i][$CONST_TDOWNLOAD]; $strLogin = sprintf "%s", $users[$i][$CONST_USER]; $strUl = sprintf "%.1f %s (%.1f%%)", ($actual_upload[0],$actual_upload[1],$percent_upload); $strDl = sprintf "%.1f %s (%.1f%%)", ($actual_download[0],$actual_download[1],$percent_download); $strDate = sprintf "%s", ($users[$i][$CONST_LCONNECTION]); #PRINT ON STDOUT printf "%s\t|\t%s\t", ($strLogin, $strUl); if ( length($strUl) < 8) { printf "\t"; } printf "|\t%s\t", $strDl; if ( length($strDl) < 8) { printf "\t"; } printf "|\t%s\n", $strDate; printf "\n"; #PRINT SUMMARY FILE system ("echo -e '$users[$i][$CONST_USER] $users[$i][$CONST_TUPLOAD] $users[$i][$CONST_TDOWNLOAD] [$users[$i][$CONST_LCONNECTION]]' >> $CONST_SUMFILE");}#PREPARE BYTES, MBYTES OR GBYTES@ftotal_upload = castSize $total_upload;@ftotal_download = castSize $total_download;#TABLE FOOTERprint "----------------------------------------------\n";printf "*\t|\t%.2f %s\t|\t%.2f %s\n", ($ftotal_upload[0],$ftotal_upload[1],$ftotal_download[0],$ftotal_download[1]);print "----------------------------------------------\n";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -