#!/usr/bin/perl -w

# A script futtatásához szükséges programok:
#
### Gentoo: ###
#
# sys-apps/lsb-release
# x11-apps/xdpyinfo
# x11-apps/xwininfo
# sys-apps/usbutils
# sys-apps/pciutils
# sys-apps/ethtool
# sys-apps/lm_sensors
# media-tv/xdtv  + tvtuner :-)
#
### Ubuntu: ###
#
# x11-utils
# lm-sensors
# xdtv ( http://sourceforge.net/projects/xawdecode/files/ )   + tvtuner :-)
# 
### Fedora: ###
#
# redhat-lsb
# ethtool
#
### Arch: ###
#
# aur/lsb-release  (yaourt)
# ethtool
#
###############
#
# 2.5 Parancsok /about /gfx /sound /mb /ker /cpu /ram /disk /net /temp /sys /tv /audacious /audacious2 /amarok2 /installdate /palya /frissit
#
# /about         - a jelen script információit írja ki
# /gfx           - a videókártya típusát, a képernyő felbontását, az X szerver verzióját, vaklamint ha a monitor elküldi az EDID információt, akkor annak típusát is kijelzi.
# /sound         - a hangkártya típusát jelzi ki
# /mb            - az alaplap chipsetjét jelzi ki
# /ker           - az akutális kernel verziót jeleníti meg
# /cpu           - az elérhető processzor információkat írja ki
# /ram           - kiírja a használt / összes memóriát
# /disk          - kiírja a használt / összes helyet az első wincsin
# /net           - kiírja a hálókártya típusát, a hálózati forgalmat, és a kernelmodult
# /temp          - kiírja a rendszer processzor hőmérsékletét
# /sys           - teljes információt közöl
# /tv            - kiírja az XDTV-n utoljára nézett csatorna nevét
# /audacious     - kiírja az audacious 1.x által hallgatott szám információit
# /audacious2    - kiírja az audacious 2.x által hallgatott szám információit
# /rhythmbox     - kiírja a rhythmbox által hallgatott szám információit
# /rb            - kiírja a rhythmbox által hallgatott szám információit harmadik személyben
# /amarok2       - kiírja az amarok2 által hallgatott szám információit
# /vpenis        - kiírja az aktuális konfiguráció e-penis (joke) méretét.
# /installdate   - kiírja a rendszer feltételezett telepítési idejét
# /palya         - kiírja a pálya fizikai definícióját. A "mi a pálya?" kérdésre ideális válasz :-)
# /frissit       - frissíti a sysinfó scriptet az aktuális verzióra
#
# by cvk
#
Xchat::register("cvk rendszerinfó","2.5","2011.10.20");
IRC::print "SYSTEMINFÓ betöltve.... parancsok: /about /gfx /sound /mb /ker /up /cpu /ram /disk /net /temp /sys /tv /audacious /audacious2 /rhythmbox /rb /amarok2 /vpenis /installdate /palya /frissit";
IRC::add_command_handler("about", "about");
IRC::add_command_handler("gfx", "gfx");
IRC::add_command_handler("sound", "sound");
IRC::add_command_handler("mb", "mb");
IRC::add_command_handler("ker", "ker");
IRC::add_command_handler("cpu", "cpu");
IRC::add_command_handler("ram", "ram");
IRC::add_command_handler("disk", "disk");
IRC::add_command_handler("net", "net");
IRC::add_command_handler("temp", "temp");
IRC::add_command_handler("sys", "sys");
IRC::add_command_handler("tv", "tv");
IRC::add_command_handler("up", "up");
IRC::add_command_handler("audacious", "audacious");
IRC::add_command_handler("audacious2", "audacious2");
IRC::add_command_handler("rhythmbox", "rhythmbox");
IRC::add_command_handler("rb", "rb");
IRC::add_command_handler("amarok2", "amarok2");
IRC::add_command_handler("vpenis", "vpenis");
IRC::add_command_handler("palya", "palya");
IRC::add_command_handler("frissit", "frissit");
IRC::add_command_handler("installdate", "installdate");

$dev="`/sbin/route | awk '/^default / { print \$NF }'`";
$lspci=`whereis lspci | head -n 1 | sed -e 's/lspci: *//' | sed -e 's/ .*//'`;

sub about {

IRC::command("Rendszerinformáció - Xchat programhoz - by cvk - verzió 2.5 - 2011.10.20 - http://gentoo.cvk.hu/xchat/cvk_sysinfo.pl");
return 1;
}

