function graphs() { global $colors; /* use the first host in the list as the default */ if (!isset($_SESSION["sess_graphs_new_host_id"]) && empty($_REQUEST["host_id"])) { $_REQUEST["host_id"] = db_fetch_cell("select id from host order by description,hostname limit 1"); } /* remember these search fields in session vars so we don't have to keep passing them around */ if (isset($_REQUEST["host_id"])) { $_SESSION["sess_graphs_new_host_id"] = $_REQUEST["host_id"]; } else { $_REQUEST["host_id"] = $_SESSION["sess_graphs_new_host_id"]; } $host = db_fetch_row("select id,description,hostname,host_template_id from host where id=" . $_REQUEST["host_id"]); ?> <table width="98%" align="center"> <form name="form_graph_id"> <tr> <td class="textInfo" colspan="2"> <?php print $host["description"]; ?> (<?php print $host["hostname"]; ?> ) </td> <td align="right" class="textInfo" style="color: #aaaaaa;"> <?php if (!empty($host["host_template_id"])) { print db_fetch_cell("select name from host_template where id=" . $host["host_template_id"]); } ?> </td> </tr> <tr> <td> </td> </tr> <tr> <td class="textArea" style="padding: 3px;" width="300" nowrap> <?php echo _("Create new graphs for the following host:"); ?> </td> <td class="textInfo" rowspan="2" valign="top"> <span style="color: #c16921;">*</span><a href="devices.php?action=edit&id=<?php print $_REQUEST["host_id"]; ?> "><?php echo _("Edit this Host"); ?> </a><br> <span style="color: #c16921;">*</span><a href="devices.php?action=edit"><?php echo _("Create New Host"); ?> </a> </td> </tr> <td> <select name="cbo_graph_id" onChange="window.location=document.form_graph_id.cbo_graph_id.options[document.form_graph_id.cbo_graph_id.selectedIndex].value"> <?php $hosts = db_fetch_assoc("select id,CONCAT_WS('',description,' (',hostname,')') as name from host order by description,hostname"); if (sizeof($hosts) > 0) { foreach ($hosts as $item) { print "<option value='graphs_new.php?host_id=" . $item["id"] . "'"; if ($_REQUEST["host_id"] == $item["id"]) { print " selected"; } print ">" . $item["name"] . "</option>\n"; } } ?> </select> </td> </tr> </form> </table> <br> <form name="chk" method="post" action="graphs_new.php"> <?php $total_rows = sizeof(db_fetch_assoc("select graph_template_id from host_graph where host_id=" . $_REQUEST["host_id"])); /* we give users the option to turn off the javascript features for data queries with lots of rows */ if (read_config_option("max_data_query_javascript_rows") >= $total_rows) { $use_javascript = true; } else { $use_javascript = false; } /* ==================== Box: Graph Templates ==================== */ html_start_box("<strong>" . _("Graph Templates") . "</strong>", "98%", $colors["header_background"], "3", "center", ""); print "\t<tr bgcolor='#" . $colors["header_panel"] . "'>\n\t\t\t<td class='textSubHeaderDark'>" . _("Name") . "</td>\n\t\t\t<td width='1%' align='center' bgcolor='#819bc0' style='" . get_checkbox_style() . "'><input type='checkbox' style='margin: 0px;' name='all_cg' title='" . _("Select All") . "' onClick='SelectAll(\"cg\",this.checked);gt_update_selection_indicators();'></td>\n\n\t\t</tr>\n"; $ht_graph_templates = db_fetch_assoc("select\n\t\tgraph_template.id,\n\t\tgraph_template.template_name\n\t\tfrom host_graph,graph_template\n\t\twhere host_graph.graph_template_id=graph_template.id\n\t\tand host_graph.host_id = " . $_REQUEST["host_id"] . "\n\t\torder by graph_template.template_name"); $ht_created_graph_templates = db_fetch_assoc("select\n\t\tgraph.graph_template_id\n\t\tfrom graph,host_graph\n\t\twhere graph.graph_template_id=host_graph.graph_template_id\n\t\tand graph.host_id = " . $host["id"] . "\n\t\tgroup by graph.graph_template_id"); print "<script type='text/javascript'>\nvar gt_created_graphs = new Array()\n</script>\n"; if (sizeof($ht_created_graph_templates) > 0 && $use_javascript == true) { print "<script type='text/javascript'>\n<!--\n"; print "var gt_created_graphs = new Array("; $cg_ctr = 0; foreach ($ht_created_graph_templates as $item) { print ($cg_ctr > 0 ? "," : "") . "'" . $item["graph_template_id"] . "'"; $cg_ctr++; } print ")\n"; print "//-->\n</script>\n"; } /* create a row for each graph template associated with the host template */ $i = 0; if (sizeof($ht_graph_templates) > 0) { foreach ($ht_graph_templates as $item) { $query_row = $item["id"]; print "<tr id='gt_line{$query_row}' bgcolor='#" . ($i % 2 == 0 ? $colors["form_alternate1"] : $colors["form_alternate2"]) . "'>"; $i++; print "\t\t<td" . ($use_javascript == true ? " onClick='gt_select_line(" . $item["id"] . ");'" : "") . "><span id='gt_text{$query_row}" . "_0'>\n\t\t\t\t\t\t<span id='gt_text{$query_row}" . "_0'><strong>" . _("Create:") . "</strong> " . $item["template_name"] . "</span>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td align='right'>\n\t\t\t\t\t\t<input type='checkbox' name='cg_{$query_row}' id='cg_{$query_row}'" . ($use_javascript == true ? " onClick='gt_update_selection_indicators();'" : "") . ">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>"; } } else { print "<tr><td bgcolor='#" . $colors["form_alternate1"] . "' colspan=7><em>" . _("No graph templates specified for this host template.") . "</em></td></tr>"; } if ($use_javascript == true) { print "<script type='text/javascript'>gt_update_deps(1);</script>\n"; } $available_graph_templates = db_fetch_assoc("SELECT\n\t\tgraph_template.id,\n\t\tgraph_template.template_name as name\n\t\tFROM snmp_query_graph RIGHT JOIN graph_template\n\t\tON (snmp_query_graph.graph_template_id = graph_template.id)\n\t\tWHERE (((snmp_query_graph.name) Is Null))\n\t\tORDER BY graph_template.template_name"); /* create a row at the bottom that lets the user create any graph they choose */ print "\t<tr bgcolor='#" . ($i % 2 == 0 ? $colors["form_alternate1"] : $colors["form_alternate2"]) . "'>\n\t\t\t<td colspan='2' width='60' nowrap>\n\t\t\t\t<strong>Create:</strong> "; form_dropdown("cg_g", $available_graph_templates, "name", "id", "", "(" . _("Select a graph type to create") . ")", "", "font-size: 10px;"); print "\t\t</td>\n\t\t</tr>"; html_end_box(); /* get a list of all data queries that are assigned to this device */ $data_queries = api_data_query_device_assigned_list($host["id"]); echo "<script type='text/javascript'>\nvar created_graphs = new Array()\n</script>\n"; if (sizeof($data_queries) > 0) { foreach ($data_queries as $data_query) { /* we give users the option to turn off the javascript features for data queries with lots of rows */ if (read_config_option("max_data_query_javascript_rows") >= api_data_query_cache_num_rows_get($data_query["id"], $host["id"])) { $use_javascript = true; } else { $use_javascript = false; } /* get a list of all graph templates that reference this data query */ $attached_graph_templates = api_data_query_attached_graphs_list($data_query["id"]); /* build a javascript array that keeps tracks of which graphs have already been created */ if (sizeof($attached_graph_templates) > 0 && $use_javascript == true) { echo "<script type='text/javascript'>\n<!--\n"; foreach ($attached_graph_templates as $graph_template) { /* get a list of all data query indexes that have been created as graphs using this graph template */ $created_graphs = api_data_query_graphed_indexes_list($graph_template["id"], $host["id"]); echo "created_graphs[" . $graph_template["id"] . "] = new Array("; $cg_ctr = 0; if (sizeof($created_graphs) > 0) { foreach ($created_graphs as $created_graph) { echo ($cg_ctr > 0 ? "," : "") . "'" . encode_data_query_index($created_graph["data_query_index"]) . "'"; $cg_ctr++; } } echo ")\n"; } echo "//-->\n</script>\n"; } $data_query_indexes = array(); $data_query_field_names = array(); $data_query_field_desc = array(); $num_visible_columns = 0; $data_query_fields = api_data_query_field_list($data_query["id"], DATA_QUERY_FIELD_TYPE_INPUT); /* retrieve a list of values for each data query field from the cache */ if (sizeof($data_query_fields) > 0) { foreach ($data_query_fields as $field) { $cache_data = api_data_query_cache_field_get($data_query["id"], $host["id"], $field["name"]); /* be sure to ignore the fields which contain no data */ if (sizeof($cache_data) > 0) { foreach ($cache_data as $row) { $data_query_data[$row["index_value"]][$field["name"]] = $row["field_value"]; if (!in_array($row["index_value"], $data_query_indexes, true)) { $data_query_indexes[] = $row["index_value"]; } } /* always make sure that the index field is the first column */ if ($data_query["index_field_id"] == $field["id"] && sizeof($data_query_field_names) > 0) { $data_query_field_names[] = $data_query_field_names[0]; $data_query_field_names[0] = $field["name"]; } else { $data_query_field_names[] = $field["name"]; } /* keep a hash of field name->desc mappings for the row headings */ $data_query_field_desc[$field["name"]] = $field["name_desc"]; $num_visible_columns++; } } } /* if the user specified a prefered sort order; sort the list of indexes before displaying them */ if ($data_query["index_order_type"] == DATA_QUERY_INDEX_SORT_TYPE_ALPHABETIC) { usort($data_query_indexes, "usort_alphabetic"); } else { if ($data_query["index_order_type"] == DATA_QUERY_INDEX_SORT_TYPE_NATURAL) { usort($data_query_indexes, "usort_natural"); } else { if ($data_query["index_order_type"] == DATA_QUERY_INDEX_SORT_TYPE_NUMERIC) { usort($data_query_indexes, "usort_numeric"); } } } ?> <table width='98%' style='background-color: #<?php echo $colors["form_alternate2"]; ?> ; border: 1px solid #<?php echo $colors["header_background"]; ?> ;' align='center' cellpadding='3' cellspacing='0'> <tr> <td bgcolor='#<?php echo $colors["header_background"]; ?> ' colspan='<?php echo sizeof($data_query_field_names) + 1; ?> '> <table cellspacing='0' cellpadding='0' width='100%' > <tr> <td class='textHeaderDark'> <strong><?php echo _("Data Query"); ?> </strong> [<?php echo $data_query["name"]; ?> ] </td> <td align='right' nowrap> <a href='graphs_new.php?action=query_reload&id=<?php echo $data_query["id"]; ?> &host_id=<?php echo $host["id"]; ?> '><img src='<?php echo html_get_theme_images_path("reload_icon_small.gif"); ?> ' alt='<?php echo _("Reload Associated Query"); ?> ' border='0' align='absmiddle'></a> </td> </tr> </table> </td> </tr> <?php if (sizeof($attached_graph_templates) == 0) { echo "<tr bgcolor='#" . $colors["form_alternate1"] . "'><td>" . _("This data query is not being used by any graph templates. You must create at least one graph template that references to a data template using this data query.") . "</td></tr>\n"; } else { if (sizeof($data_query_field_names) == 0) { echo "<tr bgcolor='#" . $colors["form_alternate1"] . "'><td>" . _("This data query returned 0 rows, perhaps there was a problem executing this data query. You can") . " <a href='devices.php?action=query_verbose&id=" . $data_query["id"] . "&host_id=" . $host["id"] . "'>" . _("run this data query in debug mode</a> to get more information.") . "</td></tr>\n"; } else { echo "<tr bgcolor='#" . $colors["header_panel_background"] . "'>\n"; foreach ($data_query_field_names as $field_name) { echo "<td height='1'><strong><font color='#" . $colors["header_text"] . "'>" . $data_query_field_desc[$field_name] . "</font></strong></td>\n"; } echo "<td width='1%' align='center' bgcolor='#" . $colors["header_panel_background"] . "' style='" . get_checkbox_style() . "'><input type='checkbox' style='margin: 0px;' name='all_" . $data_query["id"] . "' title='Select All' onClick='" . _("SelectAll") . "(\"sg_" . $data_query["id"] . "\",this.checked);" . ($use_javascript == true ? "dq_update_selection_indicators();" : "") . "'></td>\n</tr>\n"; } } $row_counter = 0; foreach ($data_query_indexes as $index_value) { $query_row = $data_query["id"] . "_" . encode_data_query_index($index_value); echo "<tr id='line{$query_row}' bgcolor='#" . ($row_counter % 2 == 0 ? $colors["form_alternate1"] : $colors["form_alternate2"]) . "'>"; $i++; $column_counter = 0; foreach ($data_query_field_names as $field_name) { echo "<td " . ($use_javascript == true ? "onClick='dq_select_line(" . $data_query["id"] . ",\"" . encode_data_query_index($index_value) . "\");'" : "") . "><span id='text{$query_row}" . "_" . $column_counter . "'>" . (isset($data_query_data[$index_value][$field_name]) ? $data_query_data[$index_value][$field_name] : "") . "</span></td>"; $column_counter++; } echo "<td align='right'>"; echo "<input type='checkbox' name='sg_{$query_row}' id='sg_{$query_row}' " . ($use_javascript == true ? "onClick='dq_update_selection_indicators();'" : "") . ">"; echo "</td>"; echo "</tr>\n"; $row_counter++; } echo "</table>"; if (sizeof($attached_graph_templates) == 1) { form_hidden_box("sgg_" . $data_query["id"] . "' id='sgg_" . $data_query["id"], $attached_graph_templates[0]["id"], ""); } elseif (sizeof($attached_graph_templates) > 1) { print "\t<table align='center' width='98%'>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td width='1' valign='top'>\n\t\t\t\t\t\t\t\t<img src='" . html_get_theme_images_path("arrow.gif") . "' alt='' align='absmiddle'> \n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td align='right'>\n\t\t\t\t\t\t\t\t<span style='font-size: 12px; font-style: italic;'>" . _("Select a graph type:") . "</span> \n\t\t\t\t\t\t\t\t<select name='sgg_" . $data_query["id"] . "' id='sgg_" . $data_query["id"] . "' " . ($use_javascript == true ? "onChange='dq_update_deps(" . $data_query["id"] . "," . $num_visible_columns . ");'" : "") . ">\n\t\t\t\t\t\t\t\t\t"; html_create_list($attached_graph_templates, "template_name", "id", "0"); print "\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</table>"; } print "<br>"; if ($use_javascript == true) { print "<script type='text/javascript'>dq_update_deps(" . $data_query["id"] . "," . $num_visible_columns . ");</script>\n"; } } } form_hidden_box("save_component_graph", "1", ""); form_hidden_box("host_id", $host["id"], "0"); form_save_button("graphs_new.php"); print "<script type='text/javascript'>dq_update_selection_indicators();</script>\n"; print "<script type='text/javascript'>gt_update_selection_indicators();</script>\n"; }
function update_reindex_cache($host_id, $data_query_id) { require_once(CACTI_BASE_PATH . "/lib/sys/snmp.php"); require_once(CACTI_BASE_PATH . "/include/data_query/data_query_constants.php"); require_once(CACTI_BASE_PATH . "/lib/device/device_info.php"); require_once(CACTI_BASE_PATH . "/lib/data_query/data_query_info.php"); /* will be used to keep track of sql statements to execute later on */ $recache_stack = array(); /* get information about the host */ $host = api_device_get($host_id); /* get information about the host->data query assignment */ $host_data_query = api_device_data_query_get($host_id, $data_query_id); /* get information about the data query */ $data_query = api_data_query_get($data_query_id); switch ($host_data_query["reindex_method"]) { case DATA_QUERY_AUTOINDEX_NONE: break; case DATA_QUERY_AUTOINDEX_BACKWARDS_UPTIME: /* the uptime backwards method requires snmp, so make sure snmp is actually enabled * on this device first */ if ($host["snmp_community"] != "") { $assert_value = cacti_snmp_get($host["hostname"], $host["snmp_community"], ".1.3.6.1.2.1.1.3.0", $host["snmp_version"], $host["snmpv3_auth_username"], $host["snmpv3_auth_password"], $host["snmpv3_auth_protocol"], $host["snmpv3_priv_passphrase"], $host["snmpv3_priv_protocol"], $host["snmp_port"], $host["snmp_timeout"], SNMP_POLLER); array_push($recache_stack, "insert into poller_reindex (host_id,data_query_id,action,op,assert_value,arg1) values (" . sql_sanitize($host_id) . "," . sql_sanitize($data_query_id) . ",0,'<','" . sql_sanitize($assert_value) . "','.1.3.6.1.2.1.1.3.0')"); } break; case DATA_QUERY_AUTOINDEX_INDEX_NUM_CHANGE: /* this method requires that some command/oid can be used to determine the * current number of indexes in the data query */ $assert_value = api_data_query_cache_num_rows_get($data_query_id, $host_id); if ($data_query_type == DATA_QUERY_INPUT_TYPE_SNMP_QUERY) { if ($data_query["snmp_oid_num_rows"] != "") { array_push($recache_stack, "insert into poller_reindex (host_id,data_query_id,action,op,assert_value,arg1) values (" . sql_sanitize($host_id) . "," . sql_sanitize($data_query_id) . ",0,'=','" . sql_sanitize($assert_value) . "','" . sql_sanitize($data_query["snmp_oid_num_rows"]) . "')"); } }else if ($data_query_type == DATA_QUERY_INPUT_TYPE_SCRIPT_QUERY) { array_push($recache_stack, "insert into poller_reindex (host_id,data_query_id,action,op,assert_value,arg1) values (" . sql_sanitize($host_id) . "," . sql_sanitize($data_query_id) . ",1,'=','" . sql_sanitize($assert_value) . "','" . sql_sanitize(api_data_query_script_path_format($data_query_xml["script_path"]) . DATA_QUERY_SCRIPT_ARG_NUM_INDEXES) . "')"); } break; case DATA_QUERY_AUTOINDEX_FIELD_VERIFICATION: $primary_indexes = api_data_query_cache_field_get($data_query_id, $host_id, $data_query["sort_field"]); if (sizeof($primary_indexes) > 0) { foreach ($primary_indexes as $index) { $assert_value = $index["field_value"]; if ($data_query_type == DATA_QUERY_INPUT_TYPE_SNMP_QUERY) { array_push($recache_stack, "insert into poller_reindex (host_id,data_query_id,action,op,assert_value,arg1) values (" . sql_sanitize($host_id) . "," . sql_sanitize($data_query_id) . ",0,'=','" . sql_sanitize($assert_value) . "','" . sql_sanitize($index["oid"]) . "')"); }else if ($data_query_type == DATA_QUERY_INPUT_TYPE_SCRIPT_QUERY) { array_push($recache_stack, "insert into poller_reindex (host_id,data_query_id,action,op,assert_value,arg1) values (" . sql_sanitize($host_id) . "," . sql_sanitize($data_query_id) . ",1,'=','" . sql_sanitize($assert_value) . "','" . sql_sanitize(api_data_query_script_path_format($data_query_xml["script_path"]) . DATA_QUERY_SCRIPT_ARG_GET . " " . $data_query_xml["fields"]{$data_query["sort_field"]}["query_name"] . " " . $index["snmp_index"]) . "')"); } } } break; } /* save the delete for last since we need to reference this table in the code above */ db_execute("delete from poller_reindex where host_id=$host_id and data_query_id=$data_query_id"); for ($i=0; $i<count($recache_stack); $i++) { db_execute($recache_stack[$i]); } }