mirror of
				https://github.com/librenms/librenms.git
				synced 2024-10-07 16:52:45 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			573 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			573 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| // Common Functions
 | |
| 
 | |
| function format_number_short($number, $sf)
 | |
| {
 | |
|   // This formats a number so that we only send back three digits plus an optional decimal point.
 | |
|   // Example: 723.42 -> 723    72.34 -> 72.3    2.23 -> 2.23
 | |
| 
 | |
|   list($whole, $decimal) = explode (".", $number);
 | |
| 
 | |
|   if (strlen($whole) >= $sf || !is_numeric($decimal))
 | |
|   {
 | |
|     $number = $whole;
 | |
|   } elseif(strlen($whole) < $sf) {
 | |
|     $diff = $sf - strlen($whole);
 | |
|     $number = $whole .".".substr($decimal, 0, $diff);
 | |
|   }
 | |
|   return $number;
 | |
| }
 | |
| 
 | |
| function external_exec($command)
 | |
| {
 | |
|   global $debug;
 | |
| 
 | |
|   if ($debug) { echo($command."\n"); }
 | |
|   $output = shell_exec($command);
 | |
|   if ($debug) { echo($output."\n"); }
 | |
| 
 | |
|   return $output;
 | |
| }
 | |
| 
 | |
| function shorthost($hostname, $len=12)
 | |
| {
 | |
|   // IP addresses should not be shortened
 | |
|   if (filter_var($hostname, FILTER_VALIDATE_IP))
 | |
|     return $hostname;
 | |
|   
 | |
|   $parts = explode(".", $hostname);
 | |
|   $shorthost = $parts[0];
 | |
|   $i = 1;
 | |
|   while ($i < count($parts) && strlen($shorthost.'.'.$parts[$i]) < $len)
 | |
|   {
 | |
|     $shorthost = $shorthost.'.'.$parts[$i];
 | |
|     $i++;
 | |
|   }
 | |
|   return ($shorthost);
 | |
| }
 | |
| 
 | |
| function isCli()
 | |
| {
 | |
|   if (php_sapi_name() == 'cli' && empty($_SERVER['REMOTE_ADDR']))
 | |
|   {
 | |
|     return true;
 | |
|   } else {
 | |
|     return false;
 | |
|   }
 | |
| }
 | |
| 
 | |
| function print_error($text)
 | |
| {
 | |
|   global $console_color;
 | |
|   if (isCli())
 | |
|   {
 | |
|     print $console_color->convert("%r".$text."%n\n", false);
 | |
|   } else {
 | |
|     echo('<div class="alert alert-danger"><img src="/images/16/exclamation.png" align="absmiddle"> '.$text.'</div>');
 | |
|   }
 | |
| }
 | |
| 
 | |
| function print_message($text)
 | |
| {
 | |
|   if (isCli())
 | |
|   {
 | |
|     print Console_Color2::convert("%g".$text."%n\n", false);
 | |
|   } else {
 | |
|     echo('<div class="alert alert-success"><img src="/images/16/tick.png" align="absmiddle"> '.$text.'</div>');
 | |
|   }
 | |
| }
 | |
| 
 | |
| function delete_port($int_id)
 | |
| {
 | |
|   global $config;
 | |
| 
 | |
|   $interface = dbFetchRow("SELECT * FROM `ports` AS P, `devices` AS D WHERE P.port_id = ? AND D.device_id = P.device_id", array($int_id));
 | |
| 
 | |
|   $interface_tables = array('adjacencies', 'ipaddr', 'ip6adjacencies', 'ip6addr', 'mac_accounting', 'bill_ports', 'pseudowires', 'ports');
 | |
| 
 | |
|   foreach ($interface_tables as $table)
 | |
|   {
 | |
|     dbDelete($table, "`port_id` =  ?", array($int_id));
 | |
|   }
 | |
| 
 | |
|   dbDelete('links', "`local_port_id` =  ?", array($int_id));
 | |
|   dbDelete('links', "`remote_port_id` =  ?", array($int_id));
 | |
|   dbDelete('bill_ports', "`port_id` =  ?", array($int_id));
 | |
| 
 | |
|   unlink(trim($config['rrd_dir'])."/".trim($interface['hostname'])."/port-".$interface['ifIndex'].".rrd");
 | |
| }
 | |
| 
 | |
| function sgn($int)
 | |
| {
 | |
|   if ($int < 0)
 | |
|   {
 | |
|     return -1;
 | |
|   } elseif ($int == 0) {
 | |
|     return 0;
 | |
|   } else {
 | |
|     return 1;
 | |
|   }
 | |
| }
 | |