sub gfx {

     $depths = `xdpyinfo | grep depths | awk '{print \$3}'`;
     chop ($bits);

     $xorg = `xdpyinfo | grep X.Org"."version | awk '{print \$3}'`;
     chop ($xorg);

     $res = `xdpyinfo | grep dimensions | awk '{print \$2}'`;
     chop ($res);

     @vid = `$lspci`;
     foreach (@vid) {
     if (/VGA compatible controller: (.+).$/i) {$vidcard = $1;last;}

     $bits = `xwininfo -root | grep Depth | awk '{print \$2}'`;
     chop ($bits);

     $mon = `cat /var/log/Xorg.0.log | grep CRT-* | head -1 | sed -e 's/^.*: //' | sed -e 's/^[ \t]*//'`;
     chop ($mon);

}
IRC::command("( Videókártya ): [ $vidcard ]  ( X.Org ): [ $xorg ]  ( Felbontás ): [ $res ]  ( Színmélység ): [ $bits ] ( Monitor ): [ $mon ]");
return 1;
}

sub ker {

    $ker =`uname -a`;
    chop ($ker);
    $ker2 =`uname -srm`;
    chop ($ker2);

IRC::command("( Kernel ): [ $ker ] ");
return 1;
}

sub tv {

    $csatorna =`cat ~/.xdtv/last_channel | head -1 | sed -e 's/^.*: //'`;
    chop ($csatorna);
IRC::command("( Utoljára ez a csatona ment az XDTV-n ): [ $csatorna ] ");
return 1;
}

sub up {

    $up =`uptime`;
    chop ($up);

IRC::command("( Uptime ): [ $up ] ");
return 1;
}


sub cpu {

    $model = `cat /proc/cpuinfo | grep 'model name' | head -1 | sed -e 's/^.*: //'`;
    chop ($model);

    $freq = `cat /proc/cpuinfo | grep 'cpu MHz' | head -1 | sed -e 's/^.*: //'`;
    chop ($freq);

    $cache = `cat /proc/cpuinfo | grep 'cache size' | head -1 | sed -e 's/^.*: //'`;
    chop ($cache);

    #$bogomips = `cat /proc/cpuinfo | grep 'bogomips' | head -1 | sed -e 's/^.*: //'`;
    $bogomips = `dmesg |grep BogoMIPS |awk '/Total / { print \$(NF-1)")" }'`;
    chop ($bogomips);

    $count = `cat /proc/cpuinfo | grep 'model name' | wc -l | sed 's/ *//'`;
    chop ($count);

IRC::command("( Processzor ): $count magos $model ( Órajel ): $freq"."MHz ( Cache / CPU ): $cache ( Mind a(z) $count mag összes Bogomips-e ): $bogomips");
return 1;
}

sub sound {

     @snd = `$lspci`;
     foreach (@snd) {
     if (/Audio (.+).$/i) {$sndcard = $1;first;}
     if (/Input device controller: (.+).$/i) {$inpdev = $1;last;}
}
IRC::command("( Hangkártya ): [ $sndcard ]  ( bemeneti eszköz ): [ $inpdev ] ");
return 1;
}


sub mb {

     @mb = `$lspci`;
     foreach (@mb) {
     if (/ISA bridge: (.+).$/i) {$isabrg = $1;last;}
}
IRC::command("( Alaplapi chipset ): [ $isabrg ] ");
return 1;
}

sub disk
{
	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";
IRC::command("( Wincheszter szabad/összméret ): [ $HDDFREE/$HDD ]");
	return 1;
}

sub net {

    @eth = `$lspci`;
    foreach (@eth) {
    if (/Ethernet controller: (.+).$/i) {$devtype = $1;last;}
}

    $driver = `/usr/sbin/ethtool -i $dev |grep driver | sed -e 's/^.*: //' | sed -e 's/^[ \t]*//'`;
    chop ($driver);
    $packin = `cat /proc/net/dev | grep $dev | awk -F: '/:/ {print \$2}' | awk '{print \$1}'`;
    if($packin < 1024**3) { $packin = sprintf("%.02f",$packin / 1024**2)."M"; } else { $packin = sprintf("%.02f", $packin / 1024**3)."G"; }

    $packout = `cat /proc/net/dev | grep $dev | awk -F: '/:/ {print \$2}' | awk '{print \$9}'`;
    if($packout < 1024**3) { $packout = sprintf("%.02f",$packout / 1024**2)."M"; } else { $packout = sprintf("%.02f", $packout / 1024**3)."G"; }


IRC::command("( Hálozat ): [ kártya: $devtype - be: $packin - ki: $packout - kernelmodul: $driver ]");
return 1;
}

