librenms/includes/functions.php
Adam Amstrong 9ca765c285 Lots of additions.
git-svn-id: http://www.observium.org/svn/observer/trunk@108 61d68cd4-352d-0410-923a-c4978735b2b8
2007-06-24 14:56:47 +00:00

550 lines
21 KiB
PHP
Executable File

<?
include("generic.php");
include("ios.php");
include("unix.php");
include("windows.php");
include("procurve.php");
include("snom.php");
include("graphing.php");
include("print-functions.php");
function devicepermitted($device_id) {
global $_SESSION;
if($_SESSION['level'] > "5") { $allowed = true;
} elseif ( @mysql_result(mysql_query("SELECT * FROM devices_perms WHERE `user_id` = '" . $_SESSION['user_id'] . "' AND `device_id` = $device_id"), 0) > '0' ) {
$allowed = true;
} else { $allowed = false; }
return $allowed;
}
function formatRates($rate) {
$sizes = Array('bps', 'Kbps', 'Mbps', 'Gbps', 'Tbps', 'Pbps', 'Ebps');
$round = Array('0','0','0','2','2','2','2','2','2');
$ext = $sizes[0];
for ($i=1; (($i < count($sizes)) && ($rate >= 1000)); $i++) { $rate = $rate / 1000; $ext = $sizes[$i]; }
return round($rate, $round[$i]).$ext;
}
function formatStorage($size) {
$sizes = Array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB');
$ext = $sizes[0];
for ($i=1; (($i < count($sizes)) && ($size >= 1024)); $i++) { $size = $size / 1024; $ext = $sizes[$i]; }
return round($size, 2).$ext;
}
function percent_colour($perc)
{
$r = min(255, 5 * ($perc - 50));
$b = max(0, 255 - (5 * $perc));
return sprintf('#%02x%02x%02x', $r, 0, $b);
}
function percent_colour_old($perc) {
$red = round(5 * $perc);
$blue = round(255 - (5 * $perc));
if($red > '255') { $red = "255"; }
if($blue < '0') { $blue = "0"; }
$red = dechex($red);
$blue = dechex($blue);
if(strlen($red) == 1) { $red = "0$red"; }
if(strlen($blue) == 1) { $blue = "0$blue"; }
$colour = "#$red" . "00" . "$blue";
return $colour;
}
function print_error($text){
echo("<table class=errorbox cellpadding=3><tr><td><img src='/images/15/exclamation.png' align=absmiddle> $text</td></tr></table>");
}
function print_message($text){
echo("<table class=messagebox cellpadding=3><tr><td><img src='/images/16/tick.png' align=absmiddle> $text</td></tr></table>");
}
function truncate($substring, $max = 50, $rep = '...') {
if(strlen($substring) < 1){ $string = $rep; } else { $string = $substring; }
$leave = $max - strlen ($rep);
if(strlen($string) > $max){ return substr_replace($string, $rep, $leave); } else { return $string; }
}
function interface_rates ($interface) {
global $rrdtool;
$rrdfile = "rrd/" . $interface['hostname'] . "." . $interface['ifIndex'] . ".rrd";
$data = trim(`$rrdtool fetch -s -600s -e now $rrdfile AVERAGE | grep : | cut -d" " -f 2,3 | grep e`);
# $data = trim(`$rrdtool fetch -s -301s -e -300s $rrdfile AVERAGE | grep : | cut -d" " -f 2,3`);
foreach( explode("\n", $data) as $entry) {
list($in, $out) = split(" ", $entry);
$rate['in'] = $in * 8;
$rate['out'] = $out * 8;
}
return $rate;
}
function interface_errors ($interface) {
global $rrdtool;
$rrdfile = "rrd/" . $interface['hostname'] . "." . $interface['ifIndex'] . ".rrd";
$data = trim(`$rrdtool fetch -s -1d -e -300s $rrdfile AVERAGE | grep : | cut -d" " -f 4,5`);
foreach( explode("\n", $data) as $entry) {
list($in, $out) = explode(" ", $entry);
$in_errors += ($in * 300);
$out_errors += ($out * 300);
}
$errors['in'] = round($in_errors);
$errors['out'] = round($out_errors);
return $errors;
}
function geteventicon ($message) {
if($message == "Device status changed to Down") { $icon = "server_connect.png"; }
if($message == "Device status changed to Up") { $icon = "server_go.png"; }
if($message == "Interface went down" || $message == "Interface changed state to Down" ) { $icon = "if-disconnect.png"; }
if($message == "Interface went up" || $message == "Interface changed state to Up" ) { $icon = "if-connect.png"; }
if($message == "Interface disabled") { $icon = "if-disable.png"; }
if($message == "Interface enabled") { $icon = "if-enable.png"; }
if($icon) { return $icon; } else { return false; }
}
function generateiflink($interface, $text=0,$type=bits) {
global $twoday;
global $now;
if(!$text) { $text = fixIfName($interface['ifDescr']); }
if(!$type) { $type = 'bits'; }
$class = ifclass($interface['ifOperStatus'], $interface['ifAdminStatus']);
$graph_url = "graph.php?if=" . $interface['interface_id'] . "&from=$twoday&to=$now&width=400&height=120&type=" . $type;
$link = "<a class=$class href='?page=interface&id=" . $interface['interface_id'] . "' ";
$link .= "onmouseover=\"return overlib('<img src=\'$graph_url\'>');\" onmouseout=\"return nd();\">$text</a>";
return $link;
}
function generatedevicelink($device, $text=0) {
global $twoday;
global $now;
$class = devclass($device);
if(!$text) { $text = $device['hostname']; }
$graph_url = "graph.php?host=" . $device[device_id] . "&from=$twoday&to=$now&width=400&height=120&type=cpu";
$link = "<a class=$class href='?page=device&id=" . $device['device_id'] . "' onmouseover=\"return overlib('<img src=\'$graph_url\'>');\" onmouseout=\"return nd();\">$text</a>";
return $link;
}
function device_traffic_image($device, $width, $height, $from, $to) {
return "<img src='graph.php?device=" . $device . "&type=device_bits&from=" . $from . "&to=" . $to . "&width=" . $width . "&height=" . $height . "' />";
}
function devclass($device) {
if ($device['status'] == '0') { $class = "list-device-down"; } else { $class = "list-device"; }
if ($device['ignore'] == '1') {
$class = "list-device-ignored";
if ($device['status'] == '1') { $class = "list-device-ignored-up"; }
}
return $class;
}
function getImage($host) {
$sql = "SELECT * FROM `devices` WHERE `device_id` = '$host'";
$data = mysql_fetch_array(mysql_query($sql));
$type = strtolower($data['os']);
if(file_exists("images/os/$type" . ".png")){ $image = "<img src='images/os/$type.png'>";
} elseif(file_exists("images/os/$type" . ".gif")){ $image = "<img src='images/os/$type.gif'>"; }
if($device['monowall']) {$image = "<img src='images/os/m0n0wall.png'>";}
if($type == "linux") {
$features = strtolower(trim($data[features]));
list($distro) = split(" ", $features);
if(file_exists("images/os/$distro" . ".png")){ $image = "<img src='images/os/$distro" . ".png'>";
} elseif(file_exists("images/os/$distro" . ".gif")){ $image = "<img src='images/os/$distro" . ".gif'>"; }
}
return $image;
}
function delHost($id) {
$host = mysql_result(mysql_query("SELECT hostname FROM devices WHERE device_id = '$id'"), 0);
mysql_query("DELETE FROM `devices` WHERE `device_id` = '$id'");
$int_query = mysql_query("SELECT * FROM `interfaces` WHERE `device_id` = '$id'");
while($int_data = mysql_fetch_array($int_query)) {
$int_if = $int_data['ifDescr'];
$int_id = $int_data['interface_id'];
mysql_query("DELETE from `adjacencies` WHERE `interface_id` = '$int_id'");
mysql_query("DELETE from `links` WHERE `src_if` = '$int_id'");
mysql_query("DELETE from `links` WHERE `dst_if` = '$int_id'");
mysql_query("DELETE from `ipaddr` WHERE `interface_id` = '$int_id'");
echo("Removed interface $int_id ($int_if)<br />");
}
mysql_query("DELETE FROM `devices_attribs` WHERE `device_id` = '$id'");
mysql_query("DELETE FROM `temperature` WHERE `temp_host` = '$id'");
mysql_query("DELETE FROM `storage` WHERE `host_id` = '$id'");
mysql_query("DELETE FROM `alerts` WHERE `device_id` = '$id'");
mysql_query("DELETE FROM `eventlog` WHERE `host` = '$id'");
mysql_query("DELETE FROM `syslog` WHERE `host` = '$id'");
mysql_query("DELETE FROM `interfaces` WHERE `device_id` = '$id'");
mysql_query("DELETE FROM `services` WHERE `service_host` = '$id'");
mysql_query("DELETE FROM `alerts` WHERE `device_id` = '$id'");
`rm -f rrd/$host-*.rrd`;
echo("Removed device $host<br />");
}
function addHost($host, $community, $snmpver) {
list($hostshort) = explode(".", $host);
if ( isDomainResolves($host)){
if ( isPingable($host)) {
if ( mysql_result(mysql_query("SELECT COUNT(*) FROM `devices` WHERE `hostname` = '$host'"), 0) == '0' ) {
$snmphost = trim(`snmpwalk -Oqv -$snmpver -c $community $host sysname | sed s/\"//g`);
if ($snmphost == $host || $hostshort = $host) {
createHost ($host, $community, $snmpver);
} else { echo("Given hostname does not match SNMP-read hostname!\n"); }
} else { echo("Already got host $host\n"); }
} else { echo("Could not ping $host\n"); }
} else { echo("Could not resolve $host\n"); }
}
function overlibprint($text) {
return "onmouseover=\"return overlib('" . $text . "');\" onmouseout=\"return nd();\"";
}
function scanUDP ($host, $port, $timeout) {
$handle = fsockopen($host, $port, &$errno, &$errstr, 2);
if (!$handle) {
}
socket_set_timeout ($handle, $timeout);
$write = fwrite($handle,"\x00");
if (!$write) {
next;
}
$startTime = time();
$header = fread($handle, 1);
$endTime = time();
$timeDiff = $endTime - $startTime;
if ($timeDiff >= $timeout) {
fclose($handle);
return 1;
} else {
fclose($handle);
return 0;
}
}
function humanmedia($media) {
$media = preg_replace("/^ethernetCsmacd$/", "Ethernet", $media);
$media = preg_replace("/^softwareLoopback$/", "Software Loopback", $media);
$media = preg_replace("/^tunnel$/", "Tunnel", $media);
$media = preg_replace("/^propVirtual$/", "Ethernet VLAN", $media);
$media = preg_replace("/^ppp$/", "PPP", $media);
$media = preg_replace("/^slip$/", "SLIP", $media);
return $media;
}
function humanspeed($speed) {
$speed = preg_replace("/^0$/", "-", $speed);
$speed = preg_replace("/^9000$/", "9Kbps", $speed);
$speed = preg_replace("/^48000$/", "48Kbps", $speed);
$speed = preg_replace("/^64000$/", "64Kbps", $speed);
$speed = preg_replace("/^128000$/", "128Kbps", $speed);
$speed = preg_replace("/^256000$/", "256Kbps", $speed);
$speed = preg_replace("/^512000$/", "512Kbps", $speed);
$speed = preg_replace("/^768000$/", "768Kbps", $speed);
$speed = preg_replace("/^1024000$/", "1Mbps", $speed);
$speed = preg_replace("/^2048000$/", "2Mbps", $speed);
$speed = preg_replace("/^4192000$/", "4Mbps", $speed);
$speed = preg_replace("/^10000000$/", "10Mbps", $speed);
$speed = preg_replace("/^34000000$/", "34Mbps", $speed);
$speed = preg_replace("/^100000000$/", "100Mbps", $speed);
$speed = preg_replace("/^155000000$/", "155Mbps", $speed);
$speed = preg_replace("/^622000000$/", "622Mbps", $speed);
$speed = preg_replace("/^1000000000$/", "1Gbps", $speed);
$speed = preg_replace("/^10000000000$/", "10Gbps", $speed);
$speed = preg_replace("/^4294967295$/", "", $speed);
if($speed == "") { $speed = "-"; }
return $speed;
}
function netmask2cidr($netmask) {
list ($network, $cidr) = explode("/", trim(`ipcalc $address/$mask | grep Network | cut -d" " -f 4`));
return $cidr;
}
function cidr2netmask() {
return (long2ip(ip2long("255.255.255.255")
<< (32-$netmask)));
}
function formatUptime($diff) {
$daysDiff = floor($diff/86400);
$diff -= $daysDiff*86400;
$hrsDiff = floor($diff/60/60);
$diff -= $hrsDiff*60*60;
$minsDiff = floor($diff/60);
$diff -= $minsDiff*60;
$secsDiff = $diff;
if($daysDiff > '0'){ $uptime .= "$daysDiff days, "; }
if($hrsDiff > '0'){ $uptime .= $hrsDiff . "h "; }
if($minsDiff > '0'){ $uptime .= $minsDiff . "m "; }
if($secsDiff > '0'){ $uptime .= $secsDiff . "s "; }
return "$uptime";
}
function isSNMPable($hostname, $community, $snmpver) {
$pos = `snmpget -$snmpver -c $community -t 1 $hostname sysDescr.0`;
if($pos == '') {
$status='0';
$posb = `snmpget -$snmpver -c $community -t 1 $hostname 1.3.6.1.2.1.7526.2.4`;
if($posb == '') { } else { $status='1'; }
} else {
$status='1';
}
return $status;
}
function isPingable($hostname) {
global $fping;
$status = `$fping $hostname`;
if(strstr($status, "alive")) {
return TRUE;
} else {
return FALSE;
}
}
function is_odd($number) {
return $number & 1; // 0 = even, 1 = odd
}
function isValidInterface($if) {
$if = strtolower($if);
$bif = array("null", "virtual-", "unrouted", "eobc", "mpls", "aal5", "-atm layer", "dialer", "-shdsl", "-adsl", "async", "sit0", "sit1");
$nullintf = 0;
foreach($bif as $bi) {
$pos = strpos($if, $bi);
if ($pos !== FALSE) {
$nullintf = 1;
echo("$if matched $bi \n");
}
}
if (preg_match('/serial[0-9]:/', $if)) { $nullintf = '1'; }
if ($nullintf != '1') {
return 1;
} else { return 0; }
}
function ifclass($ifOperStatus, $ifAdminStatus) {
$ifclass = "interface-upup";
if ($ifAdminStatus == "down") { $ifclass = "interface-admindown"; }
if ($ifAdminStatus == "up" && $ifOperStatus== "down") { $ifclass = "interface-updown"; }
if ($ifAdminStatus == "up" && $ifOperStatus== "up") { $ifclass = "interface-upup"; }
return $ifclass;
}
function makeshortif($if) {
$if = strtolower($if);
$if = str_replace("tengigabitethernet","Te", $if);
$if = str_replace("gigabitethernet","Gi", $if);
$if = str_replace("fastethernet","Fa", $if);
$if = str_replace("ethernet","Et", $if);
$if = str_replace("serial","Se", $if);
$if = str_replace("pos","Pos", $if);
$if = str_replace("port-channel","Po", $if);
$if = str_replace("atm","Atm", $if);
$if = str_replace("null", "Null", $if);
$if = str_replace("loopback","Lo", $if);
$if = str_replace("dialer","Di", $if);
$if = str_replace("vlan","Vlan", $if);
$if = str_replace("tunnel","Tunnel", $if);
return $if;
}
function utime() {
$time = explode( " ", microtime());
$usec = (double)$time[0];
$sec = (double)$time[1];
return $sec + $usec;
}
function fixiftype ($type) {
$type = str_replace("ethernetCsmacd", "Ethernet", $type);
$type = str_replace("tunnel", "Tunnel", $type);
$type = str_replace("softwareLoopback", "Software Loopback", $type);
$type = str_replace("propVirtual", "Ethernet VLAN", $type);
$type = str_replace("ethernetCsmacd", "Ethernet", $type);
$type = str_replace("l2vlan", "Ethernet VLAN", $type);
return ($type);
}
function fixifName ($inf) {
if(strstr($inf, "oopback")) { $inf = "loopback"; }
$inf = str_replace("ether", "Ether", $inf);
$inf = str_replace("gig", "Gig", $inf);
$inf = str_replace("fast", "Fast", $inf);
$inf = str_replace("ten", "Ten", $inf);
$inf = str_replace("vlan", "Vlan", $inf);
$inf = str_replace("ether", "Ether", $inf);
$inf = str_replace("-802.1q Vlan subif", "", $inf);
$inf = str_replace("serial", "Serial", $inf);
$inf = str_replace("-aal5 layer", " aal5", $inf);
$inf = str_replace("null", "Null", $inf);
$inf = str_replace("atm", "ATM", $inf);
$inf = str_replace("port-channel", "Port-Channel", $inf);
$inf = str_replace("dial", "Dial", $inf);
$inf = str_replace("hp procurve switch software loopback interface", "Loopback Interface", $inf);
$inf = str_replace("control plane interface", "Control Plane", $inf);
$inf = str_replace("loop", "Loop", $inf);
$inf = preg_replace("/^([0-9]+)$/", "Interface \\0", $inf);
return $inf;
}
function fixIOSFeatures($features){
$features = str_replace("ADVSECURITYK9", "Advanced Security Crypto", $features);
$features = str_replace("K91P", "Provider Crypto", $features);
$features = str_replace("K4P", "Provider Crypto", $features);
$features = str_replace("ADVIPSERVICESK9_WAN", "Adv IP Services Crypto + WAN", $features);
$features = str_replace("ADVIPSERVICESK9", "Adv IP Services Crypto", $features);
$features = str_replace("ADVIPSERVICES", "Adv IP Services", $features);
$features = str_replace("IK9P", "IP Plus Crypto", $features);
$features = str_replace("SPSERVICESK9", "SP Services Crypto", $features);
$features = str_replace("PK9SV", "Provider Crypto", $features);
$features = str_replace("IS", "IP Plus", $features);
$features = str_replace("IPSERVICESK9", "IP Services Crypto", $features);
$features = str_replace("BROADBAND", "Broadband", $features);
$features = str_replace("IPBASE", "IP Base", $features);
$features = str_replace("IPSERVICE", "IP Services", $features);
$features = preg_replace("/^P$/", "Service Provider", $features);
$features = str_replace("IK9S", "IP Plus Crypto", $features);
$features = str_replace("I6Q4L2", "Layer 2", $features);
$features = str_replace("I6K2L2Q4", "Layer 2 Crypto", $features);
$features = str_replace("C3H2S", "Layer 2 SI/EI", $features);
return $features;
}
function fixIOSHardware($hardware){
$hardware = preg_replace("/C([0-9]+)/", "Cisco \\1", $hardware);
$hardware = str_replace("cat4000","Catalyst 4000", $hardware);
$hardware = str_replace("s3223_rp","Cisco Catalyst 6500 SUP32", $hardware);
$hardware = str_replace("s222_rp","Cisco Catalyst 6500 SUP2", $hardware);
$hardware = str_replace("c6sup2_rp","Cisco Catalyst 6500 SUP2", $hardware);
$hardware = str_replace("s72033_rp","Cisco Catalyst 6500 SUP720 ", $hardware);
$hardware = str_replace("RSP","Cisco 7500", $hardware);
$hardware = str_replace("C3200XL", "Cisco Catalyst 3200XL", $hardware);
$hardware = str_replace("C3550", "Cisco Catalyst 3550", $hardware);
$hardware = str_replace("C2950", "Cisco Catalyst 2950", $hardware);
return $hardware;
}
function getHostOS($host, $community, $snmpver) {
$sysDescr = trim(`snmpget -O qv -$snmpver -c $community $host sysDescr.0`);
if ($sysDescr == "") {$sysDescr = trim(`snmpget -O qv -$snmpver -c $community $host 1.3.6.1.2.1.7526.2.4`);}
echo("\nsnmpget -O qv -$snmpver -c $community $host sysDescr.0\n$sysDescr\n");
if (strstr($sysDescr, "IOS") !== false) { $os = "IOS"; }
if (strstr($sysDescr, "FreeBSD") !== false) { $os = "FreeBSD"; }
if (strstr($sysDescr, "DragonFly")) { $os = "DragonFly"; }
if (strstr($sysDescr, "NetBSD") !== false) { $os = "NetBSD"; }
if (strstr($sysDescr, "OpenBSD") !== false) { $os = "OpenBSD"; }
if (strstr($sysDescr, "Linux") !== false) { $os = "Linux"; }
if (strstr($sysDescr, "Windows")) { $os = "Windows"; }
if (strstr($sysDescr, "ProCurve")) { $os = "ProCurve"; }
if (strstr($sysDescr, "m0n0wall")) { $os = "m0n0wall"; }
if (strstr($sysDescr, "Voswall")) { $os = "Voswall"; }
if (strstr($sysDescr, "snom")) { $os = "Snom"; }
return $os;
}
function createHost ($host, $community, $snmpver){
$host = trim(strtolower($host));
$host_os = getHostOS($host, $community, $snmpver);
global $valid_os;
$nullhost = 1;
echo("$host -> $host_os<br />");
foreach($valid_os as $os) {
if ($os == $host_os) {
$nullhost = '0';
}
}
if($nullhost == '0') {
$sql = mysql_query("INSERT INTO `devices` (`hostname`, `community`, `os`, `status`) VALUES ('$host', '$community', '$host_os', '1')");
echo("Created host : $host\n");
} else {
echo("Not added bad host : $host\n");
}
}
function isDomainResolves($domain){
return gethostbyname($domain) != $domain;
}
function hoststatus($id) {
$sql = mysql_query("SELECT `status` FROM `devices` WHERE `device_id` = '$id'");
$result = @mysql_result($sql, 0);
return $result;
}
function gethostbyid($id) {
$sql = mysql_query("SELECT `hostname` FROM `devices` WHERE `device_id` = '$id'");
$result = @mysql_result($sql, 0);
return $result;
}
function getifhost($id) {
$sql = mysql_query("SELECT `device_id` from `interfaces` WHERE `interface_id` = '$id'");
$result = @mysql_result($sql, 0);
return $result;
}
function getifindexbyid($id) {
$sql = mysql_query("SELECT `ifIndex` FROM `interfaces` WHERE `interface_id` = '$id'");
$result = @mysql_result($sql, 0);
return $result;
}
function getifbyid($id) {
$sql = mysql_query("SELECT `ifDescr` FROM `interfaces` WHERE `interface_id` = '$id'");
$result = @mysql_result($sql, 0);
return $result;
}
function getidbyname($domain){
$sql = mysql_query("SELECT `device_id` FROM `devices` WHERE `hostname` = '$domain'");
$result = @mysql_result($sql, 0);
return $result;
}
function gethostosbyid($id) {
$sql = mysql_query("SELECT `os` FROM `devices` WHERE `device_id` = '$id'");
$result = @mysql_result($sql, 0);
return $result;
}
function match_network ($nets, $ip, $first=false) {
$return = false;
if (!is_array ($nets)) $nets = array ($nets);
foreach ($nets as $net) {
$rev = (preg_match ("/^\!/", $net)) ? true : false;
$net = preg_replace ("/^\!/", "", $net);
$ip_arr = explode('/', $net);
$net_long = ip2long($ip_arr[0]);
$x = ip2long($ip_arr[1]);
$mask = long2ip($x) == $ip_arr[1] ? $x : 0xffffffff << (32 - $ip_arr[1]);
$ip_long = ip2long($ip);
if ($rev) {
if (($ip_long & $mask) == ($net_long & $mask)) return false;
} else {
if (($ip_long & $mask) == ($net_long & $mask)) $return = true;
if ($first && $return) return true;
}
}
return $return;
}
?>