| 
 | |
| function get_sensor_rrd($device, $sensor)
 | |
| {
 | |
|   global $config;
 | |
| 
 | |
|   # For IPMI, sensors tend to change order, and there is no index, so we prefer to use the description as key here.
 | |
|   if ($config['os'][$device['os']]['sensor_descr'] || $sensor['poller_type'] == "ipmi")
 | |
|   {
 | |
|     $rrd_file = $config['rrd_dir']."/".$device['hostname']."/".safename("sensor-".$sensor['sensor_class']."-".$sensor['sensor_type']."-".$sensor['sensor_descr'] . ".rrd");
 | |
|   } else {
 | |
|     $rrd_file = $config['rrd_dir']."/".$device['hostname']."/".safename("sensor-".$sensor['sensor_class']."-".$sensor['sensor_type']."-".$sensor['sensor_index'] . ".rrd");
 | |
|   }
 | |
| 
 | |
|   return($rrd_file);
 | |
| }
 | |
| 
 | |
| function get_port_by_index_cache($device_id, $ifIndex)
 | |
| {
 | |
|   global $port_index_cache;
 | |
| 
 | |
|   if (isset($port_index_cache[$device_id][$ifIndex]) && is_array($port_index_cache[$device_id][$ifIndex]))
 | |
|   {
 | |
|     $port = $port_index_cache[$device_id][$ifIndex];
 | |
|   } else {
 | |
|     $port = get_port_by_ifIndex($device_id, $ifIndex);
 | |
|     $port_index_cache[$device_id][$ifIndex] = $port;
 | |
|   }
 | |
| 
 | |
|   return $port;
 | |
| }
 | |
| 
 | |
| function get_port_by_ifIndex($device_id, $ifIndex)
 | |
| {
 | |
|   return dbFetchRow("SELECT * FROM `ports` WHERE `device_id` = ? AND `ifIndex` = ?", array($device_id, $ifIndex));
 | |
| }
 | |
| 
 | |
| function get_all_devices($device, $type = "")
 | |