sub temp {

    $sens1 = `sensors -f | grep SYS | awk '{print \$1, \$2, \$3}'`;
    chop ($sens1);

    $sens2 = `sensors | grep 'Core\ 0' | awk '{print \$3}'`;
    chop ($sens2);

IRC::command("( Hőmérséklet ): [ rendszer $sens1 CPU $sens2 ] ");
return 1;
}

sub sys {

    $ker = `uname -srm`;
    chop ($ker);

    $vendor = `cat /proc/cpuinfo | grep 'vendor_id' | head -1 | sed -e 's/^.*: //'`;
    chop ($vendor);

    $model = `cat /proc/cpuinfo | grep 'model name' | head -1 | sed -e 's/^.*: //'`;
    chop ($model);

    $freq = `cat /proc/cpuinfo | grep 'cpu MHz' | head -1 | sed -e 's/^.*: //'`;
    chop ($freq);

    $cache = `cat /proc/cpuinfo | grep 'cache size' | head -1 | sed -e 's/^.*: //'`;
    chop ($cache);

    #$bogomips = `cat /proc/cpuinfo | grep 'bogomips' | head -1  | sed -e 's/^.*: //'`;
    $bogomips = `dmesg |grep BogoMIPS |awk '/Total / { print \$(NF-1)")" }'`;
    chop ($bogomips);

    $count = `cat /proc/cpuinfo | grep 'model name' | wc -l | sed 's/ *//'`;
    chop ($count);

    $f00f = `cat /proc/cpuinfo | grep 'f00f_bug' | head -1 | sed -e 's/^.*: //'`;
    chop ($f00f);

    $fdiv = `cat /proc/cpuinfo | grep 'fdiv_bug' | head -1 | sed -e 's/^.*: //'`;
    chop ($fdiv);

    $hlt = `cat /proc/cpuinfo | grep 'hlt_bug' | head -1 | sed -e 's/^.*: //'`;
    chop ($hlt);

    $coma = `cat /proc/cpuinfo | grep 'coma_bug' | head -1 | sed -e 's/^.*: //'`;
    chop ($coma);

    $flags = `cat /proc/cpuinfo | grep 'flags' | head -1 | sed -e 's/^.*: //'`;
    chop ($flags);

    #$ver = `cat /etc/*release | head -1 | sed -e 's/^.*: //'`;
    $ver = `lsb_release -a | grep Description: | sed -e 's/.*://'| sed -e 's/^[ \t]*//'`;
    chop ($ver);

    $procs = `ps ax | wc -l | awk '{print \$1 - 5}'`;
    chop ($procs);

    $mem = `free -m`;
    foreach ($mem) {
    /mem.+?[ ]+([\d\.]+)[ ]+([\d\.]+)/i;
    $memtotal = $1;
    $memused = $2;

    $MEMTOTAL = `free | grep Mem | awk '{printf (\"%dMb\", \$2/1000 )}'`;
    chop ($MEMTOTAL);
    
   
    $MEMPERCENT = `free | grep Mem | awk '{print (( \$3 -(\$6 + \$7) )/\$2)*100}'`;
    chop ($MEMPERCENT);
    
    
    $MEMFREE = `free | grep Mem | awk '{printf (\"%.0fg\", ( \$3 -(\$6 + \$7) )/1000)}'`;
    chop ($MEMFREE);
    
    
    $FREEBAR = int($MEMPERCENT/10);
    $MEMBAR = "14[4";
    for ( $x = 0; $x < 10; $x++ )
    {
        if ( $x eq $FREEBAR )
                {
                $MEMBAR = "$MEMBAR3";
                }
        $MEMBAR = "$MEMBAR\|";
    }
    $MEMBAR = "$MEMBAR14]";

}

    $up = `uptime`;
    foreach ($up) {
    /.*?up *(.*),.*?users?.*?load average: ([\d\.]+).*/i;
    $up = $1;
    $load = $2;
}

	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";

IRC::command("( Disztribúció ): [ $ver ]  - ( Kernel ): [ $ker ]  - ( Uptime ): [ $up ]  - ( Load ): [ $load ]  - ( CPU[db] ): [ $count ]  - ( proci modell ): [ $model ]  - ( Órajel ): [ $freq"."MHz ]  - ( Cache ): [ $cache ]  - ( Memória ): [ $MEMFREE/$MEMTOTAL ]  - ( Winchester mérete ): [ $HDDFREE / $HDD"." ]  - ( Processzek ): [ $procs ] ");
return 1;
}

