commit 82a0f938d4949d14441eb924c659c4526181d288 Author: Olaf Rempel Date: Sat Feb 4 16:04:08 2006 +0100 Initial commit diff --git a/monitoring.php b/monitoring.php new file mode 100755 index 0000000..f0e2655 --- /dev/null +++ b/monitoring.php @@ -0,0 +1,110 @@ +#!/usr/bin/php + $cpu) + if ($name != 'cpu') + CpuRRD::update($name, $cpu); + + ProcRRD::update("proc", $arr['sys']); + LavgRRD::update("load", $arr['load']); + MemRRD::update("mem", $arr['mem'][0]); + SwapRRD::update("swap", $arr['mem'][1]); + UpRRD::update('uptime', $arr['up']); + + foreach ($arr['iface'] as $name => $iface) + IfaceRRD::update("if_".$name, $iface[0], $iface[1]); + + + foreach ($arr['disks'] as $name => $disk) { + FsRRD::update('fs_'.$name, $disk); + DiskRRD::update('disk_'.$name, $disk[3]); + } + + if (isset($arr['mysql'])) + MysqlRRD::update("mysql", $arr['mysql']); + + if (isset($arr['httpd'])) + HttpdRRD::update("httpd", $arr['httpd']); + + if (isset($arr['named'])) + NamedRRD::update("named", $arr['named']); + + if (isset($arr['squid'])) + SquidRRD::update("squid", $arr['squid']); + + if (isset($arr['conntrack'])) { + ConntrackRRD::update("conntrack", $arr['conntrack']); + TcpRRD::update("tcp", $arr['conntrack']['stat']); + } + + if (isset($arr['rtstat'])) + RtStatRRD::update("rtstat", $arr['rtstat']); + + if (isset($arr['ctstat'])) + CtStatRRD::update("ctstat", $arr['ctstat']); +} + + +function request_all($host, $port) { + $handle = fsockopen($host, $port, $errno, $errstr, 10); + if (!$handle) { + echo "$errstr ($errno)"; + die(); + } + $buffer = ""; + while (!feof($handle)) + $buffer .= fgets($handle, 4096); + fclose($handle); + + return unserialize(trim($buffer)); +} + + +if (!isset($_SERVER['argv'][1])) + $_SERVER['argv'][1] = "local"; + +switch ($_SERVER['argv'][1]) { + case 'local': parse_all(get_all()); + break; + + case 'server': echo serialize(get_all())."\n"; + break; + + case 'client': if (!isset($_SERVER['argv'][2]) || !isset($_SERVER['argv'][3])) + break; + + parse_all(request_all($_SERVER['argv'][2], $_SERVER['argv'][3])); + break; + + case 'test': print_r(get_all()); + break; +} +?> \ No newline at end of file diff --git a/rrd.class.php b/rrd.class.php new file mode 100644 index 0000000..c3b3ffa --- /dev/null +++ b/rrd.class.php @@ -0,0 +1,848 @@ + diff --git a/rrdgraph.php b/rrdgraph.php new file mode 100644 index 0000000..d1c2f72 --- /dev/null +++ b/rrdgraph.php @@ -0,0 +1,180 @@ + 'CPU Usage', + 'proc' => 'Interrupts / Context Switchs', + 'load' => 'Load Average', + 'mem' => 'Memory Usage', + 'swap' => 'Swap Usage', + 'uptime' => 'Uptime (days)', + 'hr', + 'if_br0' => 'Traffic br0 - internal bridge', + 'if_eth0' => 'Traffic eth0 - 100BaseT - bridged', + 'if_wlan0' => 'Traffic wlan0 - 802.11b - bridged', + 'if_ppp0' => 'Traffic ppp0 - 768/128 TDSL', + 'if_ppp1' => 'Traffic ppp1 - 115.2kbaud dect-link', + 'if_tap0' => 'Traffic tap0 - layer2 tunnel - bridged (seppel)', + 'if_tap2' => 'Traffic tap2 - openvpn tunnel (xittix) - routed', + 'if_tap3' => 'Traffic tap3 - openvpn tunnel (server) - routed', + 'if_tap5' => 'Traffic tap5 - layer2 tunnel - bridged (roadwarrior)', + 'if_sixxs' => 'Traffic sixxs - ipv6 tunnel', + 'if_hpot0' => 'Traffic hpot0 - to/from honeypot', + 'hr', + 'conntrack1' => 'IP Connections (overview)', + 'conntrack2' => 'IP Connections (protocols)', + 'tcp' => 'TCP Connection States', + 'ctstat' => 'Conntrack Statistics', + 'rtstat1' => 'Routing Cache Statistics', + 'rtstat2' => 'Routing Cache Garbage Collector', + 'hr', + 'mysql' => 'MySQL Usage', + 'httpd' => 'Apache Usage', + 'squid1' => 'Squid Proxy Traffic Usage', + 'squid2' => 'Squid Proxy Requests/Hits', + 'named' => 'DNS Usage', + 'hr', + 'fs_hda3' => 'Filesystem /', + 'disk_hda3' => 'read/write /', + 'fs_hda4' => 'Filesystem /home', + 'disk_hda4' => 'read/write /home', + 'fs_hdc1' => 'Filesystem /mnt/data', + 'disk_hdc1' => 'read/write /mnt/data', + ); + +$views = array( 1 => -3600 * 6, + 2 => -3600 * 24, + 3 => -3600 * 24 * 7, + 4 => -3600 * 24 * 28, + 5 => -3600 * 24 * 365, + ); + +function html_overview($view = 1) { + global $graphs; + echo "RRDgraph Overview\n"; + foreach ($graphs as $graph => $text) { + if ($text != 'hr') { + echo ""; + echo ""; + echo "

