html/sysinfo277-irssi.pl
1 #!/usr/bin/perl -w
2 #
3 # Copyright (c) 2002, 2003 David Rudie
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 # SUCH DAMAGE.
26 #
27 # $ident: sysinfo277-irssi.pl,v 2.77 2003/09/01 04:20:02 drudie Exp $
28 #
29
30
31 $VERSION = '2.77';
32 %IRSSI = (
33 authors => 'David Rudie',
34 contact => 'david@inexistent.com',
35 name => 'SysInfo',
36 description => 'Cross-platform/architecture system information script.',
37 license => 'BSD',
38 url => 'http://www.inexistent.com/',
39 changed => 'Mon Sep 01 04:20 PDT 2003',
40 bugs => 'Probably some if it cannot read /proc.'
41 );
42
43
44 use Irssi;
45 use POSIX qw(floor);
46 use strict;
47
48
49 # Set up the arrays and variables first.
50 use vars qw(
51 @arr
52 @arr1
53 @arr2
54 $cpu
55 @cpu
56 @cpuinfo
57 $data
58 @data
59 $df
60 @dmesgboot
61 @hinv
62 @meminfo
63 $mhz
64 @mhz
65 $model
66 @netdev
67 @netstat
68 @nic
69 @nicname
70 $smp
71 @smp
72 $stream
73 $sysctl
74 @uptime
75 $var
76 $vara
77 $varb
78 $varc
79 $vard
80 $varh
81 $varm
82 $varp
83 $varx
84 $vary
85 $varz
86 );
87
88
89 my $os = `uname -s`; chop($os);
90 my $osn = `uname -n`; chop($osn);
91 my $osv = `uname -r`; chop($osv);
92 my $osm = `uname -m`; chop($osm);
93 my $uname = "$os $osv/$osm";
94
95
96 my $darwin = 1 if $os =~ /^Darwin$/;
97 my $freebsd = 1 if $os =~ /^FreeBSD$/;
98 my $linux = 1 if $os =~ /^Linux$/;
99 my $netbsd = 1 if $os =~ /^NetBSD$/;
100 my $openbsd = 1 if $os =~ /^OpenBSD$/;
101 my $irix = 1 if $os =~ /^IRIX$/;
102 my $irix64 = 1 if $os =~ /^IRIX64$/;
103
104
105 my $alpha = 1 if $osm =~ /^alpha$/;
106 my $armv4l = 1 if $osm =~ /^armv4l$/;
107 my $armv5l = 1 if $osm =~ /^armv5l$/;
108 my $i586 = 1 if $osm =~ /^i586$/;
109 my $i686 = 1 if $osm =~ /^i686$/;
110 my $ia64 = 1 if $osm =~ /^ia64$/;
111 my $mips = 1 if $osm =~ /^mips$/;
112 my $parisc64 = 1 if $osm =~ /^parisc64$/;
113 my $ppc = 1 if $osm =~ /^ppc$/;
114 my $x86_64 = 1 if $osm =~ /^x86_64$/;
115
116
117 my $l26 = 1 if $osv =~ /^2\.6/;
118
119
120 sub cmd_sysinfo {
121 # Specify your NIC interface name (eth0, rl0, fxp0, etc) and a name for it.
122 #
123 # Example: @nic = ('eth0', 'eth1');
124 # @nicname = ('External', 'Internal');
125 #
126 # NOTE: If you set one then you HAVE to set the other.
127 @nic = split(/;/, Irssi::settings_get_str('sysinfo_nics'));
128 @nicname = split(/;/, Irssi::settings_get_str('sysinfo_nicnames'));
129
130
131 # These are the default settings for which information gets displayed.
132 # 0 = Off; 1 = On
133 my $showHostname = 1;
134 my $showOS = 1;
135 my $showCPU = 1;
136 my $showProcesses = 1;
137 my $showUptime = 1;
138 my $showLoadAverage = 1;
139 my $showBattery = 0;
140 my $showMemoryUsage = 1;
141 my $showDiskUsage = 1;
142 my $showNetworkTraffic= 1;
143
144
145 ###############################################
146 ### Nothing below here should need changed. ###
147 ###############################################
148
149
150 if($linux) {
151 @cpuinfo = &openfile("/proc/cpuinfo");
152 @meminfo = &openfile("/proc/meminfo");
153 @netdev = &openfile("/proc/net/dev");
154 @uptime = &openfile("/proc/uptime");
155 } elsif($irix || $irix64) {
156 @hinv = `hinv`;
157 } else {
158 @dmesgboot = &openfile("/var/run/dmesg.boot");
159 @netstat = `netstat -ibn`;
160 if($darwin) {
161 $sysctl = '/usr/sbin/sysctl';
162 } else {
163 $sysctl = '/sbin/sysctl';
164 }
165 }
166
167
168 if($armv4l || $armv5l) {
169 $df = 'df -k';
170 } else {
171 $df = 'df -lk';
172 }
173
174
175 if($showCPU) {
176 if($freebsd) {
177 if($alpha) {
178 @cpu = grep(/^COMPAQ/, @dmesgboot);
179 $cpu = join("\n", $cpu[0]);
180 } else {
181 @cpu = grep(/CPU: /, @dmesgboot);
182 $cpu = join("\n", @cpu);
183 @cpu = split(/: /, $cpu);
184 $cpu = $cpu[1];
185 @smp = grep(/ cpu/, @dmesgboot);
186 $smp = scalar @smp;
187 }
188 }
189 if($netbsd) {
190 if($alpha) {
191 @cpu = grep(/^COMPAQ/, @dmesgboot);
192 $cpu = join("\n", $cpu[0]);
193 @cpu = split(/, /, $cpu);
194 $cpu = $cpu[0];
195 } else {
196 @cpu = grep(/cpu0: /, @dmesgboot);
197 @cpu = grep(!/apic/, @cpu);
198 $cpu = join("\n", $cpu[0]);
199 @cpu = split(/: /, $cpu);
200 $cpu = $cpu[1];
201 @smp = grep(/cpu\d+:/, @dmesgboot);
202 @smp = grep(/MHz/, @smp);
203 $smp = scalar @smp;
204 }
205 }
206 if($openbsd) {
207 @cpu = grep(/cpu0: /, @dmesgboot);
208 @cpu = grep(/[M|G]Hz/, @cpu);
209 $cpu = join("\n", @cpu);
210 @cpu = split(/: /, $cpu);
211 $cpu = $cpu[1];
212 }
213 if($irix || $irix64) {
214 @cpu = grep(/CPU:/, @hinv);
215 $cpu = join("\n", @cpu);
216 $cpu =~ s/^.*(R[0-9]*) .*$/$1/;
217 @mhz = grep(/MHZ/, @hinv);
218 $mhz = join("\n", @mhz);
219 $mhz = $mhz[0];
220 $mhz =~ s/^.* ([0-9]*) MHZ.*$/$1/;
221 @smp = grep(/ IP/, @hinv);
222 $smp = scalar @smp;
223 chop($cpu);
224 chop($mhz);
225 $cpu = "MIPS $cpu ($mhz MHz)";
226 }
227 if($linux) {
228 if($alpha) {
229 $cpu = &cpuinfo("cpu\\s+: ");
230 $model = &cpuinfo("cpu model\\s+: ");
231 $cpu = "$cpu $model";
232 $smp = &cpuinfo("cpus detected\\s+: ");
233 }
234 if($armv4l || $armv5l) {
235 $cpu = &cpuinfo("Processor\\s+: ");
236 }
237 if($i686 || $i586 || $x86_64) {
238 $cpu = &cpuinfo("model name\\s+: ");
239 $cpu =~ s/(.+) CPU family\t+\d+MHz/$1/g;
240 $cpu =~ s/(.+) CPU .+GHz/$1/g;
241 $mhz = &cpuinfo("cpu MHz\\s+: ");
242 $cpu = "$cpu ($mhz MHz)";
243 @smp = grep(/processor\s+: /, @cpuinfo);
244 $smp = scalar @smp;
245 }
246 if($ia64) {
247 $cpu = &cpuinfo("vendor\\s+: ");
248 $model = &cpuinfo("family\\s+: ");
249 $mhz = &cpuinfo("cpu MHz\\s+: ");
250 $mhz = sprintf("%.2f", $mhz);
251 $cpu = "$cpu $model ($mhz MHz)";
252 @smp = grep(/processor\s+: /, @cpuinfo);
253 $smp = scalar @smp;
254 }
255 if($mips) {
256 $cpu = &cpuinfo("cpu\\s+: ");
257 $model = &cpuinfo("cpu model\\s+: ");
258 $cpu = "$cpu $model";
259 }
260 if($parisc64) {
261 $cpu = &cpuinfo("cpu\\s+: ");
262 $model = &cpuinfo("model name\\s+: ");
263 $mhz = &cpuinfo("cpu MHz\\s+: ");
264 $mhz = sprintf("%.2f", $mhz);
265 $cpu = "$model $cpu ($mhz MHz)";
266 }
267 if($ppc) {
268 $cpu = &cpuinfo("cpu\\s+: ");
269 $mhz = &cpuinfo("clock\\s+: ");
270 if($cpu =~ /^9.+/) {
271 $model = "IBM PowerPC G5";
272 } elsif($cpu =~ /^74.+/) {
273 $model = "Motorola PowerPC G4";
274 } else {
275 $model = "IBM PowerPC G3";
276 }
277 $cpu = "$model $cpu ($mhz)";
278 }
279 } elsif($darwin) {
280 $cpu = `hostinfo | grep 'Processor type' | cut -f2 -d':'`; chomp($cpu);
281 $cpu =~ s/^\s*(.+)\s*$/$1/g;
282 if($cpu =~ /^ppc7.+/) {
283 $cpu = "Motorola PowerPC G4";
284 }
285 $mhz = `$sysctl -n hw.cpufrequency`; chomp($mhz);
286 $mhz = sprintf("%.2f", $mhz / 1000000);
287 $cpu = "$cpu ($mhz MHz)";
288 $smp = `hostinfo | grep "physically available" | cut -f1 -d' '`; chomp($smp);
289 }
290 if($smp && $smp gt 1) {
291 $cpu = "$smp x $cpu";
292 }
293 }
294
295
296 my $output;
297 if($showHostname) { $output = "Hostname: $osn - "; }
298 if($showOS) { $output .= "OS: $uname - "; }
299 if($showCPU) { $output .= "CPU: $cpu - "; }
300 if($showProcesses) { $output .= "Processes: ".&processes." - "; }
301 if($showUptime) { $output .= "Uptime: ".&uptime." - "; }
302 if($showLoadAverage) { $output .= "Load Average: ".&loadaverage." - "; }
303 if($showBattery) { $output .= "Battery: ".&battery." - "; }
304 if($showMemoryUsage) { $output .= "Memory Usage: ".&memoryusage." - "; }
305 if($showDiskUsage) { $output .= "Disk Usage: ".&diskusage." - "; }
306 if($showNetworkTraffic) { $output .= &networktraffic; }
307 $output =~ s/ - $//g;
308 Irssi::active_win()->command("/ $output");
309 return 1;
310 }
311
312
313 sub battery {
314 $data = "";
315 if(open(FD, '/proc/apm')) {
316 while($stream = <FD>) {
317 $data .= $stream;
318 @data = split(/\n/, $data);
319 }
320 close(FD);
321 }
322 $data = $data[0];
323 $data =~ s/.+\s(\d+%).+/$1/;
324 return $data;
325 }
326
327
328 sub cpuinfo {
329 my $string = shift;
330 @arr = grep(/$string/, @cpuinfo);
331 $var = join("\n", $arr[0]);
332 @arr = split(/: /, $var);
333 $var = $arr[1];
334 return $var;
335 }
336
337
338 sub diskusage {
339 if($irix || $irix64) {
340 $vara = `$df | grep -v Filesystem | awk '{ sum+=\$3 / 1024 / 1024}; END { print sum }'`; chomp($vara);
341 $vard = `$df | grep -v Filesystem | awk '{ sum+=\$4 / 1024 / 1024}; END { print sum }'`; chomp($vard);
342 } else {
343 $vara = `$df | grep -v Filesystem | awk '{ sum+=\$2 / 1024 / 1024}; END { print sum }'`; chomp($vara);
344 $vard = `$df | grep -v Filesystem | awk '{ sum+=\$3 / 1024 / 1024}; END { print sum }'`; chomp($vard);
345 }
346 $varp = sprintf("%.2f", $vard / $vara * 100);
347 $vara = sprintf("%.2f", $vara);
348 $vard = sprintf("%.2f", $vard);
349 return $vard."GB/".$vara."GB ($varp%)";
350 }
351
352
353 sub loadaverage {
354 $var = `uptime`; chomp($var);
355 if($irix || $irix64 || $linux) {
356 @arr = split(/average: /, $var, 2);
357 } else {
358 @arr = split(/averages: /, $var, 2);
359 }
360 @arr = split(/, /, $arr[1], 2);
361 $var = $arr[0];
362 return $var;
363 }
364
365
366 sub meminfo {
367 my $string = shift;
368 @arr = grep(/$string/, @meminfo);
369 $var = join("\n", $arr[0]);
370 @arr = split(/\s+/, $var);
371 $var = $arr[1];
372 return $var;
373 }
374
375
376 sub memoryusage {
377 if($linux) {
378 if($l26) {
379 $vara = &meminfo("MemTotal:") * 1024;
380 $varb = &meminfo("Buffers:") * 1024;
381 $varc = &meminfo("Cached:") * 1024;
382 $vard = &meminfo("MemFree:") * 1024;
383 } else {
384 @arr = grep(/Mem:/, @meminfo);
385 $var = join("\n", @arr);
386 @arr = split(/\s+/, $var);
387 $vara = $arr[1];
388 $varb = $arr[5];
389 $varc = $arr[6];
390 $vard = $arr[3];
391 }
392 $vard = ($vara - $vard) - $varb - $varc;
393 } elsif($darwin) {
394 $vard = `vm_stat | grep 'Pages active' | awk '{print \$3}'` * 4096;
395 $vara = `$sysctl -n hw.physmem`;
396 } elsif($irix || $irix64) {
397 $var = `top -d1 | grep Memory`; chomp($var);
398 $vara = $var;
399 $vard = $var;
400 $vara =~ s/^.* ([0-9]*)M max.*$/$1/;
401 $vara *= 1024 * 1024;
402 $vard =~ s/^.* ([0-9]*)M free,.*$/$1/;
403 $vard = $vara - ($vard * 1024 * 1024);
404 } else {
405 $vard = `vmstat -s | grep 'pages active' | awk '{print \$1}'` * `vmstat -s | grep 'per page' | awk '{print \$1}'`;
406 $vara = `$sysctl -n hw.physmem`;
407 }
408 $varp = sprintf("%.2f", $vard / $vara * 100);
409 $vara = sprintf("%.2f", $vara / 1024 / 1024);
410 $vard = sprintf("%.2f", $vard / 1024 / 1024);
411 return $vard."MB/".$vara."MB ($varp%)";
412 }
413
414
415 sub networkinfobsd {
416 $varc = shift;
417 $vard = shift;
418 @arr = grep(/$varc/, @netstat);
419 @arr = grep(/Link/, @arr);
420 $var = join("\n", @arr);
421 @arr = split(/\s+/, $var);
422 $var = $arr[$vard] / 1024 / 1024;
423 $var = sprintf("%.2f", $var);
424 return $var;
425 }
426
427
428 sub networkinfolinux {
429 $varc = shift;
430 $vard = shift;
431 @arr = grep(/$varc/, @netdev);
432 $var = join("\n", @arr);
433 @arr = split(/:\s*/, $var);
434 @arr = split(/\s+/, $arr[1]);
435 $var = $arr[$vard] / 1024 / 1024;
436 $var = sprintf("%.2f", $var);
437 return $var;
438 }
439
440
441 sub networktraffic {
442 $vara = 0;
443 $varz = "";
444 $varb = scalar @nic;
445 if($nic[$vara] ne "") {
446 while($vara lt $varb) {
447 if($nic[$vara] ne "") {
448 if($darwin || $freebsd) {
449 $varx = &networkinfobsd($nic[$vara], 6);
450 $vary = &networkinfobsd($nic[$vara], 9);
451 }
452 if($netbsd || $openbsd) {
453 $varx = &networkinfobsd($nic[$vara], 4);
454 $vary = &networkinfobsd($nic[$vara], 5);
455 }
456 if($linux) {
457 $varx = &networkinfolinux($nic[$vara], 0);
458 $vary = &networkinfolinux($nic[$vara], 8);
459 }
460 $varz .= $nicname[$vara]." Traffic (".$nic[$vara]."): ".$varx."MB In/".$vary."MB Out - ";
461 }
462 $vara++;
463 }
464 return $varz;
465 }
466 }
467
468
469 sub openfile {
470 my $string = shift;
471 $data = "";
472 if(open(FD, $string)) {
473 while($stream = <FD>) {
474 $data .= $stream;
475 @data = split(/\n/, $data);
476 }
477 close(FD);
478 }
479 return @data;
480 }
481
482
483 sub processes {
484 if($irix || $irix64) {
485 $var = `ps -e | grep -v PID | wc -l`;
486 } else {
487 $var = `ps ax | grep -v PID | wc -l`;
488 }
489 chomp($var);
490 $var = $var;
491 $var =~ s/^\s+//;
492 $var =~ s/\s+$//;
493 return $var;
494 }
495
496
497 sub uptime {
498 if($irix || $irix64) {
499 $var = `uptime`; chomp($var);
500 if($var =~ /day/) {
501 $var =~ s/^.* ([0-9]*) day.* ([0-9]*):([0-9]*), .*$/$1d $2h $3m/;
502 } elsif($var =~/min/) {
503 $var =~ s/^.* ([0-9]*) min.*$/0d 0h $1m/;
504 } else {
505 $var =~ s/^.* ([0-9]*):([0-9]*),.*$/0d $1h $2m/;
506 }
507 return $var;
508 } else {
509 if($freebsd) {
510 $var = `$sysctl -n kern.boottime | awk '{print \$4}'`;
511 }
512 if($netbsd || $openbsd || $darwin) {
513 $var = `$sysctl -n kern.boottime`;
514 }
515 if($linux) {
516 @arr = split(/ /, $uptime[0]);
517 $varx = $arr[0];
518 } else {
519 chomp($var);
520 $var =~ s/,//g;
521 $vary = `date +%s`; chomp($vary);
522 $varx = $vary - $var;
523 }
524 $varx = sprintf("%2d", $varx);
525 $vard = floor($varx / 86400);
526 $varx %= 86400;
527 $varh = floor($varx / 3600);
528 $varx %= 3600;
529 $varm = floor($varx / 60);
530 if($vard eq 0) { $vard = ''; } elsif($vard >= 1) { $vard = $vard.'d '; }
531 if($varh eq 0) { $varh = ''; } elsif($varh >= 1) { $varh = $varh.'h '; }
532 if($varm eq 0) { $varm = ''; } elsif($varm >= 1) { $varm = $varm.'m'; }
533 return $vard.$varh.$varm;
534 }
535 }
536
537 Irssi::settings_add_str("sysinfo", "sysinfo_nics", "");
538 Irssi::settings_add_str("sysinfo", "sysinfo_nicnames", "");
539
540 Irssi::command_bind("sysinfo", "cmd_sysinfo");