sub ram {

    $MEMTOTAL = `free | grep Mem | awk '{printf (\"%dMb\", \$2/1000 )}'`;
    chop ($MEMTOTAL);
    
   
    $MEMPERCENT = `free | grep Mem | awk '{print (( \$3 -(\$6 + \$7) )/\$2)*100}'`;
    chop ($MEMPERCENT);
    
    
    $MEMFREE = `free | grep Mem | awk '{printf (\"%.0fg\", ( \$3 -(\$6 + \$7) )/1000)}'`;
    chop ($MEMFREE);
    
    
    $FREEBAR = int($MEMPERCENT/10);
    $MEMBAR = "14[4";
    for ( $x = 0; $x < 10; $x++ )
    {
        if ( $x eq $FREEBAR )
                {
                $MEMBAR = "$MEMBAR3";
                }
        $MEMBAR = "$MEMBAR\|";
    }
    $MEMBAR = "$MEMBAR14]";

IRC::command("( Memória ): [ $MEMFREE/$MEMTOTAL $MEMBAR] ");
return 1;
}

sub audacious
{
	# Vizsáljuk hogy fut-e az audacious processz.
	if (`ps -C audacious` =~ /audacious/) {
		# jelenleg játszott zeneszám
		$zene = `audtool --current-song `;
		chop ($zene);
		# szám hossza
		$hossz = `audtool --current-song-length `;
		chop ($hoszz);
		# szám bitrátája
		$bitrata = `audtool --current-song-bitrate `;
		chop ($bitrata);
		IRC::command("( Ez a zene szól éppen az audaciousban ): [ $zene ] :: [ $hossz perc ] :: [ $bitrata bps ]");
	} else {
		IRC::print("Az audacious nem fut jelenleg.");
	}
	return 1;
}

sub audacious2
{
	# Vizsáljuk hogy fut-e az audacious2 processz.
	if (`ps -C audacious2` =~ /audacious2/) {
		# jelenleg játszott zeneszám
		$zene = `audtool2 --current-song `;
		chop ($zene);
		# szám hossza
		$hossz = `audtool2 --current-song-length `;
		chop ($hossz);
		# szám bitrátája
		$bitrata = `audtool2 --current-song-bitrate `;
		chop ($bitrata);
		IRC::command("( Ez a zene szól éppen az audacious2ben ): [ $zene ] :: [ $hossz perc ] :: [ $bitrata bps ]");
	} else {
		IRC::print("Az audacious2 nem fut jelenleg.");
	}
	return 1;
}

sub rhythmbox
{
	# Vizsáljuk hogy fut-e a rhythmbox processz.
	if (`ps -C rhythmbox` =~ /rhythmbox/) {
		# jelenleg játszott zeneszám
		$zene = `rhythmbox-client --print-playing-format %st`;
		if (length $cim > 1) {
			$cim = `rhythmbox-client --print-playing-format %st\\ -\\ %tt`;
		} else {
			$cim = `rhythmbox-client --print-playing-format %ta\\ -\\ %at\\ -\\ %tt`;
		}
		chop ($cim);
		# szám hossza
		$hossz= `rhythmbox-client --print-playing-format %te\\ /\\ %td`;
		chop ($hossz);
		IRC::command("( Ez a zene szól éppen a rhythmboxban ): [ $cim ] :: [ $hossz perc ]");
	} else {
		IRC::print("A rhythmbox nem fut jelenleg.");
	}
	return 1;
}