| {
 | |
|   global $cache;
 | |
|   $devices = array();
 | |
| 
 | |
|   // FIXME needs access control checks!
 | |
|   // FIXME respect $type (server, network, etc) -- needs an array fill in topnav.
 | |
| 
 | |
|   if (isset($cache['devices']['hostname']))
 | |
|   {
 | |
|     $devices = array_keys($cache['devices']['hostname']);
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     foreach (dbFetchRows("SELECT `hostname` FROM `devices`") as $data)
 | |
|     {
 | |
|       $devices[] = $data['hostname'];
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return $devices;
 | |
| }
 | |
| 
 | |
| function port_by_id_cache($port_id)
 | |
| {
 | |
|   return get_port_by_id_cache('port', $port_id);
 | |
| }
 | |
| 
 | |
| function table_from_entity_type($type)
 | |
| {
 | |
|   // Fuck you, english pluralisation.
 | |
|   if ($type == "storage")
 | |
|   {
 | |
|     return $type;
 | |
|   } else {
 | |
|     return $type."s";
 | |
|   }
 | |
| }
 | |
| 
 | |
| function get_entity_by_id_cache($type, $id)
 | |
| {
 | |
|   global $entity_cache;
 | |
| 
 | |
|   $table = table_from_entity_type($type);
 | |
| 
 | |
|   if (is_array($entity_cache[$type][$id]))
 | |
|   {
 | |
|     $entity = $entity_cache[$type][$id];
 | |
|   } else {
 | |
|     $entity = dbFetchRow("SELECT * FROM `".$table."` WHERE `".$type."_id` = ?", array($id));
 | |
|     $entity_cache[$type][$id] = $entity;
 | |
|   }
 | |
|   return $entity;
 | |
| }
 | |
| 
 | |
| function get_port_by_id($port_id)
 | |
| {
 | |
|   if (is_numeric($port_id))
 | |
|   {
 | |
|     $port = dbFetchRow("SELECT * FROM `ports` WHERE `port_id` = ?", array($port_id));
 | |
|     if (is_array($port))
 | |
|     {
 | |
|       return $port;
 | |
|     } else {
 | |
|       return FALSE;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function get_application_by_id($application_id)
 | |
| {
 | |
|   if (is_numeric($application_id))
 | |
|   {
 | |
|     $application = dbFetchRow("SELECT * FROM `applications` WHERE `app_id` = ?", array($application_id));
 | |
|     if (is_array($application))
 | |
|     {
 | |
|       return $application;
 | |
|     } else {
 | |
|       return FALSE;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function get_sensor_by_id($sensor_id)
 | |
| {
 | |
|   if (is_numeric($sensor_id))
 | |
|   {
 | |
|     $sensor = dbFetchRow("SELECT * FROM `sensors` WHERE `sensor_id` = ?", array($sensor_id));
 | |
|     if (is_array($sensor))
 | |
|     {
 | |
|       return $sensor;
 | |
|     } else {
 | |
|       return FALSE;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function get_device_id_by_port_id($port_id)
 | |
| {
 | |
|   if (is_numeric($port_id))
 | |
|   {
 | |
|     $device_id = dbFetchCell("SELECT `device_id` FROM `ports` WHERE `port_id` = ?", array($port_id));
 | |
|     if (is_numeric($device_id))
 | |
|     {
 | |
|       return $device_id;
 | |
|     } else {
 | |
|       return FALSE;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function get_device_id_by_app_id($app_id)
 | |
| {
 | |
|   if (is_numeric($app_id))
 | |
|   {
 | |
|     $device_id = dbFetchCell("SELECT `device_id` FROM `applications` WHERE `app_id` = ?", array($app_id));
 | |
|     if (is_numeric($device_id))
 | |
|     {
 | |
|       return $device_id;
 | |
|     } else {
 | |
|       return FALSE;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| 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 device_by_name($name, $refresh = 0)
 | |
| {
 | |
|   // FIXME - cache name > id too.
 | |
|   return device_by_id_cache(getidbyname($name), $refresh);
 | |
| }
 | |
| 
 | |
| 
 | |
| function accesspoint_by_id($ap_id, $refresh = '0') {
 | |
| 
 | |
|   $ap = dbFetchRow("SELECT * FROM `access_points` WHERE `accesspoint_id` = ?", array($ap_id));
 | |
| 
 | |
|   return $ap;
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| function device_by_id_cache($device_id, $refresh = '0')
 | |
| {
 | |
|   global $cache;
 | |
| 
 | |
|   if (!$refresh && isset($cache['devices']['id'][$device_id]) && is_array($cache['devices']['id'][$device_id]))
 | |
|   {
 | |
|     $device = $cache['devices']['id'][$device_id];
 | |
|   } else {
 | |
|     $device = dbFetchRow("SELECT * FROM `devices` WHERE `device_id` = ?", array($device_id));
 | |
|     if (get_dev_attrib($device,'override_sysLocation_bool'))
 | |
|     {
 | |
|       $device['real_location'] = $device['location'];
 | |
|       $device['location'] = get_dev_attrib($device,'override_sysLocation_string');
 | |
|     }
 | |
|     $cache['devices']['id'][$device_id] = $device;
 | |
|   }
 | |
|   return $device;
 | |
| }
 | |
| 
 | |
| 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 mres($string)
 | |
| { // short function wrapper because the real one is stupidly long and ugly. aesthetics.
 | |
|   return mysql_real_escape_string($string);
 | |
| }
 | |
| 
 | |
| function getifhost($id)
 | |
| {
 | |
|   return dbFetchCell("SELECT `device_id` from `ports` WHERE `port_id` = ?", array($id));
 | |
| }
 | |
| 
 | |
| function gethostbyid($id)
 | |
| {
 | |
|   global $cache;
 | |
| 
 | |
|   if (isset($cache['devices']['id'][$id]['hostname']))
 | |
|   {
 | |
|     $hostname = $cache['devices']['id'][$id]['hostname'];
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     $hostname = dbFetchCell("SELECT `hostname` FROM `devices` WHERE `device_id` = ?", array($id));
 | |
|   }
 | |
| 
 | |
|   return $hostname;
 | |
| }
 | |
| 
 | |
| function strgen ($length = 16)
 | |
| {
 | |
|   $entropy = array(0,1,2,3,4,5,6,7,8,9,'a','A','b','B','c','C','d','D','e',
 | |
|   'E','f','F','g','G','h','H','i','I','j','J','k','K','l','L','m','M','n',
 | |
|   'N','o','O','p','P','q','Q','r','R','s','S','t','T','u','U','v','V','w',
 | |
|   'W','x','X','y','Y','z','Z');
 | |
|   $string = "";
 | |
| 
 | |
|   for ($i=0; $i<$length; $i++)
 | |
|   {
 | |
|     $key = mt_rand(0,61);
 | |
|     $string .= $entropy[$key];
 | |
|   }
 | |
| 
 | |
|   return $string;
 | |
| }
 | |
| 
 | |
| function getpeerhost($id)
 | |
| {
 | |
|   return dbFetchCell("SELECT `device_id` from `bgpPeers` WHERE `bgpPeer_id` = ?", array($id));
 | |
| }
 | |
| 
 | |
| function getifindexbyid($id)
 | |
| {
 | |
|   return dbFetchCell("SELECT `ifIndex` FROM `ports` WHERE `port_id` = ?", array($id));
 | |
| }
 | |
| 
 | |
| function getifbyid($id)
 | |
| {
 | |
|   return dbFetchRow("SELECT * FROM `ports` WHERE `port_id` = ?", array($id));
 | |
| }
 | |
| 
 | |
| function getifdescrbyid($id)
 | |
| {
 | |
|   return dbFetchCell("SELECT `ifDescr` FROM `ports` WHERE `port_id` = ?", array($id));
 | |
| }
 | |
| 
 | |
| function getidbyname($hostname)
 | |
| {
 | |
|   global $cache;
 | |
| 
 | |
|   if (isset($cache['devices']['hostname'][$hostname]))
 | |
|   {
 | |
|     $id = $cache['devices']['hostname'][$hostname];
 | |
|   } else
 | |
|   {
 | |
|     $id = dbFetchCell("SELECT `device_id` FROM `devices` WHERE `hostname` = ?", array($hostname));
 | |
|   }
 | |
| 
 | |
|   return $id;
 | |
| }
 | |
| 
 | |
| function gethostosbyid($id)
 | |
| {
 | |
|   global $cache;
 | |
| 
 | |
|   if (isset($cache['devices']['id'][$id]['os']))
 | |
|   {
 | |
|     $os = $cache['devices']['id'][$id]['os'];
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     $os = dbFetchCell("SELECT `os` FROM `devices` WHERE `device_id` = ?", array($id));
 | |
|   }
 | |
| 
 | |
|   return $os;
 | |
| }
 | |
| 
 | |
| function safename($name)
 | |
| {
 | |
|   return preg_replace('/[^a-zA-Z0-9,._\-]/', '_', $name);
 | |
| }
 | |
| 
 | |
| function zeropad($num, $length = 2)
 | |
| {
 | |
|   while (strlen($num) < $length)
 | |
|   {
 | |
|     $num = '0'.$num;
 | |
|   }
 | |
| 
 | |
|   return $num;
 | |
| }
 | |
| 
 | |
| function set_dev_attrib($device, $attrib_type, $attrib_value)
 | |
| {
 | |
|   if (dbFetchCell("SELECT COUNT(*) FROM devices_attribs WHERE `device_id` = ? AND `attrib_type` = ?", array($device['device_id'],$attrib_type)))
 | |
|   {
 | |
|     $return = dbUpdate(array('attrib_value' => $attrib_value), 'devices_attribs', 'device_id=? and attrib_type=?', array($device['device_id'], $attrib_type));
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     $return = dbInsert(array('device_id' => $device['device_id'], 'attrib_type' => $attrib_type, 'attrib_value' => $attrib_value), 'devices_attribs');
 | |
|   }
 | |
|   return $return;
 | |
| }
 | |
| 
 | |
| function get_dev_attribs($device)
 | |
| {
 | |
|   $attribs = array();
 | |
|   foreach (dbFetchRows("SELECT * FROM devices_attribs WHERE `device_id` = ?", array($device)) as $entry)
 | |
|   {
 | |
|     $attribs[$entry['attrib_type']] = $entry['attrib_value'];
 | |
|   }
 | |
|   return $attribs;
 | |
| }
 | |
| 
 | |
| function get_dev_entity_state($device)
 | |
| {
 | |
|   $state = array();
 | |
|   foreach (dbFetchRows("SELECT * FROM entPhysical_state WHERE `device_id` = ?", array($device)) as $entity)
 | |
|   {
 | |
|     $state['group'][$entity['group']][$entity['entPhysicalIndex']][$entity['subindex']][$entity['key']] = $entity['value'];
 | |
|     $state['index'][$entity['entPhysicalIndex']][$entity['subindex']][$entity['group']][$entity['key']] = $entity['value'];
 | |
|   }
 | |
|   return $state;
 | |
| }
 | |
| 
 | |
| function get_dev_attrib($device, $attrib_type)
 | |
| {
 | |
|   if ($row = dbFetchRow("SELECT attrib_value FROM devices_attribs WHERE `device_id` = ? AND `attrib_type` = ?", array($device['device_id'], $attrib_type)))
 | |
|   {
 | |
|     return $row['attrib_value'];
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     return NULL;
 | |
|   }
 | |
| }
 | |
| 
 | |
| function del_dev_attrib($device, $attrib_type)
 | |
| {
 | |
|   return dbDelete('devices_attribs', "`device_id` = ? AND `attrib_type` = ?", array($device['device_id'], $attrib_type));
 | |
| }
 | |
| 
 | |
| function formatRates($value, $round = '2', $sf = '3')
 | |
| {
 | |
|    $value = format_si($value, $round, $sf) . "bps";
 | |
|    return $value;
 | |
| }
 | |
| 
 | |
| function formatStorage($value, $round = '2', $sf = '3')
 | |
| {
 | |
|    $value = format_bi($value, $round) . "B";
 | |
|    return $value;
 | |
| }
 | |
| 
 | |
| function format_si($value, $round = '2', $sf = '3')
 | |
| {
 | |
|   $neg = 0;
 | |
|   if ($value < "0")
 | |
|   {
 | |
|     $neg = 1;
 | |
|     $value = $value * -1;
 | |
|   }
 | |
| 
 | |
|   if ($value >= "0.1")
 | |
|   {
 | |
|     $sizes = Array('', 'k', 'M', 'G', 'T', 'P', 'E');
 | |
|     $ext = $sizes[0];
 | |
|     for ($i = 1; (($i < count($sizes)) && ($value >= 1000)); $i++) { $value = $value / 1000; $ext  = $sizes[$i]; }
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     $sizes = Array('', 'm', 'u', 'n');
 | |
|     $ext = $sizes[0];
 | |
|     for ($i = 1; (($i < count($sizes)) && ($value != 0) && ($value <= 0.1)); $i++) { $value = $value * 1000; $ext  = $sizes[$i]; }
 | |
|   }
 | |
| 
 | |
|   if ($neg == 1) { $value = $value * -1; }
 | |
| 
 | |
|   return format_number_short(round($value, $round),$sf).$ext;
 | |
| }
 | |
| 
 | |
| function format_bi($value, $round = '2', $sf = '3')
 | |
| {
 | |
|   if ($value < "0")
 | |
|   {
 | |
|     $neg = 1;
 | |
|     $value = $value * -1;
 | |
|   }
 | |
|   $sizes = Array('', 'k', 'M', 'G', 'T', 'P', 'E');
 | |
|   $ext = $sizes[0];
 | |
|   for ($i = 1; (($i < count($sizes)) && ($value >= 1024)); $i++) { $value = $value / 1024; $ext  = $sizes[$i]; }
 | |
| 
 | |
|   if ($neg) { $value = $value * -1; }
 | |
| 
 | |
|   return format_number_short(round($value, $round), $sf).$ext;
 | |
| }
 | |
| 
 | |
| function format_number($value, $base = '1000', $round=2, $sf=3)
 | |
| {
 | |
|   if ($base == '1000')
 | |
|   {
 | |
|     return format_si($value, $round, $sf);
 | |
|   } else {
 | |
|     return format_bi($value, $round, $sf);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function is_valid_hostname($hostname)
 | |
| {
 | |
|   // The Internet standards (Request for Comments) for protocols mandate that
 | |
|   // component hostname labels may contain only the ASCII letters 'a' through 'z'
 | |
|   // (in a case-insensitive manner), the digits '0' through '9', and the hyphen
 | |
|   // ('-'). The original specification of hostnames in RFC 952, mandated that
 | |
|   // labels could not start with a digit or with a hyphen, and must not end with
 | |
|   // a hyphen. However, a subsequent specification (RFC 1123) permitted hostname
 | |
|   // labels to start with digits. No other symbols, punctuation characters, or
 | |
|   // white space are permitted. While a hostname may not contain other characters,
 | |
|   // such as the underscore character (_), other DNS names may contain the underscore
 | |
| 
 | |
|   return ctype_alnum(str_replace('_','',str_replace('-','',str_replace('.','',$hostname))));
 | |
| }
 | |
| 
 | |
| function add_service($device, $service, $descr)
 | |
| {
 | |
|   $insert = array('device_id' => $device['device_id'], 'service_ip' => $device['hostname'], 'service_type' => $service,
 | |
|                   'service_changed' => array('UNIX_TIMESTAMP(NOW())'), 'service_desc' => $descr, 'service_param' => "", 'service_ignore' => "0");
 | |
| 
 | |
|   echo dbInsert($insert, 'services');
 | |
| }
 | |
| 
 | |
| ?>
 |