diff options
Diffstat (limited to 'scripts/sysinfo_dg.pl')
-rw-r--r-- | scripts/sysinfo_dg.pl | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/scripts/sysinfo_dg.pl b/scripts/sysinfo_dg.pl new file mode 100644 index 0000000..360a916 --- /dev/null +++ b/scripts/sysinfo_dg.pl @@ -0,0 +1,330 @@ +#!/usr/bin/perl +use strict; +use Irssi 20011210.0250 (); +use vars qw($VERSION %IRSSI); +$VERSION = "1.3"; +%IRSSI = ( + authors => 'David Leadbeater', + contact => 'dgl@dgl.cx', + name => 'sysinfo-dg', + description => 'Adds a /sysinfo command which prints system information (linux only).', + license => 'GNU GPLv2 or later', + url => 'http://irssi.dgl.cx/', +); + +#This script is mostly my own work but some ideas where taken from /sinfo by +#Laurens Buhler and Alain van Acker. Please leave this credit in the script and +#if you edit it and think the change is worthwhile tell me and i may add it into +#the script and credit you + +use vars qw/$colour $graphs $graphs2 $colour2 $style/; +Irssi::command_bind("sysinfo","sysinfo"); + +sub sysinfo{ + my @options = split(/ /,$_[0]); + my %info; + my($hostname,$uname,$procs) = basicinfo(); + my($distro) = distro(); + my($uptime,$users,$loadavg) = uptime(); + my($memsize,$memfree) = meminfo(); + my($swapsize,$swapfree) = swapinfo(); + my($cpumodel,$cpumhz,$cpucache,$bogomips) = cpuinfo(); + my %netinfo = netinfo(); + my($disktotal,$diskused,$hddtype) = df(); + my($videocard,$ethernet) = pciinfo(); + my($screenres,$screendepth); + ($screenres,$screendepth) = screenres() if $ENV{DISPLAY}; + + ($colour,$graphs,$graphs2,$colour2,$style) = parseoptions(\%netinfo,@options); + + %info = ( + 'os' => "$uname - $distro", + 'up' => $uptime, + 'cpu' => "$cpumodel, $cpumhz MHz ($bogomips bogomips)", + 'cache' => $cpucache, + 'mem' => ($memsize-$memfree) . "/$memsize MB (" . percent(($memsize-$memfree),$memsize) . ")", + 'host' => $hostname, + 'users' => $users, + 'load' => $loadavg, + 'procs' => $procs, + 'swap' => ($swapsize-$swapfree) . "/$swapsize MB (" . percent(($swapsize-$swapfree),$swapsize) . ")", + 'disk' => "$diskused/$disktotal MB (" . percent($diskused,$disktotal) . ") ($hddtype)", + 'video' => "$videocard at $screenres ($screendepth bits)", + 'ethernet' => $ethernet, + ); + + for(keys %netinfo){ + $info{$_} = "in: $netinfo{$_}{in} MB, out: $netinfo{$_}{out} MB"; + } + + my $tmp; + for(split(/ /,$style)){ + $tmp .= ircbit($_,$info{$_}) . " "; + } + $tmp =~ s/ $//; + Irssi::active_win()->command('say ' . $tmp); + ($colour,$graphs,$graphs2,$colour2,$style) = undef; +} + +sub parseoptions{ + my($netinfo,@options) = @_; + + my $tmp = shift(@options) if $options[0] =~ /^\-/; + $tmp =~ s/^\-//; + for(split //,$tmp){ + if($_ eq "c"){ + $tmp =~ /c(\d+)/; + $colour = $1; + if(!$colour){ + $colour = 3; + } + }elsif($_ eq "g"){ + $tmp =~ /g(\d+)/; + $graphs = $1; + if(!$graphs){ + $graphs = 9; + } + }elsif($_ eq "G"){ + $tmp =~ /G(\d+)/; + $graphs2 = $1; + }elsif($_ eq "C"){ + $tmp =~ /C(\d+)/; + $colour2 = $1; + } + } + if(!defined $colour2 && $colour){ + $colour2 = 15; + } + if(defined $graphs && !defined $graphs2){ + $graphs2 = 3; + } + +# We got the names on the command line + if($options[1]){ + $style = join(" ",@options); +# style name + }elsif($options[0]){ + if($options[0] eq "std"){ + $style = "os up cpu mem video"; + }elsif($options[0] eq "bigger"){ + $style = "os up cpu cache mem load procs disk video"; + }elsif($options[0] eq "full"){ + $style = "host os up cpu cache mem users load procs swap disk video ethernet ".join(" ",keys %{$netinfo}); + }elsif($options[0] eq "net"){ + $style = join(" ",keys %{$netinfo}); + }elsif($options[0] eq "uptime"){ + $style = "os up"; + }elsif($options[0] eq "use"){ + $style = "mem swap disk"; + } + }else{ +# no input - default + $style = "os up cpu mem video"; + } + + return($colour,$graphs,$graphs2,$colour2,$style); +} + +sub ircbit{ + my($name,$text) = @_; + $name = " " . $name if $name =~ /^\d/; + $text = " " . $text if $text =~ /^\d/; + if($colour){ + return "$colour$name$colour2\[$text$colour2\]"; + }else{ + return "$name\[$text\]"; + } +} + +sub percent{ + my $percent = ($_[1] != 0) ? sprintf("%.1f",(($_[0]/$_[1])*100)) : 0; + if($graphs){ + my $tmp = "["; + for(1..10){ + if($_ > sprintf("%.0f",$percent / 10)){ + $tmp .= "-" if !defined $colour; + $tmp .= "$graphs2-" if defined $colour; + }else{ + $tmp .= "|" if !defined $colour; + $tmp .= "$graphs|" if defined $colour; + } + } + $tmp .= "]"; + return $percent."% ".$tmp; + } + return $percent."%"; +} + +sub uptime{ + my $uptimeinfo = `uptime`; + if ($uptimeinfo =~ /^\s+(\d+:\d+\w+|\d+:\d+:\d+)\s+up\s+(\d+)\s+day.?\W\s+(\d+):(\d+)\W\s+(\d+)\s+\w+\W\s+\w+\s+\w+\W\s+(\d+).(\d+)/igx) { + return("$2 days, $3 hours, $4 minutes", $5, "$6.$7"); + }elsif ($uptimeinfo =~ /^\s+(\d+:\d+\w+|\d+:\d+:\d+)\s+up+\s+(\d+):(\d+)\W\s+(\d+)\s+\w+\W\s+\w+\s+\w+\W\s+(\d+).(\d+)/igx) { + return("$2 hours, $3 minutes", $4, "$5.$6"); + }elsif ($uptimeinfo =~ /^\s+(\d+:\d+\w+|\d+:\d+:\d+)\s+up\s+(\d+)\s+day.?\W\s+(\d+)\s+min\W\s+(\d+)\s+\w+\W\s+\w+\s+\w+\W\s+(\d+).(\d+)/igx) { + return("$2 days, $3 minutes", $4, "$5.$6"); + }elsif ($uptimeinfo =~ /^\s+(\d+:\d+\w+|\d+:\d+:\d+)\s+up+\s+(\d+)\s+min\W\s+(\d+)\s+\w+\W\s+\w+\s+\w+\W\s+(\d+).(\d+)/igx) { + return("$2 minutes", $3, "$4.$5"); + } + return undef; +} + +sub meminfo{ + my($memsize,$memfree); + open(MEMINFO, "<", "/proc/meminfo") or return undef; + while(<MEMINFO>){ + chomp; + if(/^MemTotal:\s+(\d+)/){ + $memsize = sprintf("%.2f",$1/1024); + }elsif(/^MemFree:\s+(\d+)/){ + $memfree = sprintf("%.2f",$1/1024); + } + } + close(MEMINFO); + return($memsize,$memfree); +} + +sub swapinfo{ + my($swapsize,$swapused); + open(SWAPINFO, "<", "/proc/swaps"); + while(<SWAPINFO>){ + chomp; + next if !/^\//; + /\S+\s+\S+\s+(\S+)\s+(\S+)/; + $swapsize += $1; + $swapused += $2; + } + close(SWAPINFO); + my $swapfree = sprintf("%.2f",($swapsize - $swapused) / 1024); + $swapsize = sprintf("%.2f", $swapsize / 1024); + return($swapsize,$swapfree); +} + +sub netinfo{ + my(%netinfo); + open(NETINFO, "<", "/proc/net/dev") or return undef; + while(<NETINFO>){ + chomp; + next if /^(\s+)?(Inter|face|lo)/; + /^\s*(\w+):\s*(\d+)\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+(\d+)\s+/; + $netinfo{$1}{in} = sprintf("%.2f",$2 / 1048576); + $netinfo{$1}{out} = sprintf("%.2f",$3 / 1048576); + } + close(NETINFO); + return %netinfo; +} + +sub distro{ + my $distro; + if(-f "/etc/coas"){ + $distro = firstline("/etc/coas"); + }elsif(-f "/etc/environment.corel"){ + $distro = firstline("/etc/environment.corel"); + }elsif(-f "/etc/debian_version"){ + $distro = "Debian ".firstline("/etc/debian_version"); + }elsif(-f "/etc/mandrake-release"){ + $distro = firstline("/etc/mandrake-release"); + }elsif(-f "/etc/SuSE-release"){ + $distro = firstline("/etc/SuSE-release"); + }elsif(-f "/etc/turbolinux-release"){ + $distro = firstline("/etc/turbolinux-release"); + }elsif(-f "/etc/slackware-release"){ + $distro = firstline("/etc/slackware-release"); + }elsif(-f "/etc/redhat-release"){ + $distro = firstline("/etc/redhat-release"); + } + return $distro; +} + +sub df{ + my($disktotal,$diskused,$mainhd); + for(`df`){ + chomp; + next if !/^\/dev\/\S+/; + next if /(cd|cdrom|fd|floppy)/; + /^(\S+)\s+(\S+)\s+(\S+)/; + $mainhd = $1 if !defined $mainhd; + next if not defined $1 or not defined $2; + $disktotal += $2; + $diskused += $3; + } + $disktotal = sprintf("%.2f",$disktotal / 1024); + $diskused = sprintf("%.2f",$diskused / 1024); + + $mainhd =~ s/\/dev\/([a-z]+)\d+/$1/; + my $hddtype = firstline("/proc/ide/$mainhd/model"); + + return($disktotal,$diskused,$hddtype); +} + +sub basicinfo{ + my($hostname,$sysinfo,$procs); + chomp($hostname = `hostname`); + chomp($sysinfo = `uname -sr`); + opendir(PROC, "/proc"); + $procs = scalar grep(/^\d/,readdir PROC); + return($hostname,$sysinfo,$procs); +} + +sub cpuinfo{ + my($cpumodel,$cpusmp,$cpumhz,$cpucache,$bogomips); + open(CPUINFO, "<", "/proc/cpuinfo") or return undef; + while(<CPUINFO>){ + if(/^model name\s+\:\s+(.*?)$/){ + if(defined $cpumodel){ + if(defined $cpusmp){ + $cpusmp++; + }else{ + $cpusmp=2; + } + }else{ + $cpumodel = $1; + } + }elsif(/^cpu MHz\s+:\s+([\d\.]*)/){ + $cpumhz = $1; + }elsif(/^cache size\s+:\s+(.*)/){ + $cpucache = $1; + }elsif(/^bogomips\s+:\s+([\d\.]*)/){ + $bogomips += $1; + } + } + $cpumodel .= " SMP ($cpusmp processors)" if defined $cpusmp; + return($cpumodel,$cpumhz,$cpucache,$bogomips); +} + +sub pciinfo{ + my($videocard,$ethernet); + open(PCI, "-|", "/sbin/lspci") or return undef; + while(<PCI>){ + chomp; + if(/VGA compatible controller: (.*?)$/){ + $videocard .= "${1}+ "; + }elsif(/(Ethernet|Network) controller: (.*?)$/){ + $ethernet = $1; + } + } + close(PCI); + $videocard =~ s/\+ $//; + return($videocard,$ethernet); +} + +sub screenres{ + my ($res,$depth); + for(`xdpyinfo`){ + if(/\s+dimensions:\s+(\S+)/){ + $res = $1; + }elsif(/\s+depth:\s+(\S+)/){ + $depth = $1; + } + } + return($res,$depth); +} + +sub firstline{ + my $file = shift; + open(FILE, "<", $file) or return undef; + chomp(my $line = <FILE>); + close(FILE); + return $line; +} + |