sub rb
{
	# Vizsáljuk hogy fut-e a rhythmbox processz.
	if (`ps -C rhythmbox` =~ /rhythmbox/) {
		# jelenleg játszott zeneszám
		$zene = `rhythmbox-client --print-playing-format %st`;
		if (length $cim > 1) {
			$cim = `rhythmbox-client --print-playing-format %st\\ -\\ %tt`;
		} else {
			$cim = `rhythmbox-client --print-playing-format %ta\\ -\\ %at\\ -\\ %tt`;
		}
		chop ($cim);
		# szám hossza
		$hossz= `rhythmbox-client --print-playing-format %te\\ /\\ %td`;
		chop ($hossz);
		Xchat::command("ME ezt a zenét hallgatja éppen a rhythmboxban : [ $cim ] :: [ $hossz perc ]");
	} else {
		IRC::print("A rhythmbox nem fut jelenleg.");
	}
	return Xchat::EAT_ALL;
}
sub amarok2 {
	# Vizsáljuk hogy fut-e az amarok2 processz.
	if (`ps -C amarok` =~ /amarok/) {
		# jelenleg játszott zeneszám
		$zene = `qdbus org.kde.amarok /Player GetMetadata`;
		$eloado = ( $zene =~ /artist: (.*)/  ? $1 : "-" );
		$cim  = ( $zene =~ /title: (.*)/   ? $1 : "ismeretlen" );
		$lemez  = ( $zene =~ /album: (.*)/   ? $1 : "-" );
		$hossz  = ( $zene =~ /time: (.*)/   ? $1 : "-" );

		IRC::command("( Ez a zene szól éppen az amarok2ben ): [ $cim ] :: [ $hossz perc ]");
	} else {
		IRC::print("Az amarok2 nem fut jelenleg.");
	}
	return 1;
}

sub vpenis {

    #$vpenis1 =`LANG=C uptime|grep days|sed 's/.*up \([0-9]*\) day.*/\1\/10+/'; cat /proc/cpuinfo|grep '^cpu MHz'|awk '{print $4"/30 +";}';free|grep '^Mem'|awk '{print $3"/1024/3+"}'; df -P -k -x nfs -x smbfs | grep -v '(1k|1024)-blocks' | awk '{if ($1 ~ "/dev/(cciss|scsi|sd)"){ s+= $2} s+= $2;} END {print s/1024/50"/15+70";}'; bc|sed 's/\(.$\)/.\1cm/'`;
    #$vpenis1 =`LANG=C uptime|grep days|sed 's/.*up \([0-9]*\) day.*/\1\/10+/'; cat /proc/cpuinfo|grep '^cpu MHz'|awk '{print $4"/30 +";}';free|grep '^Mem'|awk '{print $3"/1024/3+"}'; df -P -k -x nfs -x smbfs | grep -v '(1k|1024)-blocks' | awk '{if ($1 ~ "/dev/(cciss|scsi|sd)"){ s+= $2} s+= $2;} END {print s/1024/50"/15+70";}'`;
    #chop ($vpenis1);
    #$vpenis2 =`|bc|sed 's/\(.$\)/.\1cm/'`;
    #chop ($vpenis2);
    #$vpenis3 =$vpenis1;
    #$vpenis = $("echo `uptime|grep days|sed 's/.*up \([0-9]*\) day.*/\1\/10+/'; cat /proc/cpuinfo|grep '^cpu MHz'|awk '{print $4"/30 +";}';free|grep '^Mem'|awk '{print $3"/1024/3+"}'; df -P -k -x nfs -x smbfs | grep -v '(1k|1024)-blocks' | awk '{if ($1 ~ "/dev/(cciss|scsi|sd)"){ s+= $2} s+= $2;} END {print s/1024/50"/15+70";}'`|bc|sed 's/\(.$\)/.\1cm/');
    #chop ($vpenis);
IRC::command("( A gépemnek ekkora a V-PENIS -e: ): [ $vpenis ] ");
return 1;
}

sub installdate {

    $installdate = `ls -l '/' |grep lost | awk '{print \$6,\$7,\$8}'`;
    chop ($installdate);

IRC::command("( A rendszer feltételezett telepítési ideje:  ): [ $installdate ] ");
return 1;
}

sub palya {

IRC::command("A pálya az mozgó tömegpont (vagy kiterjedt test egy pontja) által valamely vonatkoztatási rendszerhez viszonyítva leírt görbe.");
return 1;

}

sub frissit {

    $friss =`wget http://gentoo.cvk.hu/xchat/cvk_sysinfo.pl -O ~/.xchat2/cvk_sysinfo.pl`;
IRC::print("A rendszerinformációs script frissítése megtörtént, a legfrissebb verzió letöltve.");
IRC::print("A script frissítéséhez futtasd a /reload ~/.xchat2/cvk_sysinfo.pl parancsot");
return 1;
}

