ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/host/generic/statgrab.pl
Revision: 1.21
Committed: Sun Feb 4 23:40:39 2001 UTC (23 years, 7 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.20: +30 -4 lines
Log Message:
Now gets the uptime in a way that should work for all those "odd" cases.
This could probably be done much neater than it is right now.
Also not tested on other platforms yet, just Solaris.

File Contents

# User Rev Content
1 pjm2 1.1 #!/usr/bin/perl -w
2    
3     #-----------------------------------------------------------------
4     # Machine statistics grabber
5 tdb 1.20 # $Author: tdb1 $
6 tdb 1.21 # $Id: statgrab.pl,v 1.20 2001/02/04 22:38:41 tdb1 Exp $
7 pjm2 1.1 #
8     # A Perl script to return various information about a host machine
9     # by examining the output of some common Unix/Linux commands.
10     # This is a stopgap to act as a generic way of collecting the
11     # data. It is perhaps more reliable than the current Java host
12     # at doing this and it can obviously be used by a C++ program as
13     # well until the C++ host is ready to find the information out
14     # itself.
15     #-----------------------------------------------------------------
16    
17    
18     $| = 1;
19    
20    
21     # You'd be silly not to use this ;)
22     use strict;
23    
24 pjm2 1.18 # Paths
25 tdb 1.13 my($topbin) = "/usr/local/sbin/top";
26     my($dfbin) = "/usr/bin/df";
27     my($usersbin) = "/usr/ucb/users";
28     my($unamebin) = "/usr/bin/uname";
29 tdb 1.17 my($uptimebin) = "/usr/bin/uptime";
30 tdb 1.13
31 pjm2 1.6 # Run the following components: -
32 tdb 1.3 &print_ident();
33 tdb 1.2 &include_osver();
34 tdb 1.17 &include_uptime();
35 pjm2 1.1 &include_users();
36     &include_top();
37 pjm2 1.5 &include_disk();
38 pjm2 1.1
39 pjm2 1.6 # End the program normally.
40 pjm2 1.1 exit(0);
41    
42    
43    
44 pjm2 1.6
45    
46    
47    
48    
49 tdb 1.3 # prints out an identifier for this version of statgrab.pl
50     # the host should check this when reading data
51     # means the host must be checked and updated to work with newer versions.
52     sub print_ident() {
53 tdb 1.21 print 'version statgrab.pl $Revision: 1.20 $';
54 tdb 1.3 print "\n";
55     }
56 pjm2 1.1
57     # sub to print pairs of data, separated by a single space character.
58 pjm2 1.5 # If the second argument is undefined, then the pair is still printed,
59     # however, the value shall be displayed as the string "unknown".
60 pjm2 1.8 # If $type is non-zero, then "0" is printed instead of "unknown".
61     sub print_pair($$$) {
62     my($type, $name, $value) = @_;
63 pjm2 1.1
64     if (!defined $value) {
65 pjm2 1.8 if ($type) {
66 pjm2 1.9 $value = "0.00";
67 pjm2 1.8 }
68     else {
69     $value = "unknown";
70     }
71 pjm2 1.1 }
72    
73     # Remove the trailing linefeed if we've not already done so.
74     chomp($value);
75    
76     # print the pair of data with a space inbetween.
77     print "$name $value\n";
78     }
79    
80    
81 pjm2 1.5 # sub to find out disk partition information, if it exists.
82     sub include_disk() {
83    
84     # Run the df program.
85 tdb 1.13 my(@df) = `$dfbin -ak`;
86 pjm2 1.5
87     # Go through each line of the program, looking for each thing we want.
88     my($partition_no) = 0;
89     for (my($i) = 0; $i < $#df; $i++) {
90     my($line) = $df[$i];
91 pjm2 1.7 $line =~ /^(\/[^\s]*)\s*([0-9]*)\s*([0-9]*)\s*([0-9]*)\s*[^\s]*\s*(\/[^\s]*)\s*/;
92 pjm2 1.5 # $4 will not match unless everything before it does...
93 pjm2 1.7 if (defined $5) {
94     my ($filesystem, $kbytes, $used, $avail, $mount) = ($1, $2, $3, $4, $5);
95 pjm2 1.8 &print_pair(0, "packet.disk.p$partition_no.attributes.name", $filesystem);
96     &print_pair(1, "packet.disk.p$partition_no.attributes.kbytes", $kbytes);
97     &print_pair(1, "packet.disk.p$partition_no.attributes.used", $used);
98     &print_pair(1, "packet.disk.p$partition_no.attributes.avail", $avail);
99     &print_pair(0, "packet.disk.p$partition_no.attributes.mount", $mount);
100 pjm2 1.5 ++$partition_no;
101     }
102     }
103    
104     }
105    
106     # sub to find out the list of all (non-unique) usernames logged
107     # in to the machine and how many their are. (not
108 pjm2 1.1 sub include_users() {
109    
110     # Find out all users on this machine.
111 tdb 1.13 my($users) = `$usersbin`;
112 pjm2 1.16 $users = "\n" unless defined $users;
113     chop $users;
114 pjm2 1.14 my($users_count) = 0;
115     $users_count++ while $users =~ /\w+/g;
116 pjm2 1.18 my($users_list) = $users." ";
117 pjm2 1.1
118 pjm2 1.8 &print_pair(1, "packet.users.count", $users_count);
119     &print_pair(0, "packet.users.list", $users_list);
120 pjm2 1.1 }
121    
122    
123 pjm2 1.5 # sub to run a series of regexps on the output of 'top' to
124     # gather various machine statistics.
125 pjm2 1.1 sub include_top() {
126    
127     # Find out some numbers from top.
128 tdb 1.13 my(@top) = `$topbin -d2 -s1 0`;
129 pjm2 1.1 my($top) = join(" ", @top);
130     $top =~ s/\n//g;
131    
132 pjm2 1.8 &print_pair(1, "packet.load.load1", $top =~ /load averages:\s*([^\s]+?),/);
133     &print_pair(1, "packet.load.load5", $top =~ /load averages:\s*.+?,\s*([^\s]+?),/);
134 tdb 1.20 &print_pair(1, "packet.load.load15", $top =~ /load averages:\s*.+?,\s*.+?,\s*([^\s]+?)\s.*/);
135 pjm2 1.8 &print_pair(1, "packet.processes.total", $top =~ /([^\s]+?) processes:/);
136     &print_pair(1, "packet.processes.sleeping", $top =~ / ([^\s]+?) sleeping/);
137     &print_pair(1, "packet.processes.zombie", $top =~ / ([^\s]+?) zombie/);
138     &print_pair(1, "packet.processes.stopped", $top =~ / ([^\s]+?) stopped/);
139     &print_pair(1, "packet.processes.cpu", $top =~ /([^\s]+?)\s*on cpu/);
140     &print_pair(1, "packet.cpu.idle", $top =~ /([^\s]+?)% idle/);
141     &print_pair(1, "packet.cpu.user", $top =~ /([^\s]+?)% user/);
142     &print_pair(1, "packet.cpu.kernel", $top =~ /([^\s]+?)% kernel/);
143     &print_pair(1, "packet.cpu.iowait", $top =~ /([^\s]+?)% iowait/);
144     &print_pair(1, "packet.cpu.swap", $top =~ /([^\s]+?)% swap/);
145 pjm2 1.10
146     # The following need to be specified in megabytes.
147     # If they are preceeded by a G, then multiply by 1024.
148    
149     $top =~ /([^\s]+?)([MG]) real/;
150 pjm2 1.11 my($real) = $1;
151     $real*=1024 if $2 eq "G";
152 pjm2 1.10 &print_pair(1, "packet.memory.real", $real);
153    
154     $top =~ /([^\s]+?)([MG]) free/;
155 pjm2 1.11 my($free) = $1;
156     $free*=1024 if $2 eq "G";
157 pjm2 1.10 &print_pair(1, "packet.memory.free", $free);
158    
159     $top =~ /([^\s]+?)([MG]) swap in use/;
160 pjm2 1.11 my($swap_in_use) = $1;
161     $swap_in_use*=1024 if $2 eq "G";
162 pjm2 1.12 # DO NOT print this one out... save it for in a moment...
163 pjm2 1.10
164     $top =~ /([^\s]+?)([MG]) swap free/;
165 pjm2 1.11 my($swap_free) = $1;
166     $swap_free*=1024 if $2 eq "G";
167 pjm2 1.10 &print_pair(1, "packet.memory.swap_free", $swap_free);
168 pjm2 1.12
169     # AJ requested total swap instead of swap_in_use, so here we go!
170     &print_pair(1, "packet.memory.swap_total", $swap_free + $swap_in_use);
171 tdb 1.2 }
172    
173 pjm2 1.5 # sub to get details of the machine's operating system.
174 tdb 1.2 sub include_osver() {
175    
176     # Find out details about the operating system
177 pjm2 1.5 # If these values remain undefined, then the print_pair
178     # function shall show the value to be the string "unknown".
179 tdb 1.13 my($os_name) = `$unamebin -s`;
180     my($os_release) = `$unamebin -r`;
181     my($os_platform) = `$unamebin -m`;
182     my($os_sysname) = `$unamebin -n`;
183     my($os_version) = `$unamebin -v`;
184 tdb 1.2
185 pjm2 1.8 &print_pair(0, "packet.os.name", $os_name);
186     &print_pair(0, "packet.os.release", $os_release);
187     &print_pair(0, "packet.os.platform", $os_platform);
188     &print_pair(0, "packet.os.sysname", $os_sysname);
189     &print_pair(0, "packet.os.version", $os_version);
190 tdb 1.2
191 pjm2 1.1 }
192 tdb 1.17
193     # sub to get system uptime.
194     sub include_uptime() {
195    
196 tdb 1.21 # grab the uptime
197 tdb 1.17 my($uptime) = `$uptimebin`;
198 tdb 1.21
199     # work out the days, hours, and minutes
200     if ($uptime =~ /hr/) {
201     # 0 minutes
202     $uptime =~ /up ([0-9]+) .*, ([0-9]+) .*,/;
203     $uptime = "$1:$2:0";
204     }
205     elsif ($uptime =~ /min/) {
206     # 0 hours
207     $uptime =~ /up ([0-9]+) .*, ([0-9]+) .*,/;
208     $uptime = "$1:0:$2";
209     }
210     elsif ($uptime =~ /day/) {
211     # normal
212     $uptime =~ /up ([0-9]+) .*, ([0-9]+):([0-9]+)/;
213     $uptime = "$1:$2:$3";
214     }
215     else {
216     # 0 days
217     $uptime =~ /up ([0-9]+):([0-9]+)/;
218     $uptime = "0:$1:$2";
219     }
220    
221     # turn into minutes
222    
223     $uptime =~ /([0-9]+):([0-9]+):([0-9]+)/;
224     $uptime = $3 + ($2 + $1*24)*60;
225 tdb 1.17
226     &print_pair(0, "packet.os.uptime", $uptime);
227    
228 pjm2 1.18 }