#!/usr/bin/perl # System Information Script originally for X-Chat, by s0ulslack (Tony Annen) # Made compatible with the use strict; pragma by deitarion (Stephan Sokolow) # Distributed under the terms of the GNU General Public License, v2 or later # $Header: ~/.xchat2/yasis.pl,v 2.1.2 2005/09/05 23:41:44 $ # If you run into any trouble or need help, you can use http://soul.f2o.org/feedback.php # Automatically install this script for xchat by typing "./yasis-2.1.pl xchat_install" # at the bash prompt. # X-Chat commands: # # Name Command # /yasis Show your stats to the channel # /qyasis Print the stats to your screen but don't show everybody else # Known Bugs: # - Aliased sensor names in lm_sensors breaks YASIS's support for displaying the values. # changes in v2.1.2 (by Stephan Sokolow) ## YASIS now calculates disk usage (the percentage of free space) correctly. ## YASIS now ignores space in devices which don't start with a slash. ## This prevents Gentoo Linux's /lib/splash/cache parition from doubling calculated value. ## It also prevents RAM drives like /dev/shm and udev's /dev from being included. ## The processor activity at the time of the script's calling is now displayed. # changes in v2.1.1 (by Stephan Sokolow) ## YASIS can now be run as a normal X-Chat plugin/script ## Doesn't matter to normal users: YASIS now works with "use strict;" # changes in v2.1 ## added best uptime display to -u (uptime) switch ## output tweaked ## refreshed the comments above! ## added an install function (./yasis-2.1.pl xchat_install) ## \- moves yasis script from current directory to ~/.xchat2/yasis.pl ## \- adds /yasis and /yasishelp commands automatically to X-Chat (in ~/.xchat2/commands.conf) ## /yasishelp command echos commands and doesn't print them in the channel/msg ## includes (tries to anyway) linux distro/version in [OS] sections ## should detect multiple connections automagically (ppp0-2, lan) ## \- should display the network card/modem name of the default route ## \- pools packets for both devices for total In/Out Bytes use strict; #use warnings; #use diagnostics; my $xchat_plugin = 0; eval { Xchat::register( 'YASIS', '2.1', 'Yet Another System Info Script') }; if ($@) { $xchat_plugin = 0; } else { $xchat_plugin = 1; } # As of v2.1, $do_display and $do_temp are obsolete. # The display is automatically detected and added to the # full stats (-a) by default (use short (-s) to exclude video info) # The cpu tempurate is enabled if "sensors" is found #$do_display = 0; #$do_temp = 0; sub get_info { # Kernel Version my $uname = `uname -r`; chop ($uname); # CPU my $cpu_cnt = `cat /proc/cpuinfo | grep 'processor' | wc -l | sed 's/ *//'`; chomp($cpu_cnt); my $cache = `cat /proc/cpuinfo | grep 'cache size' | head -n 1 | sed -e 's/^.*: //'`; chomp($cache); my $bogomips = `cat /proc/cpuinfo | grep 'bogomips' | head -n 1 | sed -e 's/^.*: //'`; chomp($bogomips); # CPU Temp # TODO: Fix this. It breaks if the values are aliased my $do_temp; if (-x "sensors") { $do_temp=1; } else { $do_temp=0;} if ($do_temp == 1) { my $cpu_temp = `sensors | grep Temp3 | awk '{print \$2}' | sed 's/.*+//'`; chop($cpu_temp); my $cpu_temp1 = `sensors -f | grep Temp3 | awk '{print \$2}' | sed 's/.*+//'`; chop($cpu_temp1); my $cpu_rpm = `sensors | grep fan1 | awk '{print \$2,\$3}' | sed 's/.*+//'`; chop($cpu_rpm); } # CPU Usage my $avg_cpu_usage = +(split( /\s+/, (`vmstat`)[2] ))[13]; chop($avg_cpu_usage); # TODO: Actually use this value my $cpu_usage = `top -bn1 -p 1 | egrep -o "[0-9.]+% us," | egrep -o "[0-9.]+"`; chop($cpu_usage); # my $avg_cpu_usage = ((split( /\s+/, (`vmstat`)[2] ))[12]); # Memory my $mem_total = `free | grep Mem | awk '{printf (\"%dMb\", \$2/1024 )}'`; chop($mem_total); my $mem_free = `free | grep Mem | awk '{printf (\"%.0fMb\", ( \$3 -(\$6 + \$7) )/1024)}'`; chop($mem_free); my $mem_per = `free -m | grep Mem | awk '{printf (\"%.0f\", (\$2 - \$3 + \$6 + \$7) * (100/ \$2))}'`; # Video my ($do_display,$x,$vid_card,$screen_res,$screen_depth); $x = ""; if (-x "/usr/X11R6/bin/xdpyinfo") { $do_display=1; } else { $do_display=0;} if ($do_display == 1) { $vid_card = `cat /proc/pci | grep VGA | sed -e 's/.*: //' | sed 's/ (.*//' | sed 's/ATI//' | sed 's/Technologies//' | sed 's/Inc//' | sed 's/ //'`; chop($vid_card); $screen_res = `xdpyinfo | grep dimensions | awk '{print \$2}'`; chop($screen_res); $screen_depth = `xdpyinfo | grep "depth of root window" | awk '{print \$5}'`; chop($screen_depth); # Get Xorg/Xfree Version if ($x eq "") {$x = `xdpyinfo | grep XFree86"."version | awk '{print \$3}'`; if ($x ne "") {$x = "XFree86 $x";}} chomp($x); if ($x eq "") {$x = `xdpyinfo | grep X.Org"."version | awk '{print \$3}'`; if ($x ne "") {$x = "X.org $x";}} chomp($x); if ($x eq "") {$x = "Unknown";} } # Hard Drive my $hdspacet = `df | awk '{ if (substr(\$1,1,1) == "/") sum+=\$2/1024^2 }; END { printf (\"%.02fG\", sum )}'`; my $hdspaceu = `df | awk '{ if (substr(\$1,1,1) == "/") sum+=\$3/1024^2 }; END { printf (\"%.02fG\", sum )}'`; my $hdspacef = `df | awk '{ if (substr(\$1,1,1) == "/") sum+=\$4/1024^2 }; END { printf (\"%.02fG\", sum )}'`; my $hdpercent = sprintf("%.0f",(100/${hdspacet}*${hdspacef})); # Network (default and others) system(`/sbin/route -n > /tmp/rinfo`); open(ROUTE, "/tmp/rinfo") or die; my @rinfo = ; close(ROUTE) or die; my $line; my ($dest, $gate, $mask, $flags, $metric, $ref, $use, $face); my ($dest1, $gate1, $mask1, $flags1, $metric1, $ref1, $use1, $face1); foreach $line (@rinfo) { if($line=~/0.0.0.0/) { ($dest, $gate, $mask, $flags, $metric, $ref, $use, $face) = split(/\s+/, $line, 8); chomp($dest, $gate, $mask, $flags, $metric, $ref, $use, $face); } if ($line=~/192.168/) { ($dest1, $gate1, $mask1, $flags1, $metric1, $ref1, $use1, $face1) = split(/\s+/, $line, 8); chomp($dest1, $gate1, $mask1, $flags1, $metric1, $ref1, $use1, $face1); }; } if ($face1 eq $face) {$face1=""} my $ppp = `cat /proc/pci | grep Communication | sed 's/.*: //' | sed 's/ (.*//'`; chop($ppp); my $eth = `cat /proc/pci | grep Ethernet | sed 's/.*: //' | sed 's/ (.*//'`; chop($eth); my ($eth_name, $inet); my ($eth_name1, $inet1); if ($face eq "ppp0") {$eth_name=$ppp; $inet='ppp0';} elsif ($face eq "ppp1") {$eth_name=$ppp; $inet='ppp1';} elsif ($face eq "ppp2") {$eth_name=$ppp; $inet='ppp2';} if ($face eq "lan") {$eth_name=$eth; $inet='lan';} elsif ($face eq "lan") {$eth_name=$eth; $inet='lan';} elsif ($face eq "lan") {$eth_name=$eth; $inet='lan';} if ($face1 eq "lan") {$eth_name1=$eth; $inet1='lan';} elsif ($face1 eq "eth1") {$eth_name1=$eth; $inet1='eth1';} elsif ($face1 eq "eth2") {$eth_name1=$eth; $inet1='eth3';} if ($face && $face1) {$face="(${face}*, $face1)"} else {$face="($face)";} if ($face eq "") { $face="Unknown Device";} #$echk = `/sbin/ifconfig | grep eth | wc -l`; #$pchk = `/sbin/ifconfig | grep ppp | wc -l`; #if ($echk == 1) {$eth_name=$eth; $inet_dev=lan; $sc=1; } #if ($pchk == 1) {$eth_name=$ppp; $inet_dev=ppp0; $sc=2; } #if ($echk == 1 && $pchk == 1) {undef $sc; $eth_name ="Multiple Connections"; $inet_dev="2"; } #if ($echk == 0 && $pchk == 0) {$eth_name ="Unknown Connection"; } # Network Traffic my ($packet_in, $packet_out); if ($inet && $inet1) { my $packet_inp = `cat /proc/net/dev | grep $inet | awk -F: '/:/ {print \$2}' | awk '{printf \$1}'`; if($packet_inp < 1024**3) { $packet_inp = sprintf("%.02f",$packet_inp / 1024**2)."M"; } else { $packet_inp = sprintf("%.02f", $packet_inp / 1024**3)."G"; } my $packet_outp = `cat /proc/net/dev | grep $inet | awk -F: '/:/ {print \$2}' | awk '{print \$9}'`; if($packet_outp < 1024**3) { $packet_outp = sprintf("%.02f",$packet_outp / 1024**2)."M"; } else { $packet_outp = sprintf("%.02f", $packet_outp / 1024**3)."G"; } my $packet_ine = `cat /proc/net/dev | grep $inet1 | awk -F: '/:/ {print \$2}' | awk '{printf \$1}'`; if($packet_ine < 1024**3) { $packet_ine = sprintf("%.02f",$packet_ine / 1024**2)."M"; } else { $packet_ine = sprintf("%.02f", $packet_ine / 1024**3)."G"; } my $packet_oute = `cat /proc/net/dev | grep $inet1 | awk -F: '/:/ {print \$2}' | awk '{print \$9}'`; if($packet_oute < 1024**3) { $packet_oute = sprintf("%.02f",$packet_oute / 1024**2)."M"; } else { $packet_oute = sprintf("%.02f", $packet_oute / 1024**3)."G"; } $packet_in = $packet_inp+$packet_ine."M"; $packet_out = $packet_outp+$packet_oute."M"; } elsif ($inet) { $packet_in = `cat /proc/net/dev | grep $inet | awk -F: '/:/ {print \$2}' | awk '{printf \$1}'`; if($packet_in < 1024**3) { $packet_in = sprintf("%.02f",$packet_in / 1024**2)."M"; } else { $packet_in = sprintf("%.02f", $packet_in / 1024**3)."G"; } $packet_out = `cat /proc/net/dev | grep $inet | awk -F: '/:/ {print \$2}' | awk '{print \$9}'`; if($packet_out < 1024**3) { $packet_out = sprintf("%.02f",$packet_out / 1024**2)."M"; } else { $packet_out = sprintf("%.02f", $packet_out / 1024**3)."G"; } } else { $packet_in = "0.00M"; $packet_out = "0.00M"; } # uptime stuff my $uptime = `uptime`; chop ($uptime); $uptime =~ /.+ up (.+),.+[0-9]+ user/; $uptime = $1; # best uptime related my $buchk = `ls -asl ~/ | grep .buptime | wc -l`; if ($buchk eq "0") { system("cat /proc/uptime | awk '{printf \$1}' > ~/.buptime_uptime"); system("echo \"$uptime\" > ~/.buptime"); } my $cu = `cat /proc/uptime | awk '{printf \$1}'`; chomp($cu); my $bu = `cat ~/.buptime_uptime`; chomp($bu); my $buptime = `cat ~/.buptime | sed 's/ //'`; chomp($buptime); # Distro related my $distro = ""; if (-e "/etc/gentoo-release") {$distro = `cat /etc/gentoo-release | sed 's/version //'`;} if (-e "/etc/slackware-version") {$distro = `cat /etc/slackware-version | sed 's/version //'`;} if (-e "/etc/redhat-release") {$distro = `cat /etc/redhat-release | sed 's/version //'`;} if (-e "/etc/mandrake-release") {$distro = `cat /etc/mandrake-release | sed 's/version //'`;} if (-e "/etc/debian_version") {$distro = "Debian ".`cat /etc/debian_version | sed 's/version //'`."";} if (-e "/etc/SuSE-release") {$distro = `cat /SuSE-release | sed 's/version //'`;} if (-e "/etc/turbolinux-release") {$distro = `cat /etc/turbolinux-release | sed 's/version //'`;} if (-e "/etc/libranet_version") {$distro = 'Libranet-'.`cat /etc/libranet_version | sed 's/version //'`;} if (-e "/etc/arch-release") {$distro = `cat /etc/arch-release | sed 's/version //'`;} if ($distro eq "") {$distro = "Unknown";} chomp ($distro); my $ver="2.1"; my $switch; if ($ARGV[0]){ $switch = $ARGV[0]; } else { $switch = "-"; } # Handle the xchat_install switch if ($switch eq "xchat_install") { system("clear"); system("echo \"Moving yasis-\"$ver\".pl from `pwd`/ to ~/.xchat2/yasis.pl...\""); system("mv ./yasis-\"$ver\".pl ~/.xchat2/yasis.pl"); system("echo \"Done installing YASIS. Please either restart X-Chat or load it in the plugins dialog.\""); system("chmod 700 ~/.xchat2/yasis.pl"); exit; } my ($final,$cpu,$cpumodel,@cpumodel,$cpumhz,@cpumhz,$cpuinf,$cpu_temp,$cpu_temp1,$cpu_rpm,$z); if ($switch =~/b/ or $switch =~/[e-g]/ or $switch =~/[i-l]/ or $switch =~/[p-r]/ or $switch =~/[w-z]/){ $final = ""; } elsif ($switch =~/d/){ $final = "[\cBDisk\cB] $hdspacef Free, $hdspacet Total ($hdpercent% Free)"; } elsif ($switch =~/m/){ $final = "[\cBMemory\cB] $mem_free Used, $mem_total Total ($mem_per% Free)"; } elsif ($switch =~/s/){ if ($cu > $bu) {system("echo \"$uptime\" > ~/.buptime"); system("echo \"$cu\" > ~/.buptime_uptime"); } $cpu = cat("/proc/cpuinfo"); if ($cpu =~/sparc/){ $cpu =~ /(.*sparc.*)/; @cpumodel = split/:/,$1; $cpumodel = $cpumodel[1]; $cpumodel =~ s/ //; $cpu =~ /(.*bogomips.*)/; @cpumhz = split/:/,$1; $cpumhz = sprintf ("%.f",$cpumhz[1]); $cpuinf = "$cpumodel @ ${cpumhz}MHz"; } elsif ($cpu =~/ 486/){ $cpu =~ /(.*model name.*)/; @cpumodel = split/:/,$1; $cpumodel = $cpumodel[1]; $cpumodel =~ s/ //; $cpu =~ /(.*bogomips.*)/; @cpumhz = split/:/,$1; $cpumhz = sprintf ("%.f",$cpumhz[1]); $cpuinf = "$cpumodel @ ${cpumhz}MHz"; } else { $cpu =~ /(.*model name.*)/; @cpumodel = split/:/,$1; $cpumodel = $cpumodel[1]; $cpumodel =~ s/ //; $cpu =~ /(.*cpu MHz.*)/; @cpumhz = split/:/,$1; $cpumhz = sprintf ("%.f",$cpumhz[1]); $cpuinf = "$cpumodel($cpu_temp) @ $cpumhz MHz"; $cpuinf = "$cpumodel @ ${cpumhz}MHz"; if ($cache) {$cache="($cache)";} if ($cpu_usage) {$cpu_usage="(Activity: $cpu_usage%) ";} $final = "[\cBOS\cB] $distro; Kernel $uname :: [\cBUptime\cB] $uptime :: [\cBCPU\cB] $cpu_cnt-$cpuinf ${cache}${cpu_usage}:: [\cBMemory\cB] $mem_free Used, $mem_total Total ($mem_per% Free) :: [\cBDisk\cB] $hdspacef Free, $hdspacet Total ($hdpercent% Free) :: [\cBNetwork\cB] $eth_name $face ($packet_in In, $packet_out Out)"; } } elsif ($switch =~/t/){ if ($cpu_temp eq "" and $cpu_temp1 eq "" and $cpu_rpm eq "") { $final ="[\cBCPU Temp\cB] No Sensors Found"; } else { $final = "[\cBCPU Temp\cB] $cpu_temp/$cpu_temp1 (fan: $cpu_rpm)"; } } elsif ($switch =~/v/){ if ($vid_card eq "" and $screen_res eq "" and $screen_depth eq "") { $final = "[\cBVideo\cB] No Display Found"; } else { $final = "[\cBVideo\cB] $x running on $vid_card @ $screen_res ($screen_depth bit)"; } } elsif ($switch =~/n/){ $final = "[\cBNetwork\cB] $eth_name $face ($packet_in In, $packet_out Out)"; } elsif ($switch =~/h/){ $z="/yasis"; $final = "[\cBcommands\cB] $z -a (all) $z -c (cpu, also bogomips) $z -d (hdd's) $z -m (ram) $z -n (network) $z -o (operating system) $z -s (same as full stats (-a) minus video info) $z -t (cpu temperature) $z -u (uptime, also best uptime) $z -v (video/resolution, plus Xorg/Xfree version)"; } elsif ($switch =~/o/){ $final = "[\cBOS\cB] $distro; Kernel $uname"; } elsif ($switch =~/c/){ $cpu = cat("/proc/cpuinfo"); if ($cpu =~/sparc/){ $cpu =~ /(.*sparc.*)/; @cpumodel = split/:/,$1; $cpumodel = $cpumodel[1]; $cpumodel =~ s/ //; $cpu =~ /(.*bogomips.*)/; @cpumhz = split/:/,$1; $cpumhz = sprintf ("%.f",$cpumhz[1]); $cpuinf = "$cpumodel @ ${cpumhz}MHz"; } elsif ($cpu =~/ 486/){ $cpu =~ /(.*model name.*)/; @cpumodel = split/:/,$1; $cpumodel = $cpumodel[1]; $cpumodel =~ s/ //; $cpu =~ /(.*bogomips.*)/; @cpumhz = split/:/,$1; $cpumhz = sprintf ("%.f",$cpumhz[1]); $cpuinf = "$cpumodel @ ${cpumhz}MHz"; } else { $cpu =~ /(.*model name.*)/; @cpumodel = split/:/,$1; $cpumodel = $cpumodel[1]; $cpumodel =~ s/ //; $cpu =~ /(.*cpu MHz.*)/; @cpumhz = split/:/,$1; $cpumhz = sprintf ("%.f",$cpumhz[1]); $cpuinf = "$cpumodel @ ${cpumhz}MHz"; $cpuinf = "$cpumodel @ ${cpumhz}MHz"; if ($cache && $bogomips) {$cache="($cache/$bogomips bogomips)";} elsif ($cache) {$cache="($cache)";} $final="[\cBCPU\cB] $cpu_cnt-$cpuinf $cache ($cpu_usage% Activity)"; } } elsif ($switch =~/u/){ if ($cu > $bu) { system("echo \"$uptime\" > ~/.buptime"); system("echo \"$cu\" > ~/.buptime_uptime"); } $buptime = `cat ~/.buptime`; chomp($buptime); $final = "[\cBUptime\cB] $uptime (Best: $buptime)"; } else { if ($cu > $bu) { system("echo \"$uptime\" > ~/.buptime"); system("echo \"$cu\" > ~/.buptime_uptime"); } $cpu = cat("/proc/cpuinfo"); if ($cpu =~/sparc/){ $cpu =~ /(.*sparc.*)/; @cpumodel = split/:/,$1; $cpumodel = $cpumodel[1]; $cpumodel =~ s/ //; $cpu =~ /(.*bogomips.*)/; @cpumhz = split/:/,$1; $cpumhz = sprintf ("%.f",$cpumhz[1]); $cpuinf = "$cpumodel @ ${cpumhz}MHz"; } elsif ($cpu =~/ 486/){ $cpu =~ /(.*model name.*)/; @cpumodel = split/:/,$1; $cpumodel = $cpumodel[1]; $cpumodel =~ s/ //; $cpu =~ /(.*bogomips.*)/; @cpumhz = split/:/,$1; $cpumhz = sprintf ("%.f",$cpumhz[1]); $cpuinf = "$cpumodel @ ${cpumhz}MHz"; } else { $cpu =~ /(.*model name.*)/; @cpumodel = split/:/,$1; $cpumodel = $cpumodel[1]; $cpumodel =~ s/ //; $cpu =~ /(.*cpu MHz.*)/; @cpumhz = split/:/,$1; $cpumhz = sprintf ("%.f",$cpumhz[1]); $cpuinf = "$cpumodel @ ${cpumhz}MHz"; } if ($cache) {$cache="($cache)";} if ($cpu_usage) {$cpu_usage="(Activity: $cpu_usage%) ";} if ($do_display == 1) { $final = "[\cBOS\cB] $distro; Kernel $uname :: [\cBUptime\cB] $uptime :: [\cBCPU\cB] $cpu_cnt-$cpuinf ${cache}${cpu_usage}:: [\cBMemory\cB] $mem_free Used, $mem_total Total ($mem_per% Free) :: [\cBVideo\cB] $vid_card @ $screen_res ($screen_depth bit) :: [\cBDisk\cB] $hdspacef Free, $hdspacet Total ($hdpercent% Free) :: [\cBNetwork\cB] $eth_name $face ($packet_in In, $packet_out Out)"; } else { $final = "[\cBOS\cB] $distro; Kernel $uname :: [\cBUptime\cB] $uptime :: [\cBCPU\cB] $cpu_cnt-$cpuinf ${cache}${cpu_usage}:: [\cBMemory\cB] $mem_free Used, $mem_total Total ($mem_per% Free) :: [\cBDisk\cB] $hdspaceu Used, $hdspacet Total ($hdpercent% Free) :: [\cBNetwork\cB] $eth_name $face ($packet_in In, $packet_out Out)"; } } $final =~ s/ //; return "$final\n"; } sub cat { my @file; open MYFILE, $_[0] or die "$!"; @file = ; close MYFILE; return (wantarray) ? @file : join("", @file); } sub qget_info_cb { Xchat::print(get_info()) } sub get_info_cb { my $currChan = Xchat::get_info( 'channel' ); Xchat::command( "msg $currChan ".get_info() ); } if ($xchat_plugin) { Xchat::hook_command( "yasis", "get_info_cb"); Xchat::hook_command( "qyasis", "qget_info_cb"); } else { print get_info().'\n'; }