コード例 #1
0
ファイル: data_query.php プロジェクト: teddywen/cacti
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;
}
コード例 #2
0
ファイル: data_query.php プロジェクト: songchin/Cacti
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;
}