function rrdtool_function_tune($rrd_tune_array) { global $config; include($config["include_path"] . "/global_arrays.php"); $data_source_name = get_data_source_item_name($rrd_tune_array["data_source_id"]); $data_source_type = $data_source_types{$rrd_tune_array["data-source-type"]}; $data_source_path = get_data_source_path($rrd_tune_array["data_source_id"], true); if ($rrd_tune_array["heartbeat"] != "") { $rrd_tune .= " --heartbeat $data_source_name:" . $rrd_tune_array["heartbeat"]; } if ($rrd_tune_array["minimum"] != "") { $rrd_tune .= " --minimum $data_source_name:" . $rrd_tune_array["minimum"]; } if ($rrd_tune_array["maximum"] != "") { $rrd_tune .= " --maximum $data_source_name:" . $rrd_tune_array["maximum"]; } if ($rrd_tune_array["data-source-type"] != "") { $rrd_tune .= " --data-source-type $data_source_name:" . $data_source_type; } if ($rrd_tune_array["data-source-rename"] != "") { $rrd_tune .= " --data-source-rename $data_source_name:" . $rrd_tune_array["data-source-rename"]; } if ($rrd_tune != "") { if (file_exists($data_source_path) == true) { $fp = popen(read_config_option("path_rrdtool") . " tune $data_source_path $rrd_tune", "r"); pclose($fp); if (read_config_option("log_verbosity") >= POLLER_VERBOSITY_DEBUG) { cacti_log("CACTI2RRD: " . read_config_option("path_rrdtool") . " tune $data_source_path $rrd_tune"); } } } }
function boost_rrdtool_function_create($local_data_id, $initial_time, $show_source) { global $config; include $config["include_path"] . "/global_arrays.php"; $data_source_path = get_data_source_path($local_data_id, TRUE); /* ok, if that passes lets check to make sure an rra does not already exist, the last thing we want to do is overright data! */ if ($show_source != TRUE) { if (file_exists($data_source_path) == TRUE) { return -1; } } /* the first thing we must do is make sure there is at least one rra associated with this data source... * UPDATE: As of version 0.6.6, we are splitting this up into two SQL strings because of the multiple DS per RRD support. This is not a big deal however since this function gets called once per data source */ $rras = db_fetch_assoc("select\r\n\t\tdata_template_data.rrd_step,\r\n\t\trra.x_files_factor,\r\n\t\trra.steps,\r\n\t\trra.rows,\r\n\t\trra_cf.consolidation_function_id,\r\n\t\t(rra.rows*rra.steps) as rra_order\r\n\t\tfrom data_template_data\r\n\t\tleft join data_template_data_rra on (data_template_data.id=data_template_data_rra.data_template_data_id)\r\n\t\tleft join rra on (data_template_data_rra.rra_id=rra.id)\r\n\t\tleft join rra_cf on (rra.id=rra_cf.rra_id)\r\n\t\twhere data_template_data.local_data_id={$local_data_id}\r\n\t\tand (rra.steps is not null or rra.rows is not null)\r\n\t\torder by rra_cf.consolidation_function_id,rra_order"); /* if we find that this DS has no RRA associated; get out. This would * indicate that a data sources has been deleted */ if (sizeof($rras) <= 0) { return FALSE; } /* back off the initial time to allow updates */ $initial_time -= 300; /* create the "--step" line */ $create_ds = RRD_NL . "--start " . $initial_time . " --step " . $rras[0]["rrd_step"] . " " . RRD_NL; /* query the data sources to be used in this .rrd file */ $data_sources = db_fetch_assoc("SELECT\r\n\t\tdata_template_rrd.id,\r\n\t\tdata_template_rrd.rrd_heartbeat,\r\n\t\tdata_template_rrd.rrd_minimum,\r\n\t\tdata_template_rrd.rrd_maximum,\r\n\t\tdata_template_rrd.data_source_type_id\r\n\t\tFROM data_template_rrd\r\n\t\tWHERE data_template_rrd.local_data_id={$local_data_id}\r\n\t\tORDER BY local_data_template_rrd_id"); /* ONLY make a new DS entry if: - There is multiple data sources and this item is not the main one. - There is only one data source (then use it) */ if (sizeof($data_sources) > 0) { foreach ($data_sources as $data_source) { /* use the cacti ds name by default or the user defined one, if entered */ $data_source_name = get_data_source_item_name($data_source["id"]); if (empty($data_source["rrd_maximum"])) { /* in case no maximum is given, use "Undef" value */ $data_source["rrd_maximum"] = "U"; } elseif (strpos($data_source["rrd_maximum"], "|query_") !== false) { if ($data_source["rrd_maximum"] == "|query_ifSpeed|" || $data_source["rrd_maximum"] == "|query_ifHighSpeed|") { $highSpeed = db_fetch_cell("SELECT field_value\r\n\t\t\t\t\tFROM host_snmp_cache\r\n\t\t\t\t\tWHERE host_id=" . $data_local["host_id"] . "\r\n\t\t\t\t\tAND snmp_query_id=" . $data_local["snmp_query_id"] . "\r\n\t\t\t\t\tAND snmp_index='" . $data_local["snmp_index"] . "'\r\n\t\t\t\t\tAND field_name='ifHighSpeed'"); if (!empty($highSpeed)) { $data_source["rrd_maximum"] = $highSpeed * 1000000; } else { $data_source["rrd_maximum"] = substitute_snmp_query_data("|query_ifSpeed|", $data_local["host_id"], $data_local["snmp_query_id"], $data_local["snmp_index"]); } } else { $data_source["rrd_maximum"] = substitute_snmp_query_data($data_source["rrd_maximum"], $data_local["host_id"], $data_local["snmp_query_id"], $data_local["snmp_index"]); } } elseif ($data_source["rrd_maximum"] != "U" && (int) $data_source["rrd_maximum"] <= (int) $data_source["rrd_minimum"]) { /* max > min required, but take care of an "Undef" value */ $data_source["rrd_maximum"] = (int) $data_source["rrd_minimum"] + 1; } /* min==max==0 won't work with rrdtool */ if ($data_source["rrd_minimum"] == 0 && $data_source["rrd_maximum"] == 0) { $data_source["rrd_maximum"] = "U"; } $create_ds .= "DS:{$data_source_name}:" . $data_source_types[$data_source["data_source_type_id"]] . ":" . $data_source["rrd_heartbeat"] . ":" . $data_source["rrd_minimum"] . ":" . $data_source["rrd_maximum"] . RRD_NL; } } $create_rra = ""; /* loop through each available RRA for this DS */ foreach ($rras as $rra) { $create_rra .= "RRA:" . $consolidation_functions[$rra["consolidation_function_id"]] . ":" . $rra["x_files_factor"] . ":" . $rra["steps"] . ":" . $rra["rows"] . RRD_NL; } /* check for structured path configuration, if in place verify directory exists and if not create it. */ if (read_config_option("extended_paths") == "on") { if (!is_dir(dirname($data_source_path))) { if (mkdir(dirname($data_source_path), 0775)) { if ($config["cacti_server_os"] != "win32") { $owner_id = fileowner($config["rra_path"]); $group_id = filegroup($config["rra_path"]); if (chown(dirname($data_source_path), $owner_id) && chgrp(dirname($data_source_path), $group_id)) { /* permissions set ok */ } else { cacti_log("ERROR: Unable to set directory permissions for '" . dirname($data_source_path) . "'", FALSE); } } } else { cacti_log("ERROR: Unable to create directory '" . dirname($data_source_path) . "'", FALSE); } } } if ($show_source == TRUE) { return read_config_option("path_rrdtool") . " create" . RRD_NL . "{$data_source_path}{$create_ds}{$create_rra}"; } else { return boost_rrdtool_execute("create {$data_source_path} {$create_ds}{$create_rra}", FALSE, RRDTOOL_OUTPUT_STDOUT); } }
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; } }
function boost_rrdtool_function_create($local_data_id, $initial_time, $show_source) { global $config; include $config['include_path'] . '/global_arrays.php'; $data_source_path = get_data_source_path($local_data_id, true); /* ok, if that passes lets check to make sure an rra does not already exist, the last thing we want to do is overright data! */ if ($show_source != true) { if (file_exists($data_source_path) == true) { return -1; } } /* the first thing we must do is make sure there is at least one rra associated with this data source... * UPDATE: As of version 0.6.6, we are splitting this up into two SQL strings because of the multiple DS per RRD support. This is not a big deal however since this function gets called once per data source */ $rras = db_fetch_assoc_prepared('SELECT data_template_data.rrd_step, rra.x_files_factor, rra.steps, rra.rows, rra_cf.consolidation_function_id, (rra.rows * rra.steps) AS rra_order FROM data_template_data LEFT JOIN data_template_data_rra ON (data_template_data.id = data_template_data_rra.data_template_data_id) LEFT JOIN rra ON (data_template_data_rra.rra_id = rra.id) LEFT JOIN rra_cf ON (rra.id = rra_cf.rra_id) WHERE data_template_data.local_data_id = ? AND (rra.steps is not null OR rra.rows is not null) ORDER BY rra_cf.consolidation_function_id, rra_order', array($local_data_id)); /* if we find that this DS has no RRA associated; get out. This would * indicate that a data sources has been deleted */ if (sizeof($rras) <= 0) { return false; } /* back off the initial time to allow updates */ $initial_time -= 300; /* create the "--step" line */ $create_ds = RRD_NL . '--start ' . $initial_time . ' --step ' . $rras[0]['rrd_step'] . ' ' . RRD_NL; /* query the data sources to be used in this .rrd file */ $data_sources = db_fetch_assoc_prepared('SELECT data_template_rrd.id, data_template_rrd.rrd_heartbeat, data_template_rrd.rrd_minimum, data_template_rrd.rrd_maximum, data_template_rrd.data_source_type_id FROM data_template_rrd WHERE data_template_rrd.local_data_id = ? ORDER BY local_data_template_rrd_id', array($local_data_id)); /* ONLY make a new DS entry if: - There is multiple data sources and this item is not the main one. - There is only one data source (then use it) */ if (sizeof($data_sources) > 0) { foreach ($data_sources as $data_source) { /* use the cacti ds name by default or the user defined one, if entered */ $data_source_name = get_data_source_item_name($data_source['id']); if (empty($data_source['rrd_maximum'])) { /* in case no maximum is given, use "Undef" value */ $data_source['rrd_maximum'] = 'U'; } elseif (strpos($data_source['rrd_maximum'], '|query_') !== false) { $data_local = db_fetch_row_prepared('SELECT * FROM data_local WHERE id = ?', array($local_data_id)); if ($data_source['rrd_maximum'] == '|query_ifSpeed|' || $data_source['rrd_maximum'] == '|query_ifHighSpeed|') { $highSpeed = db_fetch_cell_prepared("SELECT field_value\n\t\t\t\t\tFROM host_snmp_cache\n\t\t\t\t\tWHERE host_id = ?\n\t\t\t\t\tAND snmp_query_id = ?\n\t\t\t\t\tAND snmp_index = ?\n\t\t\t\t\tAND field_name = 'ifHighSpeed'", array($data_local['host_id'], $data_local['snmp_query_id'], $data_local['snmp_index'])); if (!empty($highSpeed)) { $data_source['rrd_maximum'] = $highSpeed * 1000000; } else { $data_source['rrd_maximum'] = substitute_snmp_query_data('|query_ifSpeed|', $data_local['host_id'], $data_local['snmp_query_id'], $data_local['snmp_index']); } } else { $data_source['rrd_maximum'] = substitute_snmp_query_data($data_source['rrd_maximum'], $data_local['host_id'], $data_local['snmp_query_id'], $data_local['snmp_index']); } } elseif ($data_source['rrd_maximum'] != 'U' && (int) $data_source['rrd_maximum'] <= (int) $data_source['rrd_minimum']) { /* max > min required, but take care of an "Undef" value */ $data_source['rrd_maximum'] = (int) $data_source['rrd_minimum'] + 1; } /* min==max==0 won't work with rrdtool */ if ($data_source['rrd_minimum'] == 0 && $data_source['rrd_maximum'] == 0) { $data_source['rrd_maximum'] = 'U'; } $create_ds .= "DS:{$data_source_name}:" . $data_source_types[$data_source['data_source_type_id']] . ':' . $data_source['rrd_heartbeat'] . ':' . $data_source['rrd_minimum'] . ':' . $data_source['rrd_maximum'] . RRD_NL; } } $create_rra = ''; /* loop through each available RRA for this DS */ foreach ($rras as $rra) { $create_rra .= 'RRA:' . $consolidation_functions[$rra['consolidation_function_id']] . ':' . $rra['x_files_factor'] . ':' . $rra['steps'] . ':' . $rra['rows'] . RRD_NL; } /* check for structured path configuration, if in place verify directory exists and if not create it. */ if (read_config_option('extended_paths') == 'on') { if (!is_dir(dirname($data_source_path))) { if (mkdir(dirname($data_source_path), 0775)) { if ($config['cacti_server_os'] != 'win32') { $owner_id = fileowner($config['rra_path']); $group_id = filegroup($config['rra_path']); if (chown(dirname($data_source_path), $owner_id) && chgrp(dirname($data_source_path), $group_id)) { /* permissions set ok */ } else { cacti_log("ERROR: Unable to set directory permissions for '" . dirname($data_source_path) . "'", false); } } } else { cacti_log("ERROR: Unable to create directory '" . dirname($data_source_path) . "'", false); } } } if ($show_source == true) { return read_config_option('path_rrdtool') . ' create' . RRD_NL . "{$data_source_path}{$create_ds}{$create_rra}"; } else { return boost_rrdtool_execute("create {$data_source_path} {$create_ds}{$create_rra}", false, RRDTOOL_OUTPUT_STDOUT); } }
function update_poller_cache($local_data_id, $truncate_performed = false) { global $config; include_once($config["library_path"] . "/data_query.php"); include_once($config["library_path"] . "/api_poller.php"); $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 host_id,snmp_query_id,snmp_index from data_local where id=$local_data_id"); /* clear cache for this local_data_id */ if (!$truncate_performed) { db_execute("delete from poller_item where local_data_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 (($data_input["type_id"] != DATA_INPUT_TYPE_PHP_SCRIPT_SERVER) && (empty($field["output_type"]))) { return; } 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"] == "on") { 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 = ""; } api_poller_cache_item_add($data_source["host_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 */ $host_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 (data_input_fields.type_code='snmp_oid' or data_input_fields.type_code='hostname' or data_input_fields.type_code='snmp_community' or data_input_fields.type_code='snmp_username' or data_input_fields.type_code='snmp_password' or data_input_fields.type_code='snmp_auth_protocol' or data_input_fields.type_code='snmp_priv_passphrase' or data_input_fields.type_code='snmp_priv_protocol' or data_input_fields.type_code='snmp_context' or data_input_fields.type_code='snmp_version' or data_input_fields.type_code='snmp_port' or data_input_fields.type_code='snmp_timeout') and data_input_data.value != ''"), "type_code", "value"); $data_template_rrd_id = db_fetch_cell("select id from data_template_rrd where local_data_id=$local_data_id"); api_poller_cache_item_add($data_source["host_id"], $host_fields, $local_data_id, $data_input["rrd_step"], 0, get_data_source_item_name($data_template_rrd_id), 1, (isset($host_fields["snmp_oid"]) ? $host_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"]); if (sizeof($outputs) > 0) { foreach ($outputs as $output) { if (isset($snmp_queries["fields"]{$output["snmp_field_name"]}["oid"])) { $oid = $snmp_queries["fields"]{$output["snmp_field_name"]}["oid"] . "." . $data_source["snmp_index"]; } if (!empty($oid)) { api_poller_cache_item_add($data_source["host_id"], array(), $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"]); 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["host_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["host_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["host_id"]); } } if (isset($script_path)) { api_poller_cache_item_add($data_source["host_id"], array(), $local_data_id, $data_input["rrd_step"], $action, get_data_source_item_name($output["data_template_rrd_id"]), sizeof($outputs), addslashes($script_path)); } } } } } }
function update_poller_cache($local_data_id, $commit = false) { global $config; include_once $config["library_path"] . "/data_query.php"; include_once $config["library_path"] . "/api_poller.php"; $poller_items = array(); $data_input = db_fetch_row("select\r\n\t\tdata_input.id,\r\n\t\tdata_input.type_id,\r\n\t\tdata_template_data.id as data_template_data_id,\r\n\t\tdata_template_data.data_template_id,\r\n\t\tdata_template_data.active,\r\n\t\tdata_template_data.rrd_step\r\n\t\tfrom (data_template_data,data_input)\r\n\t\twhere data_template_data.data_input_id=data_input.id\r\n\t\tand data_template_data.local_data_id={$local_data_id}"); $data_source = db_fetch_row("select host_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\r\n\t\t\tsnmp_query_graph_rrd.snmp_field_name,\r\n\t\t\tdata_template_rrd.id as data_template_rrd_id\r\n\t\t\tfrom (snmp_query_graph_rrd,data_template_rrd)\r\n\t\t\twhere snmp_query_graph_rrd.data_template_rrd_id=data_template_rrd.local_data_template_rrd_id\r\n\t\t\t{$output_type_sql}\r\n\t\t\tand snmp_query_graph_rrd.data_template_id=" . $data_input["data_template_id"] . "\r\n\t\t\tand data_template_rrd.local_data_id={$local_data_id}\r\n\t\t\torder by data_template_rrd.id"); } if ($data_input["active"] == "on") { 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["host_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 host override fields */ $data_template_id = db_fetch_cell("SELECT data_template_id FROM data_template_data WHERE local_data_id={$local_data_id}"); /* get host fields first */ $host_fields = array_rekey(db_fetch_assoc("SELECT\r\n\t\t\t\tdata_input_fields.type_code,\r\n\t\t\t\tdata_input_data.value\r\n\t\t\t\tFROM data_input_fields\r\n\t\t\t\tLEFT JOIN data_input_data\r\n\t\t\t\tON (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"] . ")\r\n\t\t\t\tWHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname') OR (type_code='host_id'))\r\n\t\t\t\tAND data_input_data.value != ''"), "type_code", "value"); $data_template_fields = array_rekey(db_fetch_assoc("SELECT\r\n\t\t\t\tdata_input_fields.type_code,\r\n\t\t\t\tdata_input_data.value\r\n\t\t\t\tFROM data_input_fields\r\n\t\t\t\tLEFT JOIN data_input_data\r\n\t\t\t\tON (data_input_fields.id=data_input_data.data_input_field_id and data_input_data.data_template_data_id={$data_template_id})\r\n\t\t\t\tWHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname'))\r\n\t\t\t\tAND data_template_data_id={$data_template_id}\r\n\t\t\t\tAND data_input_data.value != ''"), "type_code", "value"); if (sizeof($host_fields)) { if (sizeof($data_template_fields)) { foreach ($data_template_fields as $key => $value) { if (!isset($host_fields[$key])) { $host_fields[$key] = $value; } } } } elseif (sizeof($data_template_fields)) { $host_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["host_id"], $host_fields, $local_data_id, $data_input["rrd_step"], 0, get_data_source_item_name($data_template_rrd_id), 1, isset($host_fields["snmp_oid"]) ? $host_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 host override fields */ $data_template_id = db_fetch_cell("SELECT data_template_id FROM data_template_data WHERE local_data_id={$local_data_id}"); /* get host fields first */ $host_fields = array_rekey(db_fetch_assoc("SELECT\r\n\t\t\t\tdata_input_fields.type_code,\r\n\t\t\t\tdata_input_data.value\r\n\t\t\t\tFROM data_input_fields\r\n\t\t\t\tLEFT JOIN data_input_data\r\n\t\t\t\tON (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"] . ")\r\n\t\t\t\tWHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname'))\r\n\t\t\t\tAND data_input_data.value != ''"), "type_code", "value"); $data_template_fields = array_rekey(db_fetch_assoc("SELECT\r\n\t\t\t\tdata_input_fields.type_code,\r\n\t\t\t\tdata_input_data.value\r\n\t\t\t\tFROM data_input_fields\r\n\t\t\t\tLEFT JOIN data_input_data\r\n\t\t\t\tON (data_input_fields.id=data_input_data.data_input_field_id and data_input_data.data_template_data_id={$data_template_id})\r\n\t\t\t\tWHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname'))\r\n\t\t\t\tAND data_template_data_id={$data_template_id}\r\n\t\t\t\tAND data_input_data.value != ''"), "type_code", "value"); if (sizeof($host_fields)) { if (sizeof($data_template_fields)) { foreach ($data_template_fields as $key => $value) { if (!isset($host_fields[$key])) { $host_fields[$key] = $value; } } } } elseif (sizeof($data_template_fields)) { $host_fields = $data_template_fields; } if (sizeof($outputs) > 0) { foreach ($outputs as $output) { if (isset($snmp_queries["fields"][$output["snmp_field_name"]]["oid"])) { $oid = $snmp_queries["fields"][$output["snmp_field_name"]]["oid"] . "." . $data_source["snmp_index"]; 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["host_id"], $host_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 host override fields */ $data_template_id = db_fetch_cell("SELECT data_template_id FROM data_template_data WHERE local_data_id={$local_data_id}"); /* get host fields first */ $host_fields = array_rekey(db_fetch_assoc("SELECT\r\n\t\t\t\tdata_input_fields.type_code,\r\n\t\t\t\tdata_input_data.value\r\n\t\t\t\tFROM data_input_fields\r\n\t\t\t\tLEFT JOIN data_input_data\r\n\t\t\t\tON (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"] . ")\r\n\t\t\t\tWHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname'))\r\n\t\t\t\tAND data_input_data.value != ''"), "type_code", "value"); $data_template_fields = array_rekey(db_fetch_assoc("SELECT\r\n\t\t\t\tdata_input_fields.type_code,\r\n\t\t\t\tdata_input_data.value\r\n\t\t\t\tFROM data_input_fields\r\n\t\t\t\tLEFT JOIN data_input_data\r\n\t\t\t\tON (data_input_fields.id=data_input_data.data_input_field_id and data_input_data.data_template_data_id={$data_template_id})\r\n\t\t\t\tWHERE ((type_code LIKE 'snmp_%') OR (type_code='hostname'))\r\n\t\t\t\tAND data_template_data_id={$data_template_id}\r\n\t\t\t\tAND data_input_data.value != ''"), "type_code", "value"); if (sizeof($host_fields)) { if (sizeof($data_template_fields)) { foreach ($data_template_fields as $key => $value) { if (!isset($host_fields[$key])) { $host_fields[$key] = $value; } } } } elseif (sizeof($data_template_fields)) { $host_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["host_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["host_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["host_id"]); } } } if (isset($script_path)) { $poller_items[] = api_poller_cache_item_add($data_source["host_id"], $host_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; } }
function rrdtool_function_tune($rrd_tune_array) { require(CACTI_BASE_PATH . "/include/global_arrays.php"); require_once(CACTI_BASE_PATH . "/lib/data_source/data_source_info.php"); $data_source_name = get_data_source_item_name($rrd_tune_array["data_source_id"]); $data_source_type = $data_source_types{$rrd_tune_array["data-source-type"]}; $data_source_path = api_data_source_path_get($rrd_tune_array["data_source_id"], true); if ($rrd_tune_array["heartbeat"] != "") { $rrd_tune .= " --heartbeat $data_source_name:" . $rrd_tune_array["heartbeat"]; } if ($rrd_tune_array["minimum"] != "") { $rrd_tune .= " --minimum $data_source_name:" . $rrd_tune_array["minimum"]; } if ($rrd_tune_array["maximum"] != "") { $rrd_tune .= " --maximum $data_source_name:" . $rrd_tune_array["maximum"]; } if ($rrd_tune_array["data-source-type"] != "") { $rrd_tune .= " --data-source-type $data_source_name:" . $data_source_type; } if ($rrd_tune_array["data-source-rename"] != "") { $rrd_tune .= " --data-source-rename $data_source_name:" . $rrd_tune_array["data-source-rename"]; } if ($rrd_tune != "") { if (file_exists($data_source_path) == true) { $fp = popen(read_config_option("path_rrdtool") . " tune $data_source_path $rrd_tune", "r"); pclose($fp); log_save("RRD_TUNE: " . addslashes(read_config_option("path_rrdtool")) . " tune $data_source_path $rrd_tune", SEV_DEBUG, FACIL_POLLER); } } }
function rrd_repair($data_source_id) { global $config, $rrd_tune_array; require(CACTI_BASE_PATH . "/include/data_source/data_source_arrays.php"); $data_source_name = get_data_source_item_name($rrd_tune_array["data_source_id"]); $data_source_type = $data_source_types{$rrd_tune_array["data-source-type"]}; $data_source_path = get_data_source_path($rrd_tune_array["data_source_id"], true); }