全部博文(1144)
分类: LINUX
2009-12-09 12:06:33
#!/usr/local/bin/perl
#
# set tabstop=4 of course
#
use Date::Manip;
use Getopt::Std;
our($opt_t,$opt_d,$opt_e,$opt_h);
getopts ('t:deh');
# t = throughput
# d = disk space
# e = email results
# h = help
syntax() if($opt_h);
syntax() unless($opt_t || $opt_d);
if($opt_t){
if($opt_t eq "monthly"){
$period = ParseDate('last month');
}elsif($opt_t eq "weekly"){
$period = ParseDate('last week');
}elsif($opt_t eq "daily"){
$period = ParseDate('24 hours ago');
}else{
print "syntax error\n";
syntax();
}
$period =~ /(^\d{8})(\d{2}:\d{2}:\d{2})/; $days=$1; $time=$2;
}
opendir(D, "/home/hostedsites/") || die "cannot opendir: $!\n";
@subdirs = grep {/^www\./} readdir D;
closedir D;
foreach my $subdir (@subdirs){
my $total=0;
if($opt_t){
opendir(S, "/home/hostedsites/$subdir/logs/") || die "cannot opendir logs: $!\n";
foreach my $file (grep {!/^\./} readdir S){
if($file >= $days){
open(F, "/home/hostedsites/$subdir/logs/$file") || die "cannot open log: $!\n";
while(){
if(($file eq $days) && /\[.+:(\d{2}:\d{2}:\d{2})/){
$logtime=$1;
$flag = Date_Cmp($time,$logtime);
if($flag > 0){
next;
}
}
$size = (split /\s+/)[9]; # bytes of served file (not incl overhead)
if($size > 0){
$total += $size;
}else{
$total += 10; # account for overhead, etc
}
}
close F;
}
}
closedir S;
$bbits = ($total*8);
if($bbits >= 1073741824){
$throughput = sprintf("%.2f",($bbits/1073741824)) . " gigabits";
}elsif($bbits >= 1048576){
$throughput = sprintf("%.2f",($bbits/1048576)) . " megabits";
}elsif($bbits >= 1024){
$throughput = sprintf("%.2f",($bbits/1024)) . " kilobits";
}else{
$throughput = $bbits . " bits";
}
}
if($opt_d){
($skbytes)=split(/\s+/, `du -s -k /home/hostedsites/$subdir/`);
if($skbytes >= 1048576){
$storage = sprintf("%.2f",($skbytes/1048576)) . " GigaBytes";
}elsif($skbytes >= 1024){
$storage = sprintf("%.2f",($skbytes/1024)) . " MegaBytes";
}else{
$storage = $skbytes . " KiloBytes";
}
}
if(defined($opt_d) && defined($opt_t)){
push @array, "$subdir,$throughput,$storage";
}elsif(defined($opt_d)){
push @array, "$subdir,$storage";
}elsif(defined($opt_t)){
push @array, "$subdir,$throughput";
}else{
print "syntax error\n";
syntax();
}
}
if($opt_e){
$boundary="asfsdf2asdsdias4fJK";
open(S, "| /usr/lib/sendmail -t") || die "cannot fork sendmail: $!\n";
print S "From: Webserver \n",
"To: SysOp \n",
"Subject: WebSite Utilizations\n",
"Mime-Version: 1.0\n",
"Content-Type: multipart/mixed; boundary=\"$boundary\"\n",
"Content-Disposition: inline\n",
"\n",
"--$boundary\n",
"Content-Type: text/plain; charset=us-ascii\n",
"Content-Disposition: inline\n",
"\n",
"Enclosed is website-util.csv - double click the attachment to view utilizations in Excel.\n",
"showing utilization between $period and " . `date "+%Y%m%d %H:%M:%S"`,
"\n",
"--$boundary\n",
"Content-Type: text/plain; charset=us-ascii\n",
"Content-Disposition: attachment; filename=\"website-util.csv\"\n",
"\n";
foreach(@array){
print S "$_\n";
}
print S "--$boundary--\n";
close S;
}else{
print "showing stats between $period and " . `date "+%Y%m%d %H:%M:%S"`;
foreach(@array){
print "$_\n";
}
}
sub syntax {
die "syntax: webutil.pl [-t daily|weekly|monthly] [-d] [-e] [-h]\n",
"where: -t calculate throughput over this period (daily, weekly, or monthly)\n",
" -d calculate disk usage\n",
" -e email results\n",
" -h this help screen\n";
}