#!/usr/bin/perl # ---------------------------------------------------------------- # sysinfo for irssi and xchat # usage : /sys # Optional requirements: xdpyinfo, nvclock, sensors, lspci Wink # # Uses code from different scripts: # whoo's hacked up sysinfo whoo owneratowenmeanydotcom # System Info from wolssiloa rubenkatemaildotcom # xchatinfo Laurens "Law" Buhler and Alain "Doos" van Acker # email: Lawatnixhelpdotorg and A.v.aathomedotnl # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # my $VERSION = "1.7.4"; my %IRSSI = ( authors => "h3k/Bigun", contact => "bigun@cybergrunge.com", name => "Sysinfo", description => "Linux system information", license => "GPL", url => "", changed => "Added ability to change gender inside irc client" ); use strict; BEGIN{ use vars '$irssi','$xchat'; eval q{ use Irssi; Irssi::version(); }; $irssi = !$@; eval q{ IRC::get_info(1); }; $xchat = !$@; } # show what v information my $show_vpenis = 1; my $show_vboobies = 1; # to nerv oder not to nerv my $config_file ="$ENV{HOME}/.sysinfo.conf" ; my $color = 0; # proc directory my $procloc = "/proc"; # S.M.A.R.T. HDD my $SMARTDRIVE = "/dev/hda"; if ( -e "$config_file" ) { open (CONFIGF, "<$config_file"); $color = ; close (CONFIGF); } sub set_gender { my $input = shift; if ($input eq "m") { $show_vpenis = 1; $show_vboobies = 0; IRC::print "gender set to male"; } if ($input eq "f") { $show_vpenis = 0; $show_vboobies = 1; IRC::print "gender set to female"; } if ($input eq "1") { $show_vpenis = 1; $show_vboobies = 1; IRC::print "gender set to hermaphrodite"; } if ($input eq "0") { $show_vpenis = 0; $show_vboobies = 0; IRC::print "gender turned off"; } return 1; } sub set_color { $color = shift; open (CONFIGF, ">$config_file"); print CONFIGF "$color"; close (CONFIGF); if ($xchat) { IRC::print ("sysinfo color set to $color"); } else { print "sysinfo color set to $color"; } return 1 ; } sub file_executable { my $command = shift; my @directories=split(/:/, $ENV{'PATH'} ); for (@directories) { if ( -x "$_/$command" ) { return 1; } } return 0; } sub display_sys_info { #--COLORS--# my $TITLE_S = "\002"; my $TITLE_E = "\002"; my $ALERT_S = "\002"; my $NORMAL_S = ""; my $ALERT_E = "\002"; my $NORMAL_E = ""; if ( $color ) { $ALERT_E = "\003"; $NORMAL_E = "\003"; $ALERT_S = "\0034"; $NORMAL_S = "\0033"; } #--UNAME--# open (X, "${procloc}/version"); my $UNAME = ; close (X); $UNAME =~ s/^(\S+) \S+ (\S+) .*\n$/$1 $2/; my $SPEW = "${TITLE_S}SysInfo:${TITLE_E} $UNAME ${TITLE_S}"; #--PROCESSOR--# my $NUM = 0; my $MIPS = 0; my ($MODEL,$SYSTEM); my $CPU = 0; open (X, "${procloc}/cpuinfo"); while () { if (/^(cpu model|model name).*: (.*)\n$/) { $MODEL = $2; $NUM += 1; } elsif (/^system type.*: (.*)\n$/) { $SYSTEM = $1; } elsif (!$CPU && /^cpu MHz.*: (.*)\n$/) { $CPU = $1; } elsif (/^bogomips.*: (.*)\n$/i) { $MIPS += $1; } } close (X); #--SUPPORT FOR MULTIPLE PROCS--# if ($NUM == 2 ) { $MODEL="Dual $MODEL"; } if ($NUM == 4 ) { $MODEL="Quad $MODEL"; } $MODEL = $SYSTEM . " " . $MODEL; $SPEW .= "|${TITLE_E} $MODEL $CPU MHz ${TITLE_S}| Bogomips:${TITLE_E} $MIPS ${TITLE_S}"; #--MEMORY--# my($MEMTOTAL,$MEMFREE); open(X, "${procloc}/meminfo") or $MEMTOTAL = 1; while(){ chomp; if(/^MemTotal:\s+(\d+)/){ $MEMTOTAL = sprintf("%.0f",$1/1024); }elsif(/^MemFree:\s+(\d+)/){ $MEMFREE = sprintf("%.0f",$1/1024); }elsif(/^Buffers:\s+(\d+)/){ $MEMFREE += sprintf("%.0f",$1/1024); }elsif(/^Cached:\s+(\d+)/){ $MEMFREE += sprintf("%.0f",$1/1024); } } close(X); #--PERCENTAGE OF MEMORY FREE--# my $MEMPERCENT = sprintf("%.1f",(100/${MEMTOTAL}*${MEMFREE})); #--BARGRAPH OF MEMORY FREE--# my $FREEBAR = int(${MEMPERCENT}/10); my $MEMBAR; my $x; $MEMBAR = "${TITLE_S}\[${NORMAL_S}"; for ($x = 0;$x < 10; $x++) { if ( $x == $FREEBAR ) { $MEMBAR .= "${ALERT_S}"; } $MEMBAR .= "\|"; } $MEMBAR .= "${ALERT_E}]${TITLE_E}"; $SPEW .= "| Mem:${TITLE_E} ${MEMFREE}/${MEMTOTAL}M $MEMBAR ${TITLE_S}"; #--DISKSPACE--# my $HDD = 0; my $HDDFREE = 0; my $SCSI = 0; my $SCSIFREE = 0; for (`df 2>/dev/null`) { if (/^\/dev\/(ida\/c[0-9]d[0-9]p[0-9]|[sh]d[a-z][0-9]+)\s+(\d+)\s+\d+\s+(\d+)\s+\d+%/) { $HDD += $2; $HDDFREE += $3; } if (/^\/dev\/(ida\/c[0-9]d[0-9]p[0-9]|sd[a-z][0-9]+)\s+(\d+)\s+\d+\s+(\d+)\s+\d+%/) { $SCSI += $2; $SCSIFREE += $3; } } my $ALL = $HDD; $HDDFREE = sprintf("%.02f", $HDDFREE / 1048576)."G"; $HDD = sprintf("%.02f", $HDD / 1048576)."G"; $SPEW .= "| Diskspace:${TITLE_E} $HDD ${TITLE_S}Free:${TITLE_E} $HDDFREE ${TITLE_S}"; #--PROCS RUNNING--# opendir(PROC, "${procloc}"); my $PROCS = scalar grep(/^\d/,readdir PROC); $SPEW .= "| Procs:${TITLE_E} $PROCS ${TITLE_S}"; #--UPTIME--# open (X, "${procloc}/uptime"); my $up2 = ""; my $uptime = ; close (X); $uptime =~ s/(\d+\.\d+)\s\d+\.\d+/$1/; my $years = sprintf ("%.d",$uptime/31536000) || 0; my $yearbase = sprintf ($years * 31536000); my $weeks = sprintf ("%.d",($uptime - $yearbase)/6048000) || 0; my $weekbase = sprintf ($weeks * 6048000); my $days = sprintf ("%.d",($uptime - $yearbase - $weekbase)/86400) || 0; my $daybase = sprintf ($days * 86400); my $hours = sprintf ("%.d",($uptime - $yearbase - $weekbase - $daybase)/3600) || 0; my $hourbase = sprintf ($hours * 3600); my $mins = sprintf ("%.d",($uptime - $yearbase - $weekbase - $daybase - $hourbase)/60) || 0; my $minbase = sprintf ($mins * 60); my $secs = sprintf ("%.d",($uptime - $yearbase - $weekbase - $daybase - $hourbase - $minbase)) ||0; if ($years){$up2 .= $years =~ /^1$/ ? "$years yr " : "$years yrs ";} if ($weeks){$up2 .= $weeks =~ /^1$/ ? "$weeks wk " : "$weeks wks ";} if ($days){$up2 .= $days =~ /^1$/ ? "$days day " : "$days days ";} if ($hours){$up2 .= $hours =~ /^1$/ ? "$hours hr " : "$hours hrs ";} if ($mins){$up2 .= $mins =~/^[01]$/ ? "$mins min " : "$mins mins ";} $up2 .= $secs =~ /^[01]$/ ? "$secs sec" : "$secs secs"; $SPEW .= "| Uptime:${TITLE_E} $up2 ${TITLE_S}"; #--LOAD--# if (open (X, "${procloc}/loadavg")) { my $LOADAVG = ; close (X); $LOADAVG =~ s/^((\d+\.\d+\s){3}).*\n$/$1/; $SPEW .= "| Load:${TITLE_E} $LOADAVG ${TITLE_S}"; } #--Virtual Penis--# my $VPENIS = 70; $VPENIS += int($uptime/3600/24)/10; $VPENIS += $CPU*$NUM/30; $VPENIS += $MEMTOTAL/3; $VPENIS += ($ALL+$SCSI)/1024/50/15; $VPENIS = int($VPENIS)/10; my $cup = ""; if ( $VPENIS < 10 ) { $cup = "A"; } if ( $VPENIS > 10 && $VPENIS < 20 ) { $cup = "B"; } if ( $VPENIS > 20 && $VPENIS < 30 ) { $cup = "C"; } if ( $VPENIS > 30 && $VPENIS < 40 ) { $cup = "D"; } if ( $VPENIS > 40 && $VPENIS < 50 ) { $cup = "E"; } if ( $VPENIS > 50 && $VPENIS < 60 ) { $cup = "F"; } if ( $VPENIS > 70 ) { $cup = "G"; } my $vbust = int( ($VPENIS/4) + 28); if ( $show_vpenis ) { $SPEW .= "| Vpenis:${TITLE_E} $VPENIS cm ${TITLE_S}"; } if ( $show_vboobies ) { $SPEW .= "| Vboobies:${TITLE_E} $vbust$cup ${TITLE_S}"; } #--GRAPHICSCARD--# my $VGA = "unknown"; if (file_executable("lspci") == 1) { for (`lspci 2>/dev/null`){ if (/VGA compatible controller:\s(.*)$/){ $VGA = $1; } } } elsif ( -e "${procloc}/pci" ){ open(X, "${procloc}/pci") ; while(){ chomp; if (/VGA compatible controller:\s(.*)\.$/){ $VGA = $1; } } close(X); } $SPEW .= "| Screen:${TITLE_E} ${VGA} "; #--SCREEN RESOLUTION--# my ($DEPTH,$RES); if (file_executable("xdpyinfo")) { for(`xdpyinfo 2>/dev/null`){ if(/\s+dimensions:\s+(\S+)/){ $RES = $1; }elsif(/\s+depth:\s+(\S+)/){ $DEPTH = $1; } } if ($DEPTH) { $SPEW .= "\@ $RES ($DEPTH bpp) "; } } #--NVIDIA CORE FREQUENCY--# my $NVCLOCK; if (file_executable("nvclock") == 1) { for (`nvclock -s 2>/dev/null`){ if (/^C.*ore speed:\s+(\d+\.\d+\sMHz)$/){ $NVCLOCK = $1; } } $SPEW .= "${TITLE_S}Corespeed:${TITLE_E} $NVCLOCK "; } #--NETINFO--# my $route = ""; my $netdev = ""; my $NETDEVICE = "lo"; open(X, "${procloc}/net/route") or $route = "NA"; while(){ chomp; if (/^(.*?)\s+\d+\s+.*\s+0003\s+\d\s+/) { $NETDEVICE = $1; } } close(X); my $PACKIN; my $PACKOUT; if ( open(X, "${procloc}/net/dev")) { while(){ chomp; if (/^(\s+)?$NETDEVICE/) { /^\s+(.*?)(Sad\s+|)(\d+)\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+(\d+)\s+/; $PACKIN = sprintf("%.2f",$3 / 1048576); $PACKOUT = sprintf("%.2f",$4 / 1048576); } } close(X); if($PACKIN < 1024) { $PACKIN .= "M"; } else { $PACKIN = sprintf("%.02f", $PACKIN / 1024)."G"; } if($PACKOUT < 1024) { $PACKOUT .= "M"; } else { $PACKOUT = sprintf("%.02f", $PACKOUT / 1024)."G"; } $SPEW .= "${TITLE_S}| $NETDEVICE: In:${TITLE_E} $PACKIN ${TITLE_S}Out:${TITLE_E} $PACKOUT "; } #--LM_SENSORS--# my $SPEW2 = ""; my $SENSOR1 = "NA"; my $SENSOR2 = "NA"; my $SENSOR3 = "NA"; my $SENSOR4 = "NA"; if ( -e "${procloc}/sys/dev/sensors" && file_executable("sensors") == 1) { for (`sensors 2>/dev/null`){ if (/^[tT]emp2.*:\s+(.*(\s|.|)[FC])\s+\(.*\)(\s+ALARM)?/) { if (!$2) { $SENSOR1 = "${NORMAL_S} $1${NORMAL_E}"; } else { $SENSOR1 = "${ALERT_S} $1${ALERT_E}"; } } elsif (/^[tT]emp1.*:\s+(.*(\s|.|)[FC])\s+\(.*\)(\s+ALARM)?/) { if (!$2) { $SENSOR2 = "${NORMAL_S} $1${NORMAL_E}"; } else { $SENSOR2 = "${ALERT_S} $1${ALERT_E}"; } } elsif (/^fan1:\s+(\d+\sRPM)\s+\(.*\)(\s+ALARM)?/) { if (!$2) { $SENSOR3 = "${NORMAL_S} $1${NORMAL_E}"; } else { $SENSOR3 = "${ALERT_S} $1${ALERT_E}"; } } elsif (/^fan2:\s+(\d+\sRPM)\s+\(.*\)(\s+ALARM)?/) { if (!$2) { $SENSOR4 = "${NORMAL_S} $1${NORMAL_E}"; } else { $SENSOR4 = "${ALERT_S} $1${ALERT_E}"; } } } $SPEW2 .= "${TITLE_S}CPU:${TITLE_E}$SENSOR1 ${TITLE_S}Fan:${TITLE_E}$SENSOR3 ${TITLE_S}Case:${TITLE_E}$SENSOR2 ${TITLE_S}Fan:${TITLE_E}$SENSOR4 "; } #--HDDTEMP--# my $HDDTEMP; if ( file_executable("hddtemp") == 1) { for (`hddtemp $SMARTDRIVE 2>/dev/null`){ if (/^\/dev\/[sh]da:\s+(.*):\s+(.*)$/) { $HDDTEMP = $2; } } $SPEW2 .= "${TITLE_S}HDD:${TITLE_E} $HDDTEMP"; } #--CHANNEL OUTPUT--# if ($irssi) { Irssi::active_win->command("/say $SPEW"); if ($SPEW2) { Irssi::active_win->command("/say ${TITLE_S}Sensors:${TITLE_E} $SPEW2") }; } elsif ($xchat) { IRC::command("/say $SPEW"); if ( $SPEW2 ne "") { IRC::command("/say ${TITLE_S}Sensors:${TITLE_E} $SPEW2") }; } else { print "$SPEW\n"; if ($SPEW2) { print "${TITLE_S}Sensors:${TITLE_E} $SPEW2\n" }; } return 1; } #--END OF SUB--# if ($irssi) { Irssi::command_bind('sys', 'display_sys_info'); Irssi::command_bind('syscolor', 'set_color'); Irssi::command_bind('gender', 'set_gender'); } elsif ($xchat) { IRC::register("Sysinfo", "${VERSION}.1", "", ""); IRC::print ("Loading CyberGrunge's perlified \0034sysinfo\003 script"); IRC::print ("Usage: /sys"); IRC::print (" /syscolor (0|1)"); IRC::print (" /gender (0|1|m|f)"); IRC::add_command_handler("sys", "display_sys_info"); IRC::add_command_handler("syscolor","set_color") ; IRC::add_command_handler("gender","set_gender") ; } else { display_sys_info(); }