<?php
##  ½Ã½ºÅÛ Á¤º¸ Ãâ·Â ########################################
##
##  ÀÛ¼ºÀÚ    : ±èÄ¥ºÀ[´Ð:»êÀÌ] <san2(at)linuxchannel.net>
##  ½ºÅ©¸³Æ® ¸í : PHP¸¦ ÀÌ¿ëÇÑ ½Ã½ºÅÛ Á¤º¸¸¦ Ãâ·ÂÇϴ ½ºÅ©¸³Æ®
##
#############################################################
##
## ÁÖ)
## »ç¿ë»ó ºÎÁÖÀǷΠÀÎÇÑ ÇÇÇØ´Â
## º» ÀÛ¼º¼ºÀÚ¿¡°Ô ¾î¶°ÇÑ º¸ÁõÀ̳ª Ã¥ÀÓÀÌ ¾ø½À´Ï´Ù.
##
##############################################################

##############################################################
##
## speed up `for()'
##  1) not good : for($i=0; $i<count($tmp=@file('file')); $i++)
##  2) good : $tmp=@file('file'); for($i=0; $i<count($tmp); $i++)
##
##############################################################

class sysinfo_common
{
  
## ÆÄÀÏ Å©±â Ãâ·Â ÇÔ¼ö
  ## $bfsize º¯¼ö´Â bytes ´ÜÀ§ÀÇ Å©±âÀÓ
  ##
  
function file_hsize($bfsize$sub=0)
  {
    
$BYTES number_format($bfsize).' Bytes';

    if(
$bfsize 1024) return $BYTES;
    else if(
$bfsize 1048576$bfsize number_format(round($bfsize/1024)).' KB';
    else if(
$bfsize 1073741827$bfsize number_format(round($bfsize/1048576)).' MB';
    else 
$bfsize number_format($bfsize/1073741827,1).' GB';

    if(
$sub$bfsize .= "($BYTES)";

    return 
$bfsize;
  }


  function 
get_title()
  {
    global 
$_SERVER$_ENV// for PHP/4.0.x

    
if(!$hostname[0] = $_ENV["HOSTNAME"])
    { 
$hostname = @file('/proc/sys/kernel/hostname'); }

    return 
$_SERVER['HTTP_HOST'].' ('.$hostname[0].')';
  }


  function 
get_mem()
  {
    if(!
$mem = @file('/proc/meminfo')) return;

    
$get = array();

    if(
preg_match('/^Mem:/',$mem[1])) // Linux/2.2.x/2.4.x
    
{
        list(
$null,$get['total'],$get['used'],$get['free'],$get['shared'],$get['buffered'],$get['cached'])
        = 
preg_split('/\s+/',$mem[1]);
        list(
$null,$get['swaptotal'],$get['swapused'],$get['swapfree']) = preg_split('/\s+/',$mem[2]);
    } else 
// Linux/2.6.0-test
    
{
        
$map = array('MemTotal:'=>'total','MemFree:'=>'free','Buffers:'=>'buffered',
            
'Cached:'=>'cached','SwapTotal:'=>'swaptotal','SwapFree:'=>'swapfree',
            
'kB'=>1024,'B'=>1,'mB'=>1048576,'MB'=>1048576);
        
$mem preg_grep('/^(?:MemTotal|MemFree|Buffers|Cached|SwapTotal|SwapFree):/',$mem);

        foreach(
$mem AS $v)
        {
            
$n preg_split('/\s+/',$v);
            
$mkey $map[$n[0]];
            
$multipli $map[$n[2]];
            
$get[$mkey] = $n[1] * $multipli;
        }
        
$get['used'] = $get['total'] - $get['free'];
    }

    
$get['freepercent'] = @round(($get['free']/$get['total'])*100); // ¿©À¯ ¸Þ¸ð¸® ÆÛ¼¾Æ®
    
$get['usedpercent'] = 100 $get['freepercent']; // »ç¿ëÇÑ ¸Þ¸ð¸® ÆÛ¼¾Æ®

    // 2001.03.18ÀÏ Ãß°¡(½ÇÁ¦ »ç¿ë·® °è»ê)
    
$get['totalfree'] = $get['free'] + $get['buffered'] + $get['cached']; // ½ÇÁ¦ ³²Àº ¸Þ¸ð¸®
    
$get['totalused'] = $get['total'] - $get['totalfree']; // ½ÇÁ¦·Î »ç¿ëÇÑ ¸Þ¸ð¸®
    
$get['totalfreepercent'] = @round(($get['totalfree']/$get['total'])*100); // ½ÇÁ¦ ³²Àº ¸Þ¸ð¸® ÆÛ¼¾Æ®
    
$get['totalusedpercent'] = 100 $get['totalfreepercent'];  // ½ÇÁ¦ »ç¿ëÇÑ ¸Þ¸ð¸® ÆÛ¼¾Æ®

    //2001.02.26ÀÏ Ãß°¡
    
$get['bufferedpercent'] = @round(($get['buffered']/$get['total'])*100); // ¹öÆÛ¸Þ¸ð¸® ÆÛ¼¾Æ®
    
$get['cachedpercent'] = @round(($get['cached']/$get['total'])*100); // Ä³½¬¸Þ¸ð¸® ÆÛ¼¾Æ®

    
$get['swapfreepercent'] = @round(($get['swapfree']/$get['swaptotal'])*100); // ½º¿Ò ¿©À¯ °ø°£ ÆÛ¼¾Æ®
    
$get['swapusedpercent'] = 100 $get['swapfreepercent']; // »ç¿ëÇÑ ½º¿Ò ÆÛ¼¾Æ®

    // º¸Á¤
    
foreach(array('total','free','used','buffered','cached','totalfree','totalused',
        
'swaptotal','swapfree','swapused') AS $k)
    {
        
$get[$k] = $this->file_hsize($get[$k]);
    }

    return 
$get;
  }


  function 
get_part()
  {
    
## °¢ ÆÄƼ¼Ç(FS)¿Í ¸¶¿îÆ® Æ÷ÀÎÆ® °è»ê
    ##
    
$mounts = @file('/proc/mounts');

    for(
$i=0$i<count($mounts); $i++)
    {
        if(
preg_match('/ext[23]|vfat|ntfs|reiserfs|xfs|jfs/',$mounts[$i]))
        {
            list(
$p['dev'][],$p['mount'][],$p['efs'][])
            = 
preg_split('/\s+/'$mounts[$i]);
        }
    }

    
$num count($p['dev']);

    
## °¢ ÆÄƼ¼Ç »ç¿ë·® °è»ê
    ##
    
@exec('/bin/df -k 2>/dev/null',$df); // KB ´ÜÀ§·Î Ãâ·Â, $df´Â ¹è¿­

    
if($df)
    {
        unset(
$p['dev']); // change partition name
        
for($i=1$i<count($df); $i++)
        {
            if(
preg_match(';^/dev/;',$df[$i]))
            {
                list(
$p['dev'][],$size,$used,$avail,$percent)
                = 
preg_split('/\s+/',$df[$i]);

                
## °¢ ÆÄƼ¼Ç used %
                ##
                
$percent = (int)$percent;
                
$p['percent'][] = $percent;
                
$p['percent_avail'][] = 100 $percent;

                
## °¢ ÆÄƼ¼Ç Å©±â
                ##
                
$size $size 1024// for PHP/4.3.2 bug ?
                
$p['size']['sum'] += $size// Byte ´ÜÀ§·Î È¯»ê
                
$p['size'][] = $this->file_hsize($size);

                
## °¢ ÆÄƼ¼Ç »ç¿ëÇÑ ¿ë·®
                ##
                
$used $used 1024// for PHP/4.3.2 bug ?
                
$p['used']['sum'] += $used;
                
$p['used'][] = $this->file_hsize($used);

                
## °¢ ÆÄƼ¼Ç ¿©À¯ ¿ë·®
                ##
                
$avail $avail 1024// for PHP/4.3.2 bug ?
                
$p['avail']['sum'] += $avail;
                
$p['avail'][] = $this->file_hsize($avail);
            }
        }

        
$p['fix'] = '* ÇÕ°è°¡ Á¤È®ÇϰԠ¸ÂÁö ¾ÊÀº ÀÌÀ¯´Â ¾à '.
            
$this->file_hsize($p['size']['sum'] - $p['used']['sum'] - $p['avail']['sum']).
            
'(°¢ ÆÄƼ¼Ç ÇÕ) Á¤µµ¸¦ ½Ã½ºÅÛÀÌ ¹Ì¸® È®º¸Ç߱⠶§¹®ÀÔ´Ï´Ù.';

        
$p['percent']['total'] = @round($p['used']['sum']*100/$p['size']['sum']);
        
$p['percent_avail']['total'] = 100 $p['percent']['total'];
        
$p['size']['sum'] = $this->file_hsize($p['size']['sum']);
        
$p['used']['sum'] = $this->file_hsize($p['used']['sum']);
        
$p['avail']['sum'] = $this->file_hsize($p['avail']['sum']);

        
## last check partitions number
        ##
        
$cnt count($p['dev']);

        
/*** good idea, but unnecessary
        ## check chroot enviroments
        ##
        if($num > $cnt)
        { for($i=$cnt; $i<$num; $i++) $p['size'][$i] = 'NA'; }
        ***/
    
}

    
## change partitions number
    ##
    
$p['dev']['num'] = $cnt $cnt $num;

    return 
$p;
  }


  
## support S/390, 2002.10.23
  ##
  
function get_proc_part()
  {
    if(!
$part = @file('/proc/partitions')) return;

    
## disk block table
    ## /usr/src/linux/Documentations/devices.txt
    ## major => 'type','name','minor'
    ##
    
$ddtable = array(
    
=> array('eide','E-IDE',64),        // First MFM, RLL and IDE hard disk/CD-ROM interface
    
=> array('scsi','SCSI',16),        // SCSI disk devices
    
=> array('raid','RAID',1),        // Metadisk (RAID) devices
    
13=> array('ide','XT-IDE',64),        // 8-bit MFM/RLL/IDE controller
    
14=> array('bios','BIOS',64),        // BIOS harddrive
    
21=> array('acorn','Acorn-MFM',64),    // Acorn MFM hard drive interface
    
22=> array('eide','E-IDE',64),        // Second IDE hard disk/CD-ROM interface
    
28=> array('acsi','ACSI',16),        // ACSI disk (68k/Atari)
    
33=> array('eide','E-IDE',64),        // Third IDE hard disk/CD-ROM interface
    
34=> array('eide','E-IDE',64),        // Fourth IDE hard disk/CD-ROM interface
    
36=> array('mca','MCA-ESDI',64),    // MCA ESDI hard disk
    
45=> array('ide','PP-IDE',16),        // Parallel port IDE disk devices
    
47=> array('atapi','PP-ATAPI',1),    // Parallel port ATAPI disk devices
    
48=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    
49=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    
50=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    
51=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    
52=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    
53=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    
54=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    
55=> array('raid','DAC960-RAID',8),    // Mylex DAC960 PCI RAID controller
    
56=> array('eide','E-IDE',64),        // Fifth IDE hard disk/CD-ROM interface
    
57=> array('eide','E-IDE',64),        // Sixth IDE hard disk/CD-ROM interface
    
65=> array('scsi','SCSI',16),        // SCSI disk devices
    
66=> array('scsi','SCSI',16),        // SCSI disk devices
    
67=> array('scsi','SCSI',16),        // SCSI disk devices
    
68=> array('scsi','SCSI',16),        // SCSI disk devices
    
69=> array('scsi','SCSI',16),        // SCSI disk devices
    
70=> array('scsi','SCSI',16),        // SCSI disk devices
    
71=> array('scsi','SCSI',16),        // SCSI disk devices
    
72=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
73=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
74=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
75=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
76=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
77=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
78=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
79=> array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
80=> array('i2o','I2O',16),        // I2O hard disk
    
81=> array('i2o','I2O',16),        // I2O hard disk
    
82=> array('i2o','I2O',16),        // I2O hard disk
    
83=> array('i2o','I2O',16),        // I2O hard disk
    
85=> array('i2o','I2O',16),        // I2O hard disk
    
86=> array('i2o','I2O',16),        // I2O hard disk
    
87=> array('i2o','I2O',16),        // I2O hard disk
    
88=> array('eide','E-IDE',64),        // Seventh IDE hard disk/CD-ROM interface
    
89=> array('eide','E-IDE',64),        // Eighth IDE hard disk/CD-ROM interface
    
90=> array('eide','E-IDE',64),        // Ninth IDE hard disk/CD-ROM interface
    
91=> array('eide','E-IDE',64),        // Tenth IDE hard disk/CD-ROM interface
    
92=> array('ppdd','PPDD',1),        // PPDD encrypted disk driver
    
94=> array('ibm','IBM-S/390-DASD',4),    // IBM S/390 DASD block storage
    
95=> array('ibm','IBM-S/390-VM/ESA',1),    // IBM S/390 VM/ESA minidisk
    
101=>array('raid','AMI-HD-RAID',16),    // AMI HyperDisk RAID controller
    
104=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
105=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
106=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
107=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
108=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
109=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
110=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
111=>array('compaq','Compaq',16),    // Compaq Intelligent Drive Array
    
112=>array('ibm','IBM-iSeries',8),    // IBM iSeries virtual disk
    
199=>array('vm','VxVM',1)        // Veritas volume manager (VxVM) volumes
    
);

    for(
$i=2$i<count($part); $i++) // start check $ppart[2];
    
{
        list(
$major,$minor,$blocks,$name) = preg_split('/\s+/',trim($part[$i]));
        if(
$d $ddtable[$major])
        {
            
$type $d[0];
            if(
$minor $d[2])
            {
                
$ppart[$type][$key] .= $name ' ';
                if(
$blocks == 1)
                {
                    
$ppart[$type][$key] .= '&lt; ';
                    
$check[$type][] = $key;
                }
            } else
            {
                
$key = (int) ${$type}++; // it's mean that counts of the HDD number
                //$key = $major.$minor; // HDD uniq ID
                
$this->dd[$type][$key] = array('name'=>$d[1],'major'=>$major,'minor'=>$minor);
            }
        }
    }
    
    if(
is_array($ppart))
    {
        foreach(
array_keys($ppart) AS $type)
        {
            if(
$check[$type])
            {
                foreach(
$check[$type] AS $key)
                { 
$ppart[$type][$key] .= '&gt;'; }
            }
            
sort($ppart[$type]); // for value sort
            
sort($this->dd[$type]);
        }
    }

    return 
$ppart;
  }


  function 
get_swpart()
  {
    if(!
$swaps = @file('/proc/swaps')) return;

    for(
$i=1$i<count($swaps); $i++)
    { 
$sw .= preg_replace(';^/dev/([^ ]+).+\n*$;','\\1',$swaps[$i]) . ','; }

    return 
preg_replace('/,$/','',$sw);
  }


  
## same as $utils->get_file($file)
  ##
  
function get_release($file)
  {
    if(!
file_exists($file)) return;

    if(
function_exists(dio_open))
    {
        if(
$fp = @dio_open($file,O_RDONLY))
        {
            
$contents dio_read($fp,filesize($file));
            
dio_close($fp);
        }
        return 
$contents;
    }

    if(
$fp = @fopen($file,'r'))
    {
        
$contents fread($fp,filesize($file));
        
fclose($fp);
    }

    return 
$contents;
  }


  function 
get_os()
  {
    global 
$ARCH;

    
$ostype PHP_OS;
    if(!
$ARCH['r'] && (!$ARCH['r'] = $this->dmesg['kernel']))
    {
        unset(
$ostype);
        if(!
$kernel = @file('/proc/sys/kernel/osrelease'))
        {
            if(
$kernel = @file('/proc/version'))
            { 
$ARCH['r'] = preg_replace('/^([^(]+) \(.+$/','\\1',$kernel[0]); }
        }
        else 
$ARCH['r'] = $kernel[0];
    }

    
$tmp = array('/etc/hancom-release','/etc/redhat-release','/etc/debian_release',
        
'/etc/version','/etc/Version','/etc/wow-release','/etc/wowlinux-release');

    foreach(
$tmp AS $v) if($dist $this->get_release($v)) break;

    if(!
$dist)
    {
        if(
$hdle = @opendir('/etc'))
        {
            while(
$file = @readdir($hdle))
            {
                if(
preg_match('/release|version/i',$file))
                { 
$dist $this->get_release('/etc/'.$file); break; }
            }
            
closedir($hdle);
        }
    }

    return 
"$ostype $ARCH[r] $ARCH[m]" . ($dist ' / '.$dist '');
  }


  function 
get_netstat()
  {
    if(!
$netstat = @file('/proc/net/dev')) return;

    for(
$i=2$i<count($netstat); $i++)
    {
        
## ':'°ú °ø¹é¹®ÀÚ¸¦ ³ª´©¾î ¹è¿­ÇüÅ·Π¸¸µë
        ## R : ¹Þ´Â ÆÐŶ
        ## T : º¸³½ ÆÐŶ

        
$j $i 2;
        
$tmp explode(':',$netstat[$i]);
        
$stat['iface'][$j] = trim($tmp[0]);

        if(
preg_match('/^bond/',$stat['iface'][$j])) $bonding++;
        else if(
preg_match('/^eth/',$stat['iface'][$j])) $ethernet++;

        list(
$bytes['R'],$stat['R_packets'][$j],$stat['R_errs'][$j],$stat['R_drop'][$j],
            
$null,$null,$null,$null,$bytes['T'],$stat['T_packets'][$j],
            
$stat['T_errs'][$j],$stat['T_drop'][$j],$stat['T_colls'][$j]
        ) = 
preg_split('/\s+/',trim($tmp[1]));

        
$stat['R_size'][$j] = $this->file_hsize($bytes['R']);
        
$stat['T_size'][$j] = $this->file_hsize($bytes['T']);

        
// Ãæµ¹·ü °è»ê
        
if($stat['T_packets'][$j] > 0)
        {
            if((int)
$stat['T_colls'][$j]*100/$stat['T_packets'][$j] >= 5)
            {
                
$stat['T_colls'][$j] = '<FONT COLOR="FF0000">'.$stat['T_colls'][$j].'</FONT>';
                
$chk .= $stat['iface'][$j] . '&nbsp;';
            }
        }
    }

    if(
$bonding && $ethernet >= 2)
    {
        
//$ethernet = $j - $bonding;
        
$stat['fix'] = "ÇöÀç ÀÌ ½Ã½ºÅÛÀº ${ethernet}°³ÀÇ ".
            
TAG_A("<font color='#0000FF'>Ethernet Channel¿¡ ´ëÇØ¼­ ${bonding}°³ÀÇ ".
            
'°¡»ó bonding ÀåÄ¡</font>',
            
'http://www.linuxchannel.net/docs/ethernet-channel-bonding.txt',
            
'_blank','About the ethernet channel bonding').
            
'°¡ ¼³Á¤µÇ¾î ÀÖÀ½.<BR>&nbsp;&nbsp;';
    }

    
$stat['fix'] = "* $stat[fix] TXÀÇ Colls Ç׸ñÀº collisionsÀ» ÀǹÌ.";
    if(
$chk)
    { 
$stat['fix'] .= "<BR>&nbsp;&nbsp; <FONT COLOR='#FF0000'>$chk</FONT>°ËÁ¡ ÇÊ¿ä(Ãæµ¹·ü 5%ÀÌ»ó) !!!"; }

    return 
$stat;
  }
// end of class

?>