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