function query_snmp_host($host_id, $snmp_query_id) { global $config; include_once $config["library_path"] . "/snmp.php"; $host = db_fetch_row("SELECT\n\t\thostname,\n\t\tsnmp_community,\n\t\tsnmp_version,\n\t\tsnmp_username,\n\t\tsnmp_password,\n\t\tsnmp_auth_protocol,\n\t\tsnmp_priv_passphrase,\n\t\tsnmp_priv_protocol,\n\t\tsnmp_context,\n\t\tsnmp_port,\n\t\tsnmp_timeout,\n\t\tping_retries,\n\t\tmax_oids\n\t\tFROM host\n\t\tWHERE id='{$host_id}'"); $snmp_queries = get_data_query_array($snmp_query_id); if ($host["hostname"] == "") { debug_log_insert("data_query", "Invalid host_id: {$host_id}"); return false; } /* invalid xml check */ if (!is_array($snmp_queries) || sizeof($snmp_queries) == 0) { debug_log_insert("data_query", "Error parsing XML file into an array."); return false; } debug_log_insert("data_query", "XML file parsed ok."); if (!verify_index_order($snmp_queries)) { debug_log_insert("data_query", "Invalid field <index_order>" . $snmp_queries["index_order"] . "</index_order>"); debug_log_insert("data_query", "Must contain <direction>input</direction> fields only"); return false; } /* provide data for oid_num_indexes, if given */ if (isset($snmp_queries["oid_num_indexes"])) { $snmp_num_indexes = cacti_snmp_get($host["hostname"], $host["snmp_community"], $snmp_queries["oid_num_indexes"], $host["snmp_version"], $host["snmp_username"], $host["snmp_password"], $host["snmp_auth_protocol"], $host["snmp_priv_passphrase"], $host["snmp_priv_protocol"], $host["snmp_context"], $host["snmp_port"], $host["snmp_timeout"], $host["ping_retries"], $host["max_oids"], SNMP_WEBUI); debug_log_insert("data_query", "Executing SNMP get for num of indexes @ '" . $snmp_queries["oid_num_indexes"] . "' Index Count: " . $snmp_num_indexes); } else { debug_log_insert("data_query", "<oid_num_indexes> missing in XML file, 'Index Count Changed' emulated by counting oid_index entries"); } /* fetch specified index at specified OID */ $snmp_indexes = cacti_snmp_walk($host["hostname"], $host["snmp_community"], $snmp_queries["oid_index"], $host["snmp_version"], $host["snmp_username"], $host["snmp_password"], $host["snmp_auth_protocol"], $host["snmp_priv_passphrase"], $host["snmp_priv_protocol"], $host["snmp_context"], $host["snmp_port"], $host["snmp_timeout"], $host["ping_retries"], $host["max_oids"], SNMP_WEBUI); debug_log_insert("data_query", "Executing SNMP walk for list of indexes @ '" . $snmp_queries["oid_index"] . "' Index Count: " . sizeof($snmp_indexes)); /* no data found; get out */ if (!sizeof($snmp_indexes)) { debug_log_insert("data_query", "No SNMP data returned"); return false; } else { /* show list of indices found */ for ($i = 0; $i < sizeof($snmp_indexes); $i++) { debug_log_insert("data_query", "Index found at OID: '" . $snmp_indexes[$i]["oid"] . "' value: '" . $snmp_indexes[$i]["value"] . "'"); } } /* the last octet of the oid is the index by default */ $index_parse_regexp = '.*\\.([0-9]+)$'; /* parse the index if required */ if (isset($snmp_queries["oid_index_parse"])) { $index_parse_regexp = str_replace("OID/REGEXP:", "", $snmp_queries["oid_index_parse"]); for ($i = 0; $i < sizeof($snmp_indexes); $i++) { $snmp_indexes[$i]["value"] = preg_replace('/' . $index_parse_regexp . '/', "\\1", $snmp_indexes[$i]["oid"]); debug_log_insert("data_query", "index_parse at OID: '" . $snmp_indexes[$i]["oid"] . "' results: '" . $snmp_indexes[$i]["value"] . "'"); } } /* set an array to host all updates */ $output_array = array(); while (list($field_name, $field_array) = each($snmp_queries["fields"])) { if (!isset($field_array["oid"]) && $field_array["source"] == "index") { for ($i = 0; $i < sizeof($snmp_indexes); $i++) { debug_log_insert("data_query", "Inserting index data for field '" . $field_name . "' [value='" . $snmp_indexes[$i]["value"] . "']"); $output_array[] = data_query_format_record($host_id, $snmp_query_id, $field_name, $snmp_indexes[$i]["value"], $snmp_indexes[$i]["value"], ''); } } else { if ($field_array["method"] == "get" && $field_array["direction"] == "input") { debug_log_insert("data_query", "Located input field '{$field_name}' [get]"); if ($field_array["source"] == "value") { for ($i = 0; $i < sizeof($snmp_indexes); $i++) { $oid = $field_array["oid"] . "." . $snmp_indexes[$i]["value"]; $oid .= isset($field_array["oid_suffix"]) ? "." . $field_array["oid_suffix"] : ""; $value = cacti_snmp_get($host["hostname"], $host["snmp_community"], $oid, $host["snmp_version"], $host["snmp_username"], $host["snmp_password"], $host["snmp_auth_protocol"], $host["snmp_priv_passphrase"], $host["snmp_priv_protocol"], $host["snmp_context"], $host["snmp_port"], $host["snmp_timeout"], SNMP_WEBUI); debug_log_insert("data_query", "Executing SNMP get for data @ '{$oid}' [value='{$value}']"); $output_array[] = data_query_format_record($host_id, $snmp_query_id, $field_name, $value, $snmp_indexes[$i]["value"], $oid); } } } else { if ($field_array["method"] == "walk" && $field_array["direction"] == "input") { debug_log_insert("data_query", "Located input field '{$field_name}' [walk]"); $snmp_data = array(); $snmp_data = cacti_snmp_walk($host["hostname"], $host["snmp_community"], $field_array["oid"], $host["snmp_version"], $host["snmp_username"], $host["snmp_password"], $host["snmp_auth_protocol"], $host["snmp_priv_passphrase"], $host["snmp_priv_protocol"], $host["snmp_context"], $host["snmp_port"], $host["snmp_timeout"], $host["ping_retries"], $host["max_oids"], SNMP_WEBUI); debug_log_insert("data_query", "Executing SNMP walk for data @ '" . $field_array["oid"] . "'"); if ($field_array["source"] == "value") { for ($i = 0; $i < sizeof($snmp_data); $i++) { $snmp_index = preg_replace('/' . (isset($field_array["oid_index_parse"]) ? $field_array["oid_index_parse"] : $index_parse_regexp) . '/', "\\1", $snmp_data[$i]["oid"]); $oid = $field_array["oid"] . ".{$snmp_index}"; if ($field_name == "ifOperStatus") { if (substr_count(strtolower($snmp_data[$i]["value"]), "down") || $snmp_data[$i]["value"] == "2") { $snmp_data[$i]["value"] = "Down"; } else { if (substr_count(strtolower($snmp_data[$i]["value"]), "up") || $snmp_data[$i]["value"] == "1") { $snmp_data[$i]["value"] = "Up"; } else { if (substr_count(strtolower($snmp_data[$i]["value"]), "notpresent") || $snmp_data[$i]["value"] == "6") { $snmp_data[$i]["value"] = "notPresent"; } else { $snmp_data[$i]["value"] = "Testing"; } } } } debug_log_insert("data_query", "Found item [{$field_name}='" . $snmp_data[$i]["value"] . "'] index: {$snmp_index} [from value]"); $output_array[] = data_query_format_record($host_id, $snmp_query_id, $field_name, $snmp_data[$i]["value"], $snmp_index, $oid); } } elseif (substr($field_array["source"], 0, 11) == "OID/REGEXP:") { for ($i = 0; $i < sizeof($snmp_data); $i++) { $value = preg_replace('/' . str_replace("OID/REGEXP:", "", $field_array["source"]) . '/', "\\1", $snmp_data[$i]["oid"]); if (isset($snmp_queries["oid_index_parse"])) { $snmp_index = preg_replace('/' . $index_parse_regexp . '/', "\\1", $snmp_data[$i]["oid"]); } else { if (isset($snmp_data[$i]["value"]) && $snmp_data[$i]["value"] != "") { $snmp_index = $snmp_data[$i]["value"]; } } /* correct bogus index value */ /* found in some devices such as an EMC Cellera */ if ($snmp_index == 0) { $snmp_index = 1; } $oid = $field_array["oid"] . "." . $value; debug_log_insert("data_query", "Found item [{$field_name}='{$value}'] index: {$snmp_index} [from regexp oid parse]"); $output_array[] = data_query_format_record($host_id, $snmp_query_id, $field_name, $value, $snmp_index, $oid); } } elseif (substr($field_array["source"], 0, 13) == "VALUE/REGEXP:") { for ($i = 0; $i < sizeof($snmp_data); $i++) { $value = preg_replace('/' . str_replace("VALUE/REGEXP:", "", $field_array["source"]) . '/', "\\1", $snmp_data[$i]["value"]); $snmp_index = preg_replace('/' . (isset($field_array["oid_index_parse"]) ? $field_array["oid_index_parse"] : $index_parse_regexp) . '/', "\\1", $snmp_data[$i]["oid"]); $oid = $field_array["oid"] . "." . $snmp_index; debug_log_insert("data_query", "Found item [{$field_name}='{$value}'] index: {$snmp_index} [from regexp value parse]"); $output_array[] = "('{$host_id}', '{$snmp_query_id}', '{$field_name}', '{$value}', '{$snmp_index}', '{$oid}', '1')"; } } } } } } data_query_update_host_cache_from_buffer($host_id, $snmp_query_id, $output_array); return true; }
function query_snmp_host($host_id, $snmp_query_id) { global $config; include_once($config["library_path"] . "/snmp.php"); $host = db_fetch_row("SELECT hostname, snmp_community, snmp_version, snmp_username, snmp_password, snmp_auth_protocol, snmp_priv_passphrase, snmp_priv_protocol, snmp_context, snmp_port, snmp_timeout, ping_retries, max_oids FROM host WHERE id='$host_id'"); $snmp_queries = get_data_query_array($snmp_query_id); if ($host["hostname"] == "") { debug_log_insert("data_query", "Invalid host_id: $host_id"); return false; } /* invalid xml check */ if ((!is_array($snmp_queries)) || (sizeof($snmp_queries) == 0)) { debug_log_insert("data_query", "Error parsing XML file into an array."); return false; } debug_log_insert("data_query", "XML file parsed ok."); /* fetch specified index at specified OID */ $snmp_indexes = cacti_snmp_walk($host["hostname"], $host["snmp_community"], $snmp_queries["oid_index"], $host["snmp_version"], $host["snmp_username"], $host["snmp_password"], $host["snmp_auth_protocol"], $host["snmp_priv_passphrase"], $host["snmp_priv_protocol"], $host["snmp_context"], $host["snmp_port"], $host["snmp_timeout"], $host["ping_retries"], $host["max_oids"], SNMP_WEBUI); debug_log_insert("data_query", "Executing SNMP walk for list of indexes @ '" . $snmp_queries["oid_index"] . "'"); /* no data found; get out */ if (!$snmp_indexes) { debug_log_insert("data_query", "No SNMP data returned"); return false; } else { /* show list of indices found */ for ($i=0; $i<sizeof($snmp_indexes); $i++) { debug_log_insert("data_query", "Index found at OID: '" . $snmp_indexes[$i]["oid"] . "' value: '" . $snmp_indexes[$i]["value"] . "'"); } } /* the last octet of the oid is the index by default */ $index_parse_regexp = '.*\.([0-9]+)$'; /* parse the index if required */ if (isset($snmp_queries["oid_index_parse"])) { $index_parse_regexp = str_replace("OID/REGEXP:", "", $snmp_queries["oid_index_parse"]); for ($i=0; $i<sizeof($snmp_indexes); $i++) { $snmp_indexes[$i]["value"] = ereg_replace($index_parse_regexp, "\\1", $snmp_indexes[$i]["oid"]); debug_log_insert("data_query", "index_parse at OID: '" . $snmp_indexes[$i]["oid"] . "' results: '" . $snmp_indexes[$i]["value"] . "'"); } } /* set an array to host all updates */ $output_array = array(); while (list($field_name, $field_array) = each($snmp_queries["fields"])) { if ((!isset($field_array["oid"])) && ($field_array["source"] == "index")) { for ($i=0; $i<sizeof($snmp_indexes); $i++) { debug_log_insert("data_query", "Inserting index data for field '" . $field_name . "' [value='" . $snmp_indexes[$i]["value"] . "']"); $output_array[] = data_query_format_record($host_id, $snmp_query_id, $field_name, $snmp_indexes[$i]["value"], $snmp_indexes[$i]["value"], ''); } }else if (($field_array["method"] == "get") && ($field_array["direction"] == "input")) { debug_log_insert("data_query", "Located input field '$field_name' [get]"); if ($field_array["source"] == "value") { for ($i=0; $i<sizeof($snmp_indexes); $i++) { $oid = $field_array["oid"] . "." . $snmp_indexes[$i]["value"]; $value = cacti_snmp_get($host["hostname"], $host["snmp_community"], $oid, $host["snmp_version"], $host["snmp_username"], $host["snmp_password"], $host["snmp_auth_protocol"], $host["snmp_priv_passphrase"], $host["snmp_priv_protocol"], $host["snmp_context"], $host["snmp_port"], $host["snmp_timeout"], SNMP_WEBUI); debug_log_insert("data_query", "Executing SNMP get for data @ '$oid' [value='$value']"); $output_array[] = data_query_format_record($host_id, $snmp_query_id, $field_name, $value, $snmp_indexes[$i]["value"],$oid); } } }else if (($field_array["method"] == "walk") && ($field_array["direction"] == "input")) { debug_log_insert("data_query", "Located input field '$field_name' [walk]"); $snmp_data = array(); $snmp_data = cacti_snmp_walk($host["hostname"], $host["snmp_community"], $field_array["oid"], $host["snmp_version"], $host["snmp_username"], $host["snmp_password"], $host["snmp_auth_protocol"], $host["snmp_priv_passphrase"], $host["snmp_priv_protocol"], $host["snmp_context"], $host["snmp_port"], $host["snmp_timeout"], $host["ping_retries"], $host["max_oids"], SNMP_WEBUI); debug_log_insert("data_query", "Executing SNMP walk for data @ '" . $field_array["oid"] . "'"); if ($field_array["source"] == "value") { for ($i=0; $i<sizeof($snmp_data); $i++) { $snmp_index = ereg_replace(isset($field_array["oid_index_parse"]) ? $field_array["oid_index_parse"] : $index_parse_regexp, "\\1", $snmp_data[$i]["oid"]); $oid = $field_array["oid"] . ".$snmp_index"; if ($field_name == "ifOperStatus") { if ((substr_count(strtolower($snmp_data[$i]["value"]), "down")) || ($snmp_data[$i]["value"] == "2")) { $snmp_data[$i]["value"] = "Down"; }else if ((substr_count(strtolower($snmp_data[$i]["value"]), "up")) || ($snmp_data[$i]["value"] == "1")) { $snmp_data[$i]["value"] = "Up"; }else if ((substr_count(strtolower($snmp_data[$i]["value"]), "notpresent")) || ($snmp_data[$i]["value"] == "6")) { $snmp_data[$i]["value"] = "notPresent"; }else{ $snmp_data[$i]["value"] = "Testing"; } } debug_log_insert("data_query", "Found item [$field_name='" . $snmp_data[$i]["value"] . "'] index: $snmp_index [from value]"); $output_array[] = data_query_format_record($host_id, $snmp_query_id, $field_name, $snmp_data[$i]["value"] , $snmp_index, $oid); } }elseif (substr($field_array["source"], 0, 11) == "OID/REGEXP:") { for ($i=0; $i<sizeof($snmp_data); $i++) { $value = ereg_replace(str_replace("OID/REGEXP:", "", $field_array["source"]), "\\1", $snmp_data[$i]["oid"]); if (isset($snmp_queries["oid_index_parse"])) { $snmp_index = ereg_replace($index_parse_regexp, "\\1", $snmp_data[$i]["oid"]); }else if ((isset($snmp_data[$i]["value"])) && ($snmp_data[$i]["value"] != "")) { $snmp_index = $snmp_data[$i]["value"]; } /* correct bogus index value */ /* found in some devices such as an EMC Cellera */ if ($snmp_index == 0) { $snmp_index = 1; } $oid = $field_array["oid"] . "." . $value; debug_log_insert("data_query", "Found item [$field_name='$value'] index: $snmp_index [from regexp oid parse]"); $output_array[] = data_query_format_record($host_id, $snmp_query_id, $field_name, $value, $snmp_index, $oid); } }elseif (substr($field_array["source"], 0, 13) == "VALUE/REGEXP:") { for ($i=0; $i<sizeof($snmp_data); $i++) { $value = ereg_replace(str_replace("VALUE/REGEXP:", "", $field_array["source"]), "\\1", $snmp_data[$i]["value"]); $snmp_index = ereg_replace($index_parse_regexp, "\\1", $snmp_data[$i]["oid"]); $oid = $field_array["oid"] . "." . $value; debug_log_insert("data_query", "Found item [$field_name='$value'] index: $snmp_index [from regexp value parse]"); $output_array[] = "('$host_id', '$snmp_query_id', '$field_name', '$value', '$snmp_index', '$oid', '1')"; } } } } if (sizeof($output_array)) { data_query_update_host_cache_from_buffer($host_id, $snmp_query_id, $output_array); } return true; }