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