function update_poller_cache($local_data_id, $commit = false) { global $config; require_once(CACTI_BASE_PATH . "/include/data_input/data_input_constants.php"); include_once(CACTI_BASE_PATH . "/lib/data_query.php"); include_once(CACTI_BASE_PATH . "/lib/api_poller.php"); $poller_items = array(); $data_input = db_fetch_row("select data_input.id, data_input.type_id, data_template_data.id as data_template_data_id, data_template_data.data_template_id, data_template_data.active, data_template_data.rrd_step from (data_template_data,data_input) where data_template_data.data_input_id=data_input.id and data_template_data.local_data_id=$local_data_id"); $data_source = db_fetch_row("select device_id,snmp_query_id,snmp_index from data_local where id=$local_data_id"); /* we have to perform some additional sql queries if this is a "query" */ if (($data_input["type_id"] == DATA_INPUT_TYPE_SNMP_QUERY) || ($data_input["type_id"] == DATA_INPUT_TYPE_SCRIPT_QUERY) || ($data_input["type_id"] == DATA_INPUT_TYPE_QUERY_SCRIPT_SERVER)){ $field = data_query_field_list($data_input["data_template_data_id"]); if (strlen($field["output_type"])) { $output_type_sql = "and snmp_query_graph_rrd.snmp_query_graph_id=" . $field["output_type"]; }else{ $output_type_sql = ""; } $outputs = db_fetch_assoc("select snmp_query_graph_rrd.snmp_field_name, data_template_rrd.id as data_template_rrd_id from (snmp_query_graph_rrd,data_template_rrd) where snmp_query_graph_rrd.data_template_rrd_id=data_template_rrd.local_data_template_rrd_id $output_type_sql and snmp_query_graph_rrd.data_template_id=" . $data_input["data_template_id"] . " and data_template_rrd.local_data_id=$local_data_id"); } if ($data_input["active"] == CHECKED) { if (($data_input["type_id"] == DATA_INPUT_TYPE_SCRIPT) || ($data_input["type_id"] == DATA_INPUT_TYPE_PHP_SCRIPT_SERVER)) { /* script */ /* fall back to non-script server actions if the user is running a version of php older than 4.3 */ if (($data_input["type_id"] == DATA_INPUT_TYPE_PHP_SCRIPT_SERVER) && (function_exists("proc_open"))) { $action = POLLER_ACTION_SCRIPT_PHP; $script_path = get_full_script_path($local_data_id); }else if (($data_input["type_id"] == DATA_INPUT_TYPE_PHP_SCRIPT_SERVER) && (!function_exists("proc_open"))) { $action = POLLER_ACTION_SCRIPT; $script_path = read_config_option("path_php_binary") . " -q " . get_full_script_path($local_data_id); }else{ $action = POLLER_ACTION_SCRIPT; $script_path = get_full_script_path($local_data_id); } $num_output_fields = sizeof(db_fetch_assoc("select id from data_input_fields where data_input_id=" . $data_input["id"] . " and input_output='out' and update_rra='on'")); if ($num_output_fields == 1) { $data_template_rrd_id = db_fetch_cell("select id from data_template_rrd where local_data_id=$local_data_id"); $data_source_item_name = get_data_source_item_name($data_template_rrd_id); }else{ $data_source_item_name = ""; } $poller_items[] = api_poller_cache_item_add($data_source["device_id"], array(), $local_data_id, $data_input["rrd_step"], $action, $data_source_item_name, 1, addslashes($script_path)); }else if ($data_input["type_id"] == DATA_INPUT_TYPE_SNMP) { /* snmp */ /* get the device override fields */ $data_template_id = db_fetch_cell("SELECT data_template_id FROM data_template_data WHERE local_data_id=$local_data_id"); /* get device fields first */ $device_fields = array_rekey(db_fetch_assoc("SELECT data_input_fields.type_code, data_input_data.value FROM data_input_fields LEFT JOIN data_input_data ON (data_input_fields.id=data_input_data.data_input_field_id and data_input_data.data_template_data_id=" . $data_input["data_template_data_id"] . ") WHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname')) AND data_input_data.value != ''"), "type_code", "value"); $data_template_fields = array_rekey(db_fetch_assoc("SELECT data_input_fields.type_code, data_input_data.value FROM data_input_fields LEFT JOIN data_input_data ON (data_input_fields.id=data_input_data.data_input_field_id and data_input_data.data_template_data_id=$data_template_id) WHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname')) AND data_template_data_id=$data_template_id AND data_input_data.value != ''"), "type_code", "value"); if (sizeof($device_fields)) { if (sizeof($data_template_fields)) { foreach($data_template_fields as $key => $value) { if (!isset($device_fields[$key])) { $device_fields[$key] = $value; } } } } elseif (sizeof($data_template_fields)) { $device_fields = $data_template_fields; } $data_template_rrd_id = db_fetch_cell("select id from data_template_rrd where local_data_id=$local_data_id"); $poller_items[] = api_poller_cache_item_add($data_source["device_id"], $device_fields, $local_data_id, $data_input["rrd_step"], 0, get_data_source_item_name($data_template_rrd_id), 1, (isset($device_fields["snmp_oid"]) ? $device_fields["snmp_oid"] : "")); }else if ($data_input["type_id"] == DATA_INPUT_TYPE_SNMP_QUERY) { /* snmp query */ $snmp_queries = get_data_query_array($data_source["snmp_query_id"]); /* get the device override fields */ $data_template_id = db_fetch_cell("SELECT data_template_id FROM data_template_data WHERE local_data_id=$local_data_id"); /* get device fields first */ $device_fields = array_rekey(db_fetch_assoc("SELECT data_input_fields.type_code, data_input_data.value FROM data_input_fields LEFT JOIN data_input_data ON (data_input_fields.id=data_input_data.data_input_field_id and data_input_data.data_template_data_id=" . $data_input["data_template_data_id"] . ") WHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname')) AND data_input_data.value != ''"), "type_code", "value"); $data_template_fields = array_rekey(db_fetch_assoc("SELECT data_input_fields.type_code, data_input_data.value FROM data_input_fields LEFT JOIN data_input_data ON (data_input_fields.id=data_input_data.data_input_field_id and data_input_data.data_template_data_id=$data_template_id) WHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname')) AND data_template_data_id=$data_template_id AND data_input_data.value != ''"), "type_code", "value"); if (sizeof($device_fields)) { if (sizeof($data_template_fields)) { foreach($data_template_fields as $key => $value) { if (!isset($device_fields[$key])) { $device_fields[$key] = $value; } } } } elseif (sizeof($data_template_fields)) { $device_fields = $data_template_fields; } if (sizeof($outputs) > 0) { foreach ($outputs as $output) { if (isset($snmp_queries["fields"]{$output["snmp_field_name"]}["oid"])) { $oid_suffix = $data_source["snmp_index"]; if(isset($snmp_queries["fields"]{$output["snmp_field_name"]}["rewrite_index"])){ $oid_suffix = data_query_rewrite_indexes($errmsg, $data_source["device_id"], $data_source["snmp_query_id"], $snmp_queries["fields"]{$output["snmp_field_name"]}["rewrite_index"], $oid_suffix); if($oid_suffix == NULL){ // rewriting index failed for some reason if(sizeof($errmsg)){ foreach($errmsg as $message){ cacti_log(__("Field '%s':", $output["snmp_field_name"]) . $message, false, "POLLER"); } } continue; } } $oid = $snmp_queries["fields"]{$output["snmp_field_name"]}["oid"] . "." . $oid_suffix; if (isset($snmp_queries["fields"]{$output["snmp_field_name"]}["oid_suffix"])) { $oid .= "." . $snmp_queries["fields"]{$output["snmp_field_name"]}["oid_suffix"]; } } if (!empty($oid)) { $poller_items[] = api_poller_cache_item_add($data_source["device_id"], $device_fields, $local_data_id, $data_input["rrd_step"], 0, get_data_source_item_name($output["data_template_rrd_id"]), sizeof($outputs), $oid); } } } }else if (($data_input["type_id"] == DATA_INPUT_TYPE_SCRIPT_QUERY) || ($data_input["type_id"] == DATA_INPUT_TYPE_QUERY_SCRIPT_SERVER)) { /* script query */ $script_queries = get_data_query_array($data_source["snmp_query_id"]); /* get the device override fields */ $data_template_id = db_fetch_cell("SELECT data_template_id FROM data_template_data WHERE local_data_id=$local_data_id"); /* get device fields first */ $device_fields = array_rekey(db_fetch_assoc("SELECT data_input_fields.type_code, data_input_data.value FROM data_input_fields LEFT JOIN data_input_data ON (data_input_fields.id=data_input_data.data_input_field_id and data_input_data.data_template_data_id=" . $data_input["data_template_data_id"] . ") WHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname')) AND data_input_data.value != ''"), "type_code", "value"); $data_template_fields = array_rekey(db_fetch_assoc("SELECT data_input_fields.type_code, data_input_data.value FROM data_input_fields LEFT JOIN data_input_data ON (data_input_fields.id=data_input_data.data_input_field_id and data_input_data.data_template_data_id=$data_template_id) WHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname')) AND data_template_data_id=$data_template_id AND data_input_data.value != ''"), "type_code", "value"); if (sizeof($device_fields)) { if (sizeof($data_template_fields)) { foreach($data_template_fields as $key => $value) { if (!isset($device_fields[$key])) { $device_fields[$key] = $value; } } } } elseif (sizeof($data_template_fields)) { $device_fields = $data_template_fields; } if (sizeof($outputs) > 0) { foreach ($outputs as $output) { if (isset($script_queries["fields"]{$output["snmp_field_name"]}["query_name"])) { $identifier = $script_queries["fields"]{$output["snmp_field_name"]}["query_name"]; /* fall back to non-script server actions if the user is running a version of php older than 4.3 */ if (($data_input["type_id"] == DATA_INPUT_TYPE_QUERY_SCRIPT_SERVER) && (function_exists("proc_open"))) { $action = POLLER_ACTION_SCRIPT_PHP; $script_path = get_script_query_path((isset($script_queries["arg_prepend"]) ? $script_queries["arg_prepend"] : "") . " " . $script_queries["arg_get"] . " " . $identifier . " " . $data_source["snmp_index"], $script_queries["script_path"] . " " . $script_queries["script_function"], $data_source["device_id"]); }else if (($data_input["type_id"] == DATA_INPUT_TYPE_QUERY_SCRIPT_SERVER) && (!function_exists("proc_open"))) { $action = POLLER_ACTION_SCRIPT; $script_path = read_config_option("path_php_binary") . " -q " . get_script_query_path((isset($script_queries["arg_prepend"]) ? $script_queries["arg_prepend"] : "") . " " . $script_queries["arg_get"] . " " . $identifier . " " . $data_source["snmp_index"], $script_queries["script_path"], $data_source["device_id"]); }else{ $action = POLLER_ACTION_SCRIPT; $script_path = get_script_query_path((isset($script_queries["arg_prepend"]) ? $script_queries["arg_prepend"] : "") . " " . $script_queries["arg_get"] . " " . $identifier . " " . $data_source["snmp_index"], $script_queries["script_path"], $data_source["device_id"]); } } if (isset($script_path)) { $poller_items[] = api_poller_cache_item_add($data_source["device_id"], $device_fields, $local_data_id, $data_input["rrd_step"], $action, get_data_source_item_name($output["data_template_rrd_id"]), sizeof($outputs), addslashes($script_path)); } } } } } if ($commit) { poller_update_poller_cache_from_buffer((array)$local_data_id, $poller_items); } else { return $poller_items; } }
/** * execute an SNMP query for a given device * @param int $device_id * @param int $snmp_query_id */ function query_snmp_device($device_id, $snmp_query_id) { global $config; include_once(CACTI_BASE_PATH . "/lib/snmp.php"); $device = 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 device WHERE id='$device_id'"); $snmp_queries = get_data_query_array($snmp_query_id); if ($device["hostname"] == "") { debug_log_insert("data_query", __("Invalid device_id:") . " $device_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($device["hostname"], $device["snmp_community"], $snmp_queries["oid_index"], $device["snmp_version"], $device["snmp_username"], $device["snmp_password"], $device["snmp_auth_protocol"], $device["snmp_priv_passphrase"], $device["snmp_priv_protocol"], $device["snmp_context"], $device["snmp_port"], $device["snmp_timeout"], $device["ping_retries"], $device["max_oids"], SNMP_WEBUI); debug_log_insert("data_query", __("Executing SNMP walk for list of indexes @ '%s'", $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: '%s' value: '%s'", $snmp_indexes[$i]["oid"], $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: '%s' results: '%s'", $snmp_indexes[$i]["oid"], $snmp_indexes[$i]["value"])); } } /* set an array to host all updates */ $output_array = array(); $fields_processed = array(); rewrite_snmp_enum_value(NULL); while (list($field_name, $field_array) = each($snmp_queries["fields"])) { if ($field_array["direction"] == "input" && $field_array["method"] != "get" && (isset($field_array["rewrite_index"]) || isset($field_array["oid_suffix"]) )){ #$field_array["method"] = "get"; # do NOT change method, only create error message debug_log_insert("data_query", __("FIXME: wrong 'method' defined for '%s' while using 'rewrite_index' or 'oid_suffix'. Please change XML to use 'get' instead.", $field_name)); } $values = array(); 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 '%s' [value='%s']", $field_name, $snmp_indexes[$i]["value"])); $values[] = array( "value" => $snmp_indexes[$i]["value"], "index" => $snmp_indexes[$i]["value"], "oid" => $oid); } }elseif (($field_array["method"] == "get") && ($field_array["direction"] == "input")) { debug_log_insert("data_query", __("Located input field '%s' [get]", $field_name)); $rewritten_indexes = array(); if (isset($field_array["rewrite_index"])) { $rewritten_indexes = data_query_rewrite_indexes($errmsg, $device_id, $snmp_query_id, $field_array["rewrite_index"], $snmp_indexes, $fields_processed); if(sizeof($errmsg)){ foreach($errmsg as $message){ debug_log_insert("data_query", "Field '$field_name'" . $message); } } } for ($i=0; $i<sizeof($snmp_indexes); $i++) { $oid = $field_array["oid"]; if (isset($field_array["rewrite_index"])) { if (isset($rewritten_indexes[$snmp_indexes[$i]["value"]])) { $oid_suffix = $rewritten_indexes[$snmp_indexes[$i]["value"]]; }else{ // we failed to build rewritten index. warnings are sent already, just skip this index silently continue; } $oid .= "." . $oid_suffix; } else { $oid .= "." . $snmp_indexes[$i]["value"]; } $oid .= isset($field_array["oid_suffix"]) ? ("." . $field_array["oid_suffix"]) : ""; $value = NULL; if (substr($field_array["source"], 0, 13) == "VALUE/REGEXP:" || $field_array["source"] == "value") { $value = cacti_snmp_get($device["hostname"], $device["snmp_community"], $oid, $device["snmp_version"], $device["snmp_username"], $device["snmp_password"], $device["snmp_auth_protocol"], $device["snmp_priv_passphrase"], $device["snmp_priv_protocol"], $device["snmp_context"], $device["snmp_port"], $device["snmp_timeout"], SNMP_WEBUI); if (substr($field_array["source"], 0, 13) == "VALUE/REGEXP:") { $value = preg_replace("/" . str_replace("VALUE/REGEXP:", "", $field_array["source"]) . "/", "\\1", $value); } } else if(substr($field_array["source"], 0, 11) == "OID/REGEXP:") { $value = preg_replace("/" . str_replace("OID/REGEXP:", "", $field_array["source"]) . "/", "\\1", $oid); } debug_log_insert("data_query", __("Executing SNMP get for data") . " @ '$oid' [value='$value']"); $values[] = array( "value" => $value, "index" => $snmp_indexes[$i]["value"], "oid" => $oid); } } elseif (($field_array["method"] == "walk") && ($field_array["direction"] == "input")) { debug_log_insert("data_query", __("Located input field '%s' [walk]", $field_name)); $snmp_data = array(); $snmp_data = cacti_snmp_walk($device["hostname"], $device["snmp_community"], $field_array["oid"], $device["snmp_version"], $device["snmp_username"], $device["snmp_password"], $device["snmp_auth_protocol"], $device["snmp_priv_passphrase"], $device["snmp_priv_protocol"], $device["snmp_context"], $device["snmp_port"], $device["snmp_timeout"], $device["ping_retries"], $device["max_oids"], SNMP_WEBUI); debug_log_insert("data_query", __("Executing SNMP walk for data @ '%s'", $field_array["oid"])); if ($field_array["source"] == "value") { for ($i=0; $i<sizeof($snmp_data); $i++) { # Is this preg_replace functional? - JPP $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"; # deprecated in favour of "<rewrite_value>", bug#0001225 #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='%s'] index: %s [from value]", $snmp_data[$i]["value"], $snmp_index)); $values[] = array( "value" => $snmp_data[$i]["value"], "index" => $snmp_index, "oid" => $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"]; } $oid = $field_array["oid"] . "." . $value; debug_log_insert("data_query", __("Found item [%s='%s'] index: %s [from regexp oid parse]", $field_name, $value, $snmp_index)); $values[] = array( "value" => $value, "index" => $snmp_index, "oid" => $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("/" . $index_parse_regexp . "/", "\\1", $snmp_data[$i]["oid"]); $oid = $field_array["oid"] . "." . $value; debug_log_insert("data_query", __("Found item [%s='%s'] index: %s [from regexp value parse]", $field_name, $value, $snmp_index)); $values[] = array( "value" => $value, "index" => $snmp_index, "oid" => $oid); } } } if (sizeof($values)) { foreach($values as $item){ if(isset($field_array["rewrite_value"])) { $item["value"] = rewrite_snmp_enum_value($field_name, $item["value"], $field_array["rewrite_value"]); } $output_array[] = data_query_format_record($device_id, $snmp_query_id, $field_name, $item["value"], $item["index"], $item["oid"]); } $fields_processed[] = $field_name; } } if (sizeof($output_array)) { data_query_update_device_cache_from_buffer($device_id, $snmp_query_id, $output_array); } return true; }