\n"; + + } else { + echo "

"; + } + } + echo "\n"; +} + +function html_detail($graph) { + global $graphs, $views; + echo "{$graphs[$graph]}\n"; + foreach ($views as $view => $start) { + echo ""; + echo "

\n"; + } + echo "\n"; +} + +function img_graph($graph, $view) { + global $graphs, $views; + + $start = (isset($views[$view])) ? $views[$view] : $views[1]; + switch ($graph) { + case 'proc': + ProcRRD::graph($graph, $start, $graphs[$graph]); + break; + + case 'load': + LavgRRD::graph($graph, $start, ($view == 1), $graphs[$graph]); + break; + + case 'mem': + MemRRD::graph($graph, $start, $graphs[$graph]); + break; + + case 'swap': + SwapRRD::graph($graph, $start, $graphs[$graph]); + break; + + case 'mysql': + MysqlRRD::graph($graph, $start, $graphs[$graph]); + break; + + case 'httpd': + HttpdRRD::graph($graph, $start, $graphs[$graph]); + break; + + case 'named': + NamedRRD::graph($graph, $start, $graphs[$graph]); + break; + + case 'uptime': + UpRRD::graph($graph, $start, $graphs[$graph]); + break; + + case 'squid1': + SquidRRD::graph1(substr($graph, 0, strlen('squid')), $start, $graphs[$graph]); + break; + + case 'squid2': + SquidRRD::graph2(substr($graph, 0, strlen('squid')), $start, $graphs[$graph]); + break; + + case 'conntrack1': + ConntrackRRD::graph1(substr($graph, 0, strlen('conntrack')), $start, ($view == 1), $graphs[$graph]); + break; + + case 'conntrack2': + ConntrackRRD::graph2(substr($graph, 0, strlen('conntrack')), $start, $graphs[$graph]); + break; + + case 'tcp': + TcpRRD::graph($graph, $start, $graphs[$graph]); + break; + + case 'rtstat1': + RtStatRRD::graph1(substr($graph, 0, strlen('rtstat')), $start, $graphs[$graph]); + break; + + case 'rtstat2': + RtStatRRD::graph2(substr($graph, 0, strlen('rtstat')), $start, $graphs[$graph]); + break; + + case 'ctstat': + CtStatRRD::graph($graph, $start, $graphs[$graph]); + break; + + default: + if (strpos($graph, 'if_') !== false) + IfaceRRD::graph($graph, $start, ($view == 1), $graphs[$graph]); + + else if (strpos($graph, 'fs_') !== false) + FsRRD::graph($graph, $start, $graphs[$graph]); + + else if (strpos($graph, 'disk_') !== false) + DiskRRD::graph($graph, $start, $graphs[$graph]); + + else if (strpos($graph, 'cpu') !== false) + CpuRRD::graph($graph, $start, ($view == 1), $graphs[$graph]); + + break; + } +} + +if (isset($_GET['show'])) { + html_detail($_GET['show']); + +} else if (isset($_GET['graph'])) { + $view = (isset($_GET['view'])) ? $_GET['view'] : 1; + img_graph($_GET['graph'], $view); + +} else { + html_overview(); +} + +?> diff --git a/rrdgraph.xinetd b/rrdgraph.xinetd new file mode 100644 index 0000000..6e1fcee --- /dev/null +++ b/rrdgraph.xinetd @@ -0,0 +1,12 @@ +service rrdgraph +{ + disable = no + port = 666 + type = UNLISTED + flags = NOLIBWRAP + socket_type = stream + wait = no + user = root + server = /usr/bin/php + server_args = /etc/rrdtool/monitoring.php server +} diff --git a/stat.class.php b/stat.class.php new file mode 100644 index 0000000..90787d7 --- /dev/null +++ b/stat.class.php @@ -0,0 +1,298 @@ + 0)) + usleep(100000); + + $stats = file($statfile); + foreach ($stats as $line) { + if (strpos($line, 'success') !== false) { + $parts = preg_split("/[\s:]+/", trim($line)); + $named[0] = $parts[1]; + + } elseif (strpos($line, 'referral') !== false) { + $parts = preg_split("/[\s:]+/", trim($line)); + $named[1] = $parts[1]; + + } elseif (strpos($line, 'nxrrset') !== false) { + $parts = preg_split("/[\s:]+/", trim($line)); + $named[2] = $parts[1]; + + } elseif (strpos($line, 'nxdomain') !== false) { + $parts = preg_split("/[\s:]+/", trim($line)); + $named[3] = $parts[1]; + + } elseif (strpos($line, 'recursion') !== false) { + $parts = preg_split("/[\s:]+/", trim($line)); + $named[4] = $parts[1]; + + } elseif (strpos($line, 'failure') !== false) { + $parts = preg_split("/[\s:]+/", trim($line)); + $named[5] = $parts[1]; + } + } + return $named; + } + + function get_squid($host, $comunity) { + $cmd = "/usr/bin/snmpget -v1 -c {$comunity} {$host} ". + ".1.3.6.1.4.1.3495.1.3.2.1.1 .1.3.6.1.4.1.3495.1.3.2.1.2 ". + ".1.3.6.1.4.1.3495.1.3.2.1.3 .1.3.6.1.4.1.3495.1.3.2.1.4 ". + ".1.3.6.1.4.1.3495.1.3.2.1.5 .1.3.6.1.4.1.3495.1.3.2.1.10 ". + ".1.3.6.1.4.1.3495.1.3.2.1.11 .1.3.6.1.4.1.3495.1.3.2.1.12 ". + ".1.3.6.1.4.1.3495.1.3.2.1.13 .1.3.6.1.4.1.3495.1.3.2.1.14 ". + "-O qs"; + + exec($cmd, $poll); + foreach ($poll as $line) { + $parts = preg_split("/[\s:]+/", trim($line)); + $squid[] = $parts[1]; + } + return $squid; + } + + function get_conntrack() { + $retval = array(); + $retval['total'] = 0; + $retval['assured'] = 0; + $retval['unreplied'] = 0; + $retval['tcp'] = 0; + $retval['udp'] = 0; + $retval['unknown'] = 0; + $retval['stat']['NONE'] = 0; + $retval['stat']['SYN_SENT'] = 0; + $retval['stat']['SYN_RECV'] = 0; + $retval['stat']['ESTABLISHED'] = 0; + $retval['stat']['FIN_WAIT'] = 0; + $retval['stat']['CLOSE_WAIT'] = 0; + $retval['stat']['LAST_ACK'] = 0; + $retval['stat']['TIME_WAIT'] = 0; + $retval['stat']['CLOSE'] = 0; + $retval['stat']['LISTEN'] = 0; + $retval['local'] = 0; + $retval['nated'] = 0; + + $max = file('/proc/sys/net/ipv4/ip_conntrack_max'); + $retval['max'] = (int)$max[0]; + + $conn = file('/proc/net/ip_conntrack'); + foreach ($conn as $line) { + $flags = 0x0; + + $retval['total']++; + $parts = preg_split("/[\s:]+/", trim($line)); + + if (strpos($line, '[ASSURED]') !== false) { + $retval['assured']++; + } + + if (strpos($line, '[UNREPLIED]') !== false) { + $retval['unreplied']++; + $flags |= 0x1; + } + + if (strpos($line, 'tcp') !== false) { + $retval['tcp']++; + $retval['stat'][$parts[3]]++; + + if (!($flags & 0x1)) { + // dst1 != src2 || src1 != dst2 + if (substr($parts[5], 4) != substr($parts[10], 4) || substr($parts[4], 4) != substr($parts[11], 4)) + $retval['nated']++; + else + $retval['local']++; + } + + } else if (strpos($line, 'udp') !== false) { + $retval['udp']++; + + if (!($flags & 0x1)) { + // dst1 != src2 || src1 != dst2 + if (substr($parts[4], 4) != substr($parts[9], 4) || substr($parts[3], 4) != substr($parts[10], 4)) + $retval['nated']++; + else + $retval['local']++; + } + + } else { + $retval['unknown']++; + } + } + return $retval; + } + + function get_netstat($file) { + $stat = file($file); + $retval = preg_split("/[\s:]+/", trim($stat[1])); + foreach ($retval as $key => $val) + $retval[$key] = hexdec($val); + return $retval; + } +} + +?> +