#!/usr/bin/perl
#
#  EVMS-SysInfo.pl - Version 1.9.9
#  Copyright 2002-2003 Philip Chapman <pac1085@rochester.rr.com>
#  Licensed under the terms of the GNU GPL Version 2
#
#  Optional requirements: xdpyinfo, nvclock, sensors, lspci, hddtemp
#
#  To use - load script in X-Chat and type /sys
#
#  Thanks to influenza, jp-, ellypsys and SanityInFlus for the help.
#
#  ChangeLog:
#
#    01-03-2002: First release
#
#


IRC::register("EVMS-SysInfo", "1.9.9", "", "");
IRC::print "Loading EVMS-SysInfo 1.9.9";
IRC::print "Usage: /sys";
IRC::add_command_handler("sys", "display_sys_info");

sub display_sys_info
{  
   #--UNAME--#
   open (X, "/proc/version");
   $UNAME = <X>;
   close (X);
   $UNAME =~ s/^(\S+) \S+ (\S+) .*\n$/$1 $2/;

   #--PROCESSOR--#
   open (X, "/proc/cpuinfo");
   $NUM = 0;
   while (<X>)
   {
	if (/^model name.*: (.*)\n$/) {
		$MODEL = $1;
		$NUM += 1;
	} elsif (/^cpu MHz.*: (.*)\n$/ && !$havespeed) {
		$CPU = $1;
		$havespeed = 1;
	} elsif (/^bogomips.*: (.*)\n$/ && !$havebmips) {
		$MIPS = $1;
		$havebmips = 1;
	}
    }
    close (X);

    #--PROCS RUNNING--#
    opendir(PROC, "/proc");
    $PROCS = scalar grep(/^\d/,readdir PROC);
    
    #--UPTIME--#
    undef $up2;

    open (X, "/proc/uptime");
    $uptime = <X>;
    close (X);
    $uptime =~ s/(\d+\.\d+)\s\d+\.\d+/$1/;

    $years = sprintf ("%.d",$uptime/31536000) || 0;
    $yearbase = sprintf ($years * 31536000);
    $weeks = sprintf ("%.d",($uptime - $yearbase)/6048000) || 0;
    $weekbase = sprintf ($weeks * 6048000);
    $days = sprintf ("%.d",($uptime - $yearbase - $weekbase)/86400) || 0;
    $daybase = sprintf ($days * 86400);
    $hours = sprintf ("%.d",($uptime - $yearbase - $weekbase - $daybase)/3600) || 0;
    $hourbase = sprintf ($hours * 3600);
    $mins = sprintf ("%.d",($uptime - $yearbase - $weekbase - $daybase - $hourbase)/60) || 0;
    $minbase = sprintf ($mins * 60);
    $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";
   
    #--LOAD--#
    open (X, "/proc/loadavg");
    $LOADAVG = <X>;
    close (X);
    $LOADAVG =~ s/^((\d+\.\d+\s){3}).*\n$/$1/;

    #--MEMORY--#
    open(X, "/proc/meminfo") or $MEMTOTAL = 1;
    while(<X>){
	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--#
    $MEMPERCENT = sprintf("%.1f",(100/$MEMTOTAL*$MEMFREE));
    
    #--BARGRAPH OF MEMORY FREE--#
    $FREEBAR = int($MEMPERCENT/10);
    $MEMBAR = "\cB[\cC3";
    for ($x = 0; $x < 10; $x++)
    {
        if ( $x == $FREEBAR )
                {
                $MEMBAR .= "\cC4";
                }
        $MEMBAR .= "\|";
    }
    $MEMBAR .= "\cO\cB]\cO";


    #--SCREEN RESOLUTION--#
    if (system("which xdpyinfo") == 0) {
	    for(`xdpyinfo 2>/dev/null`){
	          if(/\s+dimensions:\s+(\S+)/){
	                 $RES = $1;
	          }elsif(/\s+depth:\s+(\S+)/){
	                 $DEPTH = $1;
	          }
	    }
    }

    #--GRAPHICSCARD--#
    #if (system("which lspci") == 0) {
    if (-e "/sbin/lspci" ) {
        for (`/sbin/lspci 2>/dev/null`){
		if (/VGA compatible controller:\s(.*)$/){
		$VGA = $1; }
 	}
    }
    elsif ( -e "/proc/pci" ){
	open(X, "/proc/pci") ;
	while(<X>){
		chomp;
		if (/VGA compatible controller:\s(.*)\.$/){
		$VGA = $1; }
	}
        close(X);
    }

    $CORE = NA;
    $MEM = NA;
    if (system("which nvclock") == 0) {
	for (`nvclock -s 2>/dev/null`){
		if (/^Core speed:\s+(\d+\.\d+\sMHz)$/){
		$CORE = $1; }
		if (/^Memory speed:\s+(\d+\.\d+\sMHz)$/){
                $MEM = $1; }
 	}
    }

    #--NETINFO--# 
    my $route = "";
    my $netdev = "";
    my $NETDEVICE = "lo";
    open(X, "/proc/net/route") or $route = "NA";
    while(<X>){
    	chomp;
    	if (/^(.*?)\s+\d+\s+.*\s+0003\s+\d\s+/)
		{ $NETDEVICE = $1; }
    }
    close(X);

    open(X, "/proc/net/dev") or $netdev = NA;
    while(<X>){
	chomp;
	if (/^(\s+)?$NETDEVICE/) {
	/^\s+(.*?):(\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"; }
    
    #--DISKSPACE--#
    $HDD = 0;
    $HDDFREE = 0;
    $SCSI = 0;
    $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]+|evms\/.+)\s+(\d+)\s+\d+\s+(\d+)\s+\d+%/) 
#	if (1)  {
#       #         IRC::command("/say $2 ")	
#		$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;
#	}
#    }

    #--DISKSPACE--#
    $HDD = `df | awk '{ sum+=\$2 }; END { printf (\"%dGb\", sum )}'`;
    chop ($HDD);

    #--DISKSPACE FREE--#
    $HDDFREE = `df | awk '{ sum+=\$4 }; END { printf (\"%dGb\", sum )}'`;
    chop ($HDDFREE);   

    $ALL = $HDD;
    $HDDFREE = sprintf("%.02f", $HDDFREE / 1048576)."G";
    $HDD = sprintf("%.02f", $HDD / 1048576)."G";

    #--Virtual Penis--#	
    $VPENIS = 70;
    $VPENIS += int($uptime/3600/24)/10;
    $VPENIS += $CPU*$NUM/30;
    $VPENIS += $MEMTOTAL/3;
    $VPENIS += ($ALL-$SCSI)/1024/50/15;
    $VPENIS += $SCSI*2/1024/50/15;
    $VPENIS = int($VPENIS)/10;

    #--LM_SENSORS--#
    $SENSOR1 = NA;
    $SENSOR2 = NA;
    $SENSOR3 = NA;
    $SENSOR4 = NA;
    if (system("which sensors") == 0) {
	for (`sensors -f 2>/dev/null`){
		if (/^SYS Temp:\s+(.*(\s|°)[FC])\s+/) {
		$SENSOR1 = $1; }
		elsif (/^CPU Temp:\s+(.*(\s|°)[FC])\s+/) {
		$SENSOR2 = $1; }
		elsif (/^CPU Fan:\s+(\d+\sRPM)\s+/) {
		$SENSOR3 = $1; }
		elsif (/^P\/S Fan:\s+(\d+\sRPM)\s+/) {
		$SENSOR4 = $1; }
 	}
    }

    #--HDDTEMP--#
    $HDDTEMP = NA;
    $SMARTDRIVE = "/dev/hdb";
    if ( system("which hddtemp") == 0 ) {
      for (`hddtemp $SMARTDRIVE 2>/dev/null`){
		if (/^\/dev\/[sh]db:\s+(.*):\s+(.*)$/) {
		$HDDTEMP = $2; }
	}
    }

    #--SUPPORT FOR MULTIPLE PROCS--#
    if ($NUM == 2 ) { $MODEL="Dual $MODEL"; }
    if ($NUM == 4 ) { $MODEL="Quad $MODEL"; }

    #--CHANNEL OUTPUT--#
    $SPEW2 = "";
    $SPEW = "SysInfo: $UNAME \cB|\cB $MODEL $CPU MHz \cB| Bogomips:\cB $MIPS \cB| Mem: \cB${MEMFREE}/${MEMTOTAL}M $MEMBAR \cB| Diskspace:\cB $HDD \cBFree:\cB $HDDFREE \cB| Procs:\cB $PROCS \cB| Uptime:\cB $up2 \cB| Load:\cB $LOADAVG\cB| Vpenis:\cB $VPENIS cm \cB| Screen:\cB ${VGA}\@$RES ($DEPTH bpp) ";
    if ($CORE ne "NA") { $SPEW .= "\cBCore:\cB $CORE "; };
    if ($MEM ne "NA") { $SPEW .= "\cBMemory:\cB $MEM "; };
    if ($netdev ne "NA") { $SPEW .= "\cB| $NETDEVICE: In:\cB $PACKIN \cBOut:\cB $PACKOUT "; }
    if ($SENSOR3 ne "NA") { $SPEW2 = "\cBCPU:\cB $SENSOR1 \cBCase:\cB $SENSOR2 \cBCPU Fan:\cB $SENSOR3 \cBNorthbridge Fan:\cB $SENSOR4 "; }
    if ($HDDTEMP ne "NA") { $SPEW2 .= "\cBHDD:\cB $HDDTEMP "; }
    IRC::command("/say $SPEW");
    if ( $SPEW2 ne "") { IRC::command("/say Sensors: $SPEW2") };
return 1;
}

