--- projects/cms/source/host/generic/statgrab.pl 2001/02/05 17:13:26 1.26 +++ projects/cms/source/host/generic/statgrab.pl 2001/02/05 20:27:59 1.31 @@ -2,8 +2,8 @@ #----------------------------------------------------------------- # Machine statistics grabber -# $Author: pjm2 $ -# $Id: statgrab.pl,v 1.26 2001/02/05 17:13:26 pjm2 Exp $ +# $Author: tdb $ +# $Id: statgrab.pl,v 1.31 2001/02/05 20:27:59 tdb Exp $ # # A Perl script to return various information about a host machine # by examining the output of some common Unix/Linux commands. @@ -21,13 +21,43 @@ $| = 1; # You'd be silly not to use this ;) use strict; -# Paths -my($topbin) = "/usr/local/sbin/top"; -my($dfbin) = "/usr/bin/df"; -my($usersbin) = "/usr/ucb/users"; -my($unamebin) = "/usr/bin/uname"; -my($uptimebin) = "/usr/bin/uptime"; +# Have to hope this will work really. +my($ostype) = `uname -s`; chop($ostype); +# Decide which paths we should use. +my($topbin); my($dfbin); my($usersbin); my($unamebin); my($uptimebin); + +if ($ostype eq "SunOS") { + # covers: Solaris 8 + $topbin = "/usr/local/sbin/top -d2 -s1 0"; + $dfbin = "/usr/bin/df"; + $usersbin = "/usr/ucb/users"; + $unamebin = "/usr/bin/uname"; + $uptimebin = "/usr/bin/uptime"; +} +elsif ($ostype eq "Linux") { + # covers: Debian r2.2 + $topbin = "/usr/bin/top -d1 -n0 -b"; + $dfbin = "/bin/df"; + $usersbin = "/usr/bin/users"; + $unamebin = "/bin/uname"; + $uptimebin = "/usr/bin/uptime"; +} +elsif ($ostype eq "FreeBSD") { + # covers: FreeBSD 4.2-STABLE + $topbin = "/usr/bin/top -d2 -s1 0"; + $dfbin = "/bin/df"; + $usersbin = "/usr/bin/users"; + $unamebin = "/usr/bin/uname"; + $uptimebin = "/usr/bin/uptime"; +} +else { + print "statgrab.pl Error: Unable to identify system type - \"$ostype\".\n"; + print "\"uname -s\" does not report one of the following known types;\n"; + print " SunOS, Linux, FreeBSD\n"; + exit(1); +} + # Run the following components: - &print_ident(); &include_osver(); @@ -42,15 +72,11 @@ exit(0); - - - - # prints out an identifier for this version of statgrab.pl # the host should check this when reading data # means the host must be checked and updated to work with newer versions. sub print_ident() { - print 'version statgrab.pl $Revision: 1.26 $'; + print 'version statgrab.pl $Revision: 1.31 $'; print "\n"; } @@ -120,13 +146,10 @@ sub include_users() { sub include_top() { # Find out some numbers from top. - my(@top) = `$topbin -d2 -s1 0`; + my(@top) = `$topbin`; my($top) = join(" ", @top); $top =~ s/\n//g; - &print_pair(0, "packet.load.load1", $top =~ /load averages:\s*([^\s]+?),/); - &print_pair(0, "packet.load.load5", $top =~ /load averages:\s*.+?,\s*([^\s]+?),/); - &print_pair(0, "packet.load.load15", $top =~ /load averages:\s*.+?,\s*.+?,\s*([^\s]+?)\s/); &print_pair(0, "packet.processes.total", $top =~ /([^\s]+?) processes:/); &print_pair(0, "packet.processes.sleeping", $top =~ / ([^\s]+?) sleeping/); &print_pair(0, "packet.processes.zombie", $top =~ / ([^\s]+?) zombie/); @@ -185,35 +208,80 @@ sub include_osver() { } -# sub to get system uptime. +# sub to get system uptime in seconds. sub include_uptime() { + # debug stuff, all the different cases + + # normal + #my($uptime) = " 4:48pm up 49 day(s), 6:30, 201 users, load average: 0.33, 0.35, 0.38\n"; + # 0 days + #my($uptime) = " 4:48pm up 6:30, 201 users, load average: 0.33, 0.35, 0.38\n"; + # 0 hours + #my($uptime) = " 4:48pm up 49 day(s), 30 min(s), 201 users, load average: 0.33, 0.35, 0.38\n"; + # 0 mins + #my($uptime) = " 4:48pm up 49 day(s), 6 hr(s), 201 users, load average: 0.33, 0.35, 0.38\n"; + # 0 days and 0 mins + #my($uptime) = " 4:48pm up 6 hr(s), 201 users, load average: 0.33, 0.35, 0.38\n"; + # 0 days and 0 hours + #my($uptime) = " 4:48pm up 30 min(s), 201 users, load average: 0.33, 0.35, 0.38\n"; + # 0 hours and 0 mins + #my($uptime) = " 4:48pm up 49 day(s), 201 users, load average: 0.33, 0.35, 0.38\n"; + # grab the uptime my($uptime) = `$uptimebin`; + + &print_pair(0, "packet.load.load1", $uptime =~ /load average.?:\s*([^\s]+?),/); + &print_pair(0, "packet.load.load5", $uptime =~ /load average.?:\s*.+?,\s*([^\s]+?),/); + &print_pair(0, "packet.load.load15", $uptime =~ /load average.?:\s*.+?,\s*.+?,\s*([^\s]+)/); # work out the days, hours, and minutes - if ($uptime =~ /hr/) { - # 0 minutes - $uptime =~ s/up ([0-9]+) .*, ([0-9]+) .*,/$1:$2:0/; - } - elsif ($uptime =~ /min/) { - # 0 hours - $uptime =~ s/up ([0-9]+) .*, ([0-9]+) .*,/$1:0:$2/; - } - elsif ($uptime =~ /day/) { + + if ($uptime =~ /day.*,\s+([0-9]+):([0-9]+)/) { # normal - $uptime =~ s/up ([0-9]+) .*, ([0-9]+):([0-9]+)/$1:$2:$3/; + $uptime =~ /up\s+([0-9]+)\s+.*,\s+([0-9]+):([0-9]+)/; + $uptime = "$1:$2:$3"; } else { - # 0 days - $uptime =~ s/up ([0-9]+):([0-9]+)/0:$1:$2/; + if ($uptime =~ /day/) { + if ($uptime =~ /hr/) { + # 0 minutes + $uptime =~ /up\s+([0-9]+)\s+.*,\s+([0-9]+)\s+.*,/; + $uptime = "$1:$2:0"; + } + elsif ($uptime =~ /min/) { + # 0 hours + $uptime =~ /up\s+([0-9]+)\s+.*,\s+([0-9]+)\s+.*,/; + $uptime = "$1:0:$2"; + } + else { + # 0 hours and 0 mins + $uptime =~ /up\s+([0-9]+)/; + $uptime = "$1:0:0"; + } + } + elsif ($uptime =~ /hr/) { + # 0 days and 0 minutes + $uptime =~ /up\s+([0-9]+)\s+/; + $uptime = "0:$1:0"; + } + elsif ($uptime =~ /min/) { + # 0 days and 0 hours + $uptime =~ /up\s+([0-9]+)\s+/; + $uptime = "0:0:$1"; + } + else { + # 0 days + $uptime =~ /up\s+([0-9]+):([0-9]+)/; + $uptime = "0:$1:$2"; + } } - # turn into minutes - + # turn into seconds $uptime =~ /([0-9]+):([0-9]+):([0-9]+)/; - $uptime = $3 + ($2 + $1*24)*60; - + $uptime = ($3+($2+($1*24))*60)*60; + + # print the value out &print_pair("unknown", "packet.os.uptime", $uptime); }