* @author Adam Armstrong <*****@*****.**> * @copyright (C) 2006-2014 Adam Armstrong * */ unset($poll_device, $cache['devices']['uptime'][$device['device_id']]); $snmpdata = snmp_get_multi($device, "sysUpTime.0 sysLocation.0 sysContact.0 sysName.0", "-OQUs", "SNMPv2-MIB", mib_dirs()); $polled = time(); $poll_device = $snmpdata[0]; $poll_device['sysDescr'] = snmp_get($device, "sysDescr.0", "-Oqv", "SNMPv2-MIB", mib_dirs()); $poll_device['sysObjectID'] = snmp_get($device, "sysObjectID.0", "-Oqvn", "SNMPv2-MIB", mib_dirs()); if (strpos($poll_device['sysObjectID'], 'Wrong Type') !== FALSE) { // Wrong Type (should be OBJECT IDENTIFIER): "1.3.6.1.4.1.25651.1.2" list(, $poll_device['sysObjectID']) = explode(':', $poll_device['sysObjectID']); $poll_device['sysObjectID'] = '.' . trim($poll_device['sysObjectID'], ' ."'); } $poll_device['snmpEngineID'] = snmp_cache_snmpEngineID($device); $poll_device['sysName'] = strtolower($poll_device['sysName']); if (isset($agent_data['uptime'])) { list($agent_data['uptime']) = explode(' ', $agent_data['uptime']); } if (is_numeric($agent_data['uptime'])) { $uptime = round($agent_data['uptime']); $uptime_msg = "Using UNIX Agent Uptime"; } else { $hrSystemUptime = snmp_get($device, "hrSystemUptime.0", "-Oqv", "HOST-RESOURCES-MIB", mib_dirs()); if (!empty($hrSystemUptime) && strpos($hrSystemUptime, "No") === FALSE && $device['os'] != "windows") { $agent_uptime = $uptime; // Move uptime into agent_uptime $polled = time(); // Some Unixes return hrSystemUptime as an integer count of ten millisecond ticks instead of the // as a Timetick type
function createHost($hostname, $snmp_community = NULL, $snmp_version, $snmp_port = 161, $snmp_transport = 'udp', $snmp_v3 = array()) { $hostname = trim(strtolower($hostname)); $device = array('hostname' => $hostname, 'sysName' => $hostname, 'status' => '1', 'snmp_community' => $snmp_community, 'snmp_port' => $snmp_port, 'snmp_transport' => $snmp_transport, 'snmp_version' => $snmp_version); // Add snmp v3 auth params foreach (array('authlevel', 'authname', 'authpass', 'authalgo', 'cryptopass', 'cryptoalgo') as $v3_key) { if (isset($snmp_v3['snmp_' . $v3_key])) { // Or $snmp_v3['snmp_authlevel'] $device['snmp_' . $v3_key] = $snmp_v3['snmp_' . $v3_key]; } else { if (isset($snmp_v3[$v3_key])) { // Or $snmp_v3['authlevel'] $device['snmp_' . $v3_key] = $snmp_v3[$v3_key]; } } } // This is compatibility code after refactor in r6306, for keep devices up before DB updated if (get_db_version() < 189) { // FIXME. Remove this in r7000 $device['snmpver'] = $device['snmp_version']; unset($device['snmp_version']); foreach (array('transport', 'port', 'timeout', 'retries', 'community', 'authlevel', 'authname', 'authpass', 'authalgo', 'cryptopass', 'cryptoalgo') as $old_key) { if (isset($device['snmp_' . $old_key])) { // Convert to old device snmp keys $device[$old_key] = $device['snmp_' . $old_key]; unset($device['snmp_' . $old_key]); } } } $device['os'] = get_device_os($device); $device['snmpEngineID'] = snmp_cache_snmpEngineID($device); $device['sysName'] = snmp_get($device, "sysName.0", "-Oqv", "SNMPv2-MIB", mib_dirs()); $device['location'] = snmp_get($device, "sysLocation.0", "-Oqv", "SNMPv2-MIB", mib_dirs()); $device['sysContact'] = snmp_get($device, "sysContact.0", "-Oqv", "SNMPv2-MIB", mib_dirs()); if ($device['os']) { $device_id = dbInsert($device, 'devices'); if ($device_id) { log_event("设备添加: {$hostname}", $device_id, 'device', $device_id, 5); // severity 5, for logging user/console info if (is_cli()) { print_success("正在使用自动发现功能 " . $device['hostname'] . " (id = " . $device_id . ")"); $device['device_id'] = $device_id; // Discover things we need when linking this to other hosts. discover_device($device, $options = array('m' => 'ports')); discover_device($device, $options = array('m' => 'ipv4-addresses')); discover_device($device, $options = array('m' => 'ipv6-addresses')); log_event("snmpEngineID -> " . $device['snmpEngineID'], $device, 'device', $device['device_id']); // Reset `last_discovered` for full rediscover device by cron dbUpdate(array('last_discovered' => 'NULL'), 'devices', '`device_id` = ?', array($device_id)); array_push($GLOBALS['devices'], $device_id); } return $device_id; } else { return FALSE; } } else { return FALSE; } }
function check_device_duplicated($device) { $snmpEngineID = snmp_cache_snmpEngineID($device); $sysName = snmp_get($device, "sysName.0", "-Oqv", "SNMPv2-MIB"); if (empty($sysName) || strpos($sysName, '.') === FALSE) { $sysName = FALSE; } if (!empty($snmpEngineID)) { $test_devices = dbFetchRows('SELECT * FROM `devices` WHERE `disabled` = 0 AND `snmpEngineID` = ?', array($snmpEngineID)); foreach ($test_devices as $test) { if ($test['sysName'] === $sysName) { // Retun TRUE if have same snmpEngineID && sysName in DB print_error("Already got device with SNMP-read sysName ({$sysName}) and 'snmpEngineID' = {$snmpEngineID} (" . $test['hostname'] . ")."); return TRUE; } } } else { // If snmpEngineID empty, check only by sysName if ($sysName !== FALSE && dbFetchCell('SELECT COUNT(*) FROM `devices` WHERE `disabled` = 0 AND `sysName` = ?', array($sysName)) > 0) { // Retun TRUE if have same sysName in DB print_error("已有设备使用 SNMP-read sysName ({$sysName})."); return TRUE; } } // In all other cases return FALSE return FALSE; }
function createHost($host, $community = NULL, $snmpver, $port = 161, $transport = 'udp', $v3 = array()) { $host = trim(strtolower($host)); $device = array('hostname' => $host, 'sysName' => $host, 'community' => $community, 'port' => $port, 'transport' => $transport, 'status' => '1', 'snmpver' => $snmpver); $device = array_merge($device, $v3); $device['os'] = get_device_os($device); $device['snmpEngineID'] = snmp_cache_snmpEngineID($device); $device['sysName'] = snmp_get($device, "sysName.0", "-Oqv", "SNMPv2-MIB", mib_dirs()); $device['location'] = snmp_get($device, "sysLocation.0", "-Oqv", "SNMPv2-MIB", mib_dirs()); $device['sysContact'] = snmp_get($device, "sysContact.0", "-Oqv", "SNMPv2-MIB", mib_dirs()); if ($device['os']) { $device_id = dbInsert($device, 'devices'); if ($device_id) { log_event("Device added: {$host}", $device_id, 'device'); if (is_cli()) { print_success("Now discovering " . $device['hostname'] . " (id = " . $device_id . ")"); $device['device_id'] = $device_id; // Discover things we need when linking this to other hosts. discover_device($device, $options = array('m' => 'ports')); discover_device($device, $options = array('m' => 'ipv4-addresses')); discover_device($device, $options = array('m' => 'ipv6-addresses')); log_event("snmpEngineID -> " . $device['snmpEngineID'], $device, 'system'); // Reset `last_discovered` for full rediscover device by cron dbUpdate(array('last_discovered' => 'NULL'), 'devices', '`device_id` = ?', array($device_id)); array_push($GLOBALS['devices'], $device_id); } return $device_id; } else { return FALSE; } } else { return FALSE; } }
function createHost($hostname, $snmp_community = NULL, $snmp_version, $snmp_port = 161, $snmp_transport = 'udp', $snmp_v3 = array()) { $hostname = trim(strtolower($hostname)); $device = array('hostname' => $hostname, 'sysName' => $hostname, 'status' => '1', 'snmp_community' => $snmp_community, 'snmp_port' => $snmp_port, 'snmp_transport' => $snmp_transport, 'snmp_version' => $snmp_version); // Add snmp v3 auth params foreach (array('authlevel', 'authname', 'authpass', 'authalgo', 'cryptopass', 'cryptoalgo') as $v3_key) { if (isset($snmp_v3['snmp_' . $v3_key])) { // Or $snmp_v3['snmp_authlevel'] $device['snmp_' . $v3_key] = $snmp_v3['snmp_' . $v3_key]; } else { if (isset($snmp_v3[$v3_key])) { // Or $snmp_v3['authlevel'] $device['snmp_' . $v3_key] = $snmp_v3[$v3_key]; } } } $device['os'] = get_device_os($device); $device['snmpEngineID'] = snmp_cache_snmpEngineID($device); $device['sysName'] = snmp_get($device, 'sysName.0', '-Oqv', 'SNMPv2-MIB'); $device['location'] = snmp_get($device, 'sysLocation.0', '-Oqv', 'SNMPv2-MIB'); $device['sysContact'] = snmp_get($device, 'sysContact.0', '-Oqv', 'SNMPv2-MIB'); if ($device['os']) { $device_id = dbInsert($device, 'devices'); if ($device_id) { log_event("Device added: {$hostname}", $device_id, 'device', $device_id, 5); // severity 5, for logging user/console info if (is_cli()) { print_success("Now discovering " . $device['hostname'] . " (id = " . $device_id . ")"); $device['device_id'] = $device_id; // Discover things we need when linking this to other hosts. discover_device($device, $options = array('m' => 'ports')); discover_device($device, $options = array('m' => 'ipv4-addresses')); discover_device($device, $options = array('m' => 'ipv6-addresses')); log_event("snmpEngineID -> " . $device['snmpEngineID'], $device, 'device', $device['device_id']); // Reset `last_discovered` for full rediscover device by cron dbUpdate(array('last_discovered' => 'NULL'), 'devices', '`device_id` = ?', array($device_id)); array_push($GLOBALS['devices'], $device_id); } return $device_id; } else { return FALSE; } } else { return FALSE; } }