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");