diff -Naur cacti-0.8.7g-old/auth_changepassword.php cacti-0.8.7g/auth_changepassword.php --- cacti-0.8.7g-old/auth_changepassword.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/auth_changepassword.php 2010-07-09 18:34:11.000000000 -0400 @@ -59,6 +59,8 @@ header("Location: index.php"); break; case '3': /* default graph page */ header("Location: graph_view.php"); break; + default: + api_plugin_hook_function('login_options_navigate', $user['login_opts']); } }else{ header("Location: graph_view.php"); diff -Naur cacti-0.8.7g-old/auth_login.php cacti-0.8.7g/auth_login.php --- cacti-0.8.7g-old/auth_login.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/auth_login.php 2010-07-09 18:34:11.000000000 -0400 @@ -124,10 +124,12 @@ } default: - /* Builtin Auth */ - if ((!$user_auth) && (!$ldap_error)) { - /* if auth has not occured process for builtin - AKA Ldap fall through */ - $user = db_fetch_row("SELECT * FROM user_auth WHERE username = '" . $username . "' AND password = '" . md5(get_request_var_post("login_password")) . "' AND realm = 0"); + if (!api_plugin_hook_function('login_process', false)) { + /* Builtin Auth */ + if ((!$user_auth) && (!$ldap_error)) { + /* if auth has not occured process for builtin - AKA Ldap fall through */ + $user = db_fetch_row("SELECT * FROM user_auth WHERE username = '" . $username . "' AND password = '" . md5(get_request_var_post("login_password")) . "' AND realm = 0"); + } } } /* end of switch */ @@ -189,29 +191,42 @@ decide what to do next */ switch ($user["login_opts"]) { case '1': /* referer */ - if (sizeof(db_fetch_assoc("SELECT realm_id FROM user_auth_realm WHERE realm_id = 8 AND user_id = " . $_SESSION["sess_user_id"])) == 0) { - header("Location: graph_view.php"); - }else{ - if (isset($_SERVER["HTTP_REFERER"])) { - $referer = $_SERVER["HTTP_REFERER"]; - if (basename($referer) == "logout.php") { - $referer = "index.php"; - } - } else if (isset($_SERVER["REQUEST_URI"])) { - $referer = $_SERVER["REQUEST_URI"]; - if (basename($referer) == "logout.php") { - $referer = "index.php"; - } - } else { - $referer = "index.php"; + /* because we use plugins, we can't redirect back to graph_view.php if they don't + * have console access + */ + if (isset($_SERVER["HTTP_REFERER"])) { + $referer = $_SERVER["HTTP_REFERER"]; + if (basename($referer) == "logout.php") { + $referer = $config['url_path'] . "index.php"; + } + } else if (isset($_SERVER["REQUEST_URI"])) { + $referer = $_SERVER["REQUEST_URI"]; + if (basename($referer) == "logout.php") { + $referer = $config['url_path'] . "index.php"; } + } else { + $referer = $config['url_path'] . "index.php"; + } + + if (substr_count($referer, "plugins")) { header("Location: " . $referer); + } elseif (sizeof(db_fetch_assoc("SELECT realm_id FROM user_auth_realm WHERE realm_id = 8 AND user_id = " . $_SESSION["sess_user_id"])) == 0) { + header("Location: graph_view.php"); + } else { + header("Location: $referer"); } + break; case '2': /* default console page */ - header("Location: index.php"); break; + header("Location: " . $config['url_path'] . "index.php"); + + break; case '3': /* default graph page */ - header("Location: graph_view.php"); break; + header("Location: " . $config['url_path'] . "graph_view.php"); + + break; + default: + api_plugin_hook_function('login_options_navigate', $user['login_opts']); } exit; }else{ @@ -264,9 +279,17 @@
"> + - + + if (read_config_option("auth_method") == "3" || api_plugin_hook_function('login_realms_exist')) { + $realms = api_plugin_hook_function('login_realms', array("local" => array("name" => "Local", "selected" => false), "ldap" => array("name" => "LDAP", "selected" => true))); + ?> - +
Realm: - $realm) { + print "\t\t\t\t\t\n"; + } + } + ?>
+
diff -Naur cacti-0.8.7g-old/data_sources.php cacti-0.8.7g/data_sources.php --- cacti-0.8.7g-old/data_sources.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/data_sources.php 2010-07-09 18:34:11.000000000 -0400 @@ -44,6 +44,8 @@ 7 => "Disable" ); +$ds_actions = api_plugin_hook_function('data_source_action_array', $ds_actions); + /* set default action */ if (!isset($_REQUEST["action"])) { $_REQUEST["action"] = ""; } @@ -402,6 +404,8 @@ api_reapply_suggested_data_source_title($selected_items[$i]); update_data_source_title_cache($selected_items[$i]); } + } else { + api_plugin_hook_function('data_source_action_execute', $_POST['drp_action']); } header("Location: data_sources.php"); exit; @@ -545,6 +549,12 @@ \n "; $save_html = " "; + }else{ + $save['drp_action'] = $_POST['drp_action']; + $save['ds_list'] = $ds_list; + $save['ds_array'] = (isset($ds_array)? $ds_array : array()); + api_plugin_hook_function('data_source_action_prepare', $save); + $save_html = " "; } }else{ print "You must select at least one data source.\n"; @@ -683,6 +693,8 @@ input_validate_input_number(get_request_var("host_id")); /* ==================================================== */ + api_plugin_hook('data_source_edit_top'); + $use_data_template = true; $host_id = 0; @@ -975,8 +987,9 @@ form_save_button("data_sources.php"); - include_once("./include/bottom_footer.php"); + api_plugin_hook('data_source_edit_bottom'); + include_once("./include/bottom_footer.php"); } function get_poller_interval($seconds) { @@ -1310,6 +1323,7 @@ $i = 0; if (sizeof($data_sources) > 0) { foreach ($data_sources as $data_source) { + $data_source = api_plugin_hook_function('data_sources_table', $data_source); $data_template_name = ((empty($data_source["data_template_name"])) ? "None" : $data_source["data_template_name"]); $data_input_name = ((empty($data_source["data_input_name"])) ? "External" : $data_source["data_input_name"]); $poller_interval = ((isset($poller_intervals[$data_source["local_data_id"]])) ? $poller_intervals[$data_source["local_data_id"]] : 0); diff -Naur cacti-0.8.7g-old/graph_image.php cacti-0.8.7g/graph_image.php --- cacti-0.8.7g-old/graph_image.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/graph_image.php 2010-07-09 18:34:11.000000000 -0400 @@ -44,6 +44,8 @@ /* flush the headers now */ ob_end_clean(); +api_plugin_hook_function('graph_image'); + session_write_close(); $graph_data_array = array(); diff -Naur cacti-0.8.7g-old/graph.php cacti-0.8.7g/graph.php --- cacti-0.8.7g-old/graph.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/graph.php 2010-07-09 18:34:11.000000000 -0400 @@ -32,6 +32,8 @@ include_once("./lib/html_tree.php"); include_once("./include/top_graph_header.php"); +api_plugin_hook_function('graph'); + /* ================= input validation ================= */ input_validate_input_regex(get_request_var("rra_id"), "^([0-9]+|all)$"); input_validate_input_number(get_request_var("local_graph_id")); @@ -94,17 +96,18 @@
- <?php print htmlspecialchars($graph_title);?> + <?php print htmlspecialchars($graph_title);?> Zoom Graph
CSV Export
Graph Source/Properties + 'view', 'local_graph_id' => $_GET['local_graph_id'], 'rra' => $rra['id'], 'view_type' => $_REQUEST['view_type'])); ?>
- +
@@ -215,6 +218,7 @@ Graph Source/Properties CSV Export
+ 'zoom', 'local_graph_id' => $_GET['local_graph_id'], 'rra' => $_GET['rra_id'], 'view_type' => $_REQUEST['view_type'])); ?> @@ -247,6 +251,7 @@ Zoom Graph
CSV Export
+ 'properties', 'local_graph_id' => $_GET['local_graph_id'], 'rra' => $_GET['rra_id'], 'view_type' => $_REQUEST['view_type'])); ?> diff -Naur cacti-0.8.7g-old/graphs_new.php cacti-0.8.7g/graphs_new.php --- cacti-0.8.7g-old/graphs_new.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/graphs_new.php 2010-07-09 18:34:11.000000000 -0400 @@ -511,7 +511,8 @@ *">Edit this Host
- *">Create New Host + *">Create New Host
+ diff -Naur cacti-0.8.7g-old/graphs.php cacti-0.8.7g/graphs.php --- cacti-0.8.7g-old/graphs.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/graphs.php 2010-07-09 18:34:11.000000000 -0400 @@ -45,6 +45,8 @@ 4 => "Convert to Graph Template" ); +$graph_actions = api_plugin_hook_function('graphs_action_array', $graph_actions); + /* set default action */ if (!isset($_REQUEST["action"])) { $_REQUEST["action"] = ""; } @@ -362,6 +364,8 @@ api_resize_graphs($selected_items[$i], $_POST["graph_width"], $_POST["graph_height"]); } + } else { + api_plugin_hook_function('graphs_action_execute', $_POST['drp_action']); } header("Location: graphs.php"); @@ -514,6 +518,12 @@ "; $save_html = " "; + } else { + $save['drp_action'] = $_POST['drp_action']; + $save['graph_list'] = $graph_list; + $save['graph_array'] = (isset($graph_array) ? $graph_array : array()); + api_plugin_hook_function('graphs_action_prepare', $save); + $save_html = " "; } }else{ print "You must select at least one graph.\n"; diff -Naur cacti-0.8.7g-old/host.php cacti-0.8.7g/host.php --- cacti-0.8.7g-old/host.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/host.php 2010-07-09 18:34:11.000000000 -0400 @@ -44,6 +44,8 @@ 6 => "Change Availability Options" ); +$device_actions = api_plugin_hook_function('device_action_array', $device_actions); + /* set default action */ if (!isset($_REQUEST["action"])) { $_REQUEST["action"] = ""; } @@ -305,6 +307,8 @@ api_tree_item_save(0, $_POST["tree_id"], TREE_ITEM_TYPE_HOST, $_POST["tree_item_id"], "", 0, read_graph_config_option("default_rra_id"), $selected_items[$i], 1, 1, false); } + } else { + api_plugin_hook_function('device_action_execute', $_POST['drp_action']); } header("Location: host.php"); @@ -450,6 +454,12 @@ \n "; $save_html = " "; + } else { + $save['drp_action'] = $_POST['drp_action']; + $save['host_list'] = $host_list; + $save['host_array'] = (isset($host_array)? $host_array : array()); + api_plugin_hook_function('device_action_prepare', $save); + $save_html = " "; } }else{ print "You must select at least one device.\n"; @@ -532,6 +542,8 @@ input_validate_input_number(get_request_var("id")); /* ==================================================== */ + api_plugin_hook('host_edit_top'); + if (!empty($_GET["id"])) { $host = db_fetch_row("select * from host where id=" . $_GET["id"]); $header_label = "[edit: " . htmlspecialchars($host["description"]) . "]"; @@ -643,6 +655,7 @@ *">Create Graphs for this Host
*">Data Source List
*">Graph List + @@ -1107,6 +1120,8 @@ } form_save_button("host.php", "return"); + + api_plugin_hook('host_edit_bottom'); } function host() { \ No newline at end of file diff -Naur cacti-0.8.7g-old/include/auth.php cacti-0.8.7g/include/auth.php --- cacti-0.8.7g-old/include/auth.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/include/auth.php 2010-07-09 18:34:11.000000000 -0400 @@ -31,6 +31,9 @@ } if (read_config_option("auth_method") != 0) { + /* handle alternate authentication realms */ + api_plugin_hook_function('auth_alternate_realms'); + /* handle change password dialog */ if ((isset($_SESSION['sess_change_password'])) && (read_config_option("webbasic_enabled") != "on")) { header ("Location: auth_changepassword.php?ref=" . (isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "index.php")); @@ -72,9 +75,9 @@ and user_auth_realm.realm_id='$realm_id'")) || (empty($realm_id)))) { if (isset($_SERVER["HTTP_REFERER"])) { - $goBack = "( Return | Login Again )"; + $goBack = "( Return | Login Again )"; }else{ - $goBack = "( Login Again )"; + $goBack = "( Login Again )"; } ?> @@ -83,14 +86,14 @@ Cacti - +

- + diff -Naur cacti-0.8.7g-old/include/bottom_footer.php cacti-0.8.7g/include/bottom_footer.php --- cacti-0.8.7g-old/include/bottom_footer.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/include/bottom_footer.php 2010-07-09 18:34:11.000000000 -0400 @@ -21,6 +21,10 @@ | http://www.cacti.net/ | +-------------------------------------------------------------------------+ */ + +$oper_mode = api_plugin_hook_function('top_header', OPER_MODE_NATIVE); +if (($oper_mode == OPER_MODE_NATIVE) || ($oper_mode == OPER_MODE_IFRAME_NONAV)) { + ?>
@@ -32,6 +36,9 @@ array( "message" => 'Save Successful.', @@ -654,4 +656,10 @@ GDC_SLASH => "/" ); +$plugin_architecture = array( + 'version' => '2.8' + ); + +api_plugin_hook('config_arrays'); + ?> diff -Naur cacti-0.8.7g-old/include/global_constants.php cacti-0.8.7g/include/global_constants.php --- cacti-0.8.7g-old/include/global_constants.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/include/global_constants.php 2010-07-09 18:34:11.000000000 -0400 @@ -173,4 +173,8 @@ define("SNMP_CMDPHP", 1); define("SNMP_WEBUI", 2); -?> +define('OPER_MODE_NATIVE', 0); +define('OPER_MODE_RESKIN', 1); +define('OPER_MODE_IFRAME_NONAV', 2); + +?> \ No newline at end of file diff -Naur cacti-0.8.7g-old/include/global_form.php cacti-0.8.7g/include/global_form.php --- cacti-0.8.7g-old/include/global_form.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/include/global_form.php 2010-07-09 18:34:11.000000000 -0400 @@ -22,8 +22,9 @@ +-------------------------------------------------------------------------+ */ -if (!defined("VALID_HOST_FIELDS")) { - define("VALID_HOST_FIELDS", "(hostname|snmp_community|snmp_username|snmp_password|snmp_auth_protocol|snmp_priv_passphrase|snmp_priv_protocol|snmp_context|snmp_version|snmp_port|snmp_timeout)"); +if (!defined('VALID_HOST_FIELDS')) { + $string = api_plugin_hook_function('valid_host_fields', '(hostname|snmp_community|snmp_username|snmp_password|snmp_auth_protocol|snmp_priv_passphrase|snmp_priv_protocol|snmp_context|snmp_version|snmp_port|snmp_timeout)'); + define('VALID_HOST_FIELDS', $string); } /* file: cdef.php, action: edit */ @@ -1190,4 +1191,7 @@ "dropdown_sql" => "select id,name from snmp_query order by name" ) ); -?> + + +api_plugin_hook('config_form'); + diff -Naur cacti-0.8.7g-old/include/global.php cacti-0.8.7g/include/global.php --- cacti-0.8.7g-old/include/global.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/include/global.php 2010-07-09 18:34:11.000000000 -0400 @@ -93,6 +93,13 @@ /* built-in snmp support */ $config["php_snmp_support"] = function_exists("snmpget"); +/* set URL path */ +if (! isset($url_path)) { + $url_path = ""; +} +$config['url_path'] = $url_path; +define('URL_PATH', $url_path); + /* used for includes */ $config["base_path"] = strtr(ereg_replace("(.*)[\\\/]include", "\\1", dirname(__FILE__)), "\\", "/"); $config["library_path"] = ereg_replace("(.*[\\\/])include", "\\1lib", dirname(__FILE__)); @@ -188,15 +195,17 @@ /* include base modules */ include($config["library_path"] . "/adodb/adodb.inc.php"); include($config["library_path"] . "/database.php"); -include_once($config["library_path"] . "/functions.php"); -include_once($config["include_path"] . "/global_constants.php"); -include_once($config["include_path"] . "/global_arrays.php"); -include_once($config["include_path"] . "/global_settings.php"); /* connect to the database server */ db_connect_real($database_hostname, $database_username, $database_password, $database_default, $database_type, $database_port); /* include additional modules */ +include_once($config["library_path"] . "/functions.php"); +include_once($config["include_path"] . "/global_constants.php"); +include_once($config["library_path"] . "/plugins.php"); +include_once($config["include_path"] . "/plugins.php"); +include_once($config["include_path"] . "/global_arrays.php"); +include_once($config["include_path"] . "/global_settings.php"); include_once($config["include_path"] . "/global_form.php"); include_once($config["library_path"] . "/html.php"); include_once($config["library_path"] . "/html_form.php"); @@ -205,6 +214,8 @@ include_once($config["library_path"] . "/variables.php"); include_once($config["library_path"] . "/auth.php"); +api_plugin_hook("config_insert"); + /* current cacti version */ $config["cacti_version"] = "0.8.7g"; diff -Naur cacti-0.8.7g-old/include/global_settings.php cacti-0.8.7g/include/global_settings.php --- cacti-0.8.7g-old/include/global_settings.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/include/global_settings.php 2010-07-09 18:34:11.000000000 -0400 @@ -1190,4 +1190,6 @@ ) ); +api_plugin_hook('config_settings'); + ?> diff -Naur cacti-0.8.7g-old/include/plugins.php cacti-0.8.7g/include/plugins.php --- cacti-0.8.7g-old/include/plugins.php 1969-12-31 19:00:00.000000000 -0500 +++ cacti-0.8.7g/include/plugins.php 2010-07-09 18:34:11.000000000 -0400 @@ -0,0 +1,38 @@ + - <?php echo draw_navigation_text("title");?> + <?php echo $page_title; ?>\r\n"; }else{ - print "\r\n"; + $refresh = api_plugin_hook_function('top_graph_refresh', htmlspecialchars(read_graph_config_option("page_refresh"),ENT_QUOTES)); + print "\r\n"; } ?> - - - - - - - - + + + + + + + + + - + +> + +> + +
Access Deniedimages/auth_deny.gif' border='0' alt='Access Denied'>
+ @@ -106,7 +123,7 @@ @@ -114,10 +131,10 @@ - - @@ -143,6 +160,8 @@ diff -Naur cacti-0.8.7g-old/include/top_header.php cacti-0.8.7g/include/top_header.php --- cacti-0.8.7g-old/include/top_header.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/include/top_header.php 2010-07-09 18:34:11.000000000 -0400 @@ -22,38 +22,53 @@ +-------------------------------------------------------------------------+ */ -global $colors; +global $colors, $config; + +$oper_mode = api_plugin_hook_function('top_header', OPER_MODE_NATIVE); +if ($oper_mode == OPER_MODE_RESKIN) { + return; +} + +$page_title = api_plugin_hook_function('page_title', draw_navigation_text("title")); + ?> - <?php echo draw_navigation_text("title");?> - - + <?php echo $page_title; ?> + + - + "; - }?> + } + api_plugin_hook('page_head'); ?> - + +> + +> +
- +
-  Console" alt="Graphs" align="absmiddle" border="0">  +  Console" alt="Graphs" align="absmiddle" border="0"> - Settings';}?>  ">.gif" border="0" title="Tree View" alt="Tree View" align="absmiddle">.gif" border="0" title="List View" alt="List View" align="absmiddle">.gif" border="0" title="Preview View" alt="Preview View" align="absmiddle"> 
+ Settings';}?>  ">.gif" border="0" title="Tree View" alt="Tree View" align="absmiddle">">.gif" border="0" title="List View" alt="List View" align="absmiddle">">.gif" border="0" title="Preview View" alt="Preview View" align="absmiddle"> 
@@ -94,7 +111,7 @@
-
+
- Logged in as (Logout)  + Logged in as (Logout
- " style="height:2px;" border="0">
+
+ " style="height:2px;" border="0">
+
+ @@ -65,7 +80,7 @@ @@ -73,10 +88,10 @@ - - @@ -86,9 +101,12 @@
- + +  ConsoleGraphs
-  ConsoleGraphs -
-
+
- Logged in as (Logout)  + Logged in as (Logout
-
+
+
+
-
-

-
+
+

about.php'>

+
- + + + + diff -Naur cacti-0.8.7g-old/index.php cacti-0.8.7g/index.php --- cacti-0.8.7g-old/index.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/index.php 2010-07-09 18:34:11.000000000 -0400 @@ -25,6 +25,8 @@ include("./include/auth.php"); include("./include/top_header.php"); +api_plugin_hook('console_before'); + ?> @@ -46,6 +48,8 @@ diff -Naur cacti-0.8.7g-old/lib/api_device.php cacti-0.8.7g/lib/api_device.php --- cacti-0.8.7g-old/lib/api_device.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/lib/api_device.php 2010-07-09 18:34:11.000000000 -0400 @@ -137,6 +137,8 @@ $save["ping_retries"] = form_input_validate($ping_retries, "ping_retries", "^[0-9]+$", true, 3); $save["max_oids"] = form_input_validate($max_oids, "max_oids", "^[0-9]+$", true, 3); + $save = api_plugin_hook_function('api_device_save', $save); + $host_id = 0; if (!is_error_message()) { diff -Naur cacti-0.8.7g-old/lib/auth.php cacti-0.8.7g/lib/auth.php --- cacti-0.8.7g-old/lib/auth.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/lib/auth.php 2010-07-09 18:34:11.000000000 -0400 @@ -121,8 +121,9 @@ } } - return true; + api_plugin_hook_function('copy_user', array('template_id' => $template_id, 'new_id' => $new_id)); + return true; } @@ -152,6 +153,7 @@ db_execute("delete from settings_graphs where user_id=" . $user_id); db_execute("delete from settings_tree where user_id=" . $user_id); + api_plugin_hook_function('user_remove', $user_id); } /* user_disable - disable a user account diff -Naur cacti-0.8.7g-old/lib/functions.php cacti-0.8.7g/lib/functions.php --- cacti-0.8.7g-old/lib/functions.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/lib/functions.php 2010-07-09 18:34:11.000000000 -0400 @@ -1689,6 +1689,8 @@ @arg $type - (string) Either 'url' or 'title' @returns (string> Either the navigation text or title */ function draw_navigation_text($type = "url") { + global $config; + $nav_level_cache = (isset($_SESSION["sess_nav_level_cache"]) ? $_SESSION["sess_nav_level_cache"] : array()); $nav = array( @@ -1701,8 +1703,8 @@ "graph.php:zoom" => array("title" => "Zoom", "mapping" => "graph_view.php:,?,graph.php:view", "level" => "3"), "graph.php:properties" => array("title" => "Properties", "mapping" => "graph_view.php:,?,graph.php:view", "level" => "3"), "graph_settings.php:" => array("title" => "Settings", "mapping" => "graph_view.php:", "url" => "graph_settings.php", "level" => "1"), - "index.php:" => array("title" => "Console", "mapping" => "", "url" => "index.php", "level" => "0"), - "index.php:login" => array("title" => "Console", "mapping" => "", "url" => "index.php", "level" => "0"), + "index.php:" => array("title" => "Console", "mapping" => "", "url" => $config['url_path'] . "index.php", "level" => "0"), + "index.php:login" => array("title" => "Console", "mapping" => "", "url" => $config['url_path'] . "index.php", "level" => "0"), "graphs.php:" => array("title" => "Graph Management", "mapping" => "index.php:", "url" => "graphs.php", "level" => "1"), "graphs.php:graph_edit" => array("title" => "(Edit)", "mapping" => "index.php:,graphs.php:", "url" => "", "level" => "2"), "graphs.php:graph_diff" => array("title" => "Change Graph Template", "mapping" => "index.php:,graphs.php:,graphs.php:graph_edit", "url" => "", "level" => "3"), @@ -1780,6 +1782,8 @@ "templates_import.php:" => array("title" => "Import Templates", "mapping" => "index.php:", "url" => "templates_import.php", "level" => "1"), ); + $nav = api_plugin_hook_function('draw_navigation_text', $nav); + $current_page = basename($_SERVER["PHP_SELF"]); input_validate_input_regex(get_request_var_request("action"), "^([a-zA-Z0-9_-]+)$"); diff -Naur cacti-0.8.7g-old/lib/html_form.php cacti-0.8.7g/lib/html_form.php --- cacti-0.8.7g-old/lib/html_form.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/lib/html_form.php 2010-07-09 18:34:11.000000000 -0400 @@ -722,11 +722,13 @@ on a confirmation form @arg $cancel_url - the url to go to when the user clicks 'cancel' @arg $action_url - the url to go to when the user clicks 'delete' */ -function form_confirm_buttons($action_url, $cancel_url) { ?> +function form_confirm_buttons($action_url, $cancel_url) { + global $config; + ?>
- - + ")' value='Cancel'> + &confirm=true")' value='Delete'>
-
;"><?php print htmlspecialchars($graph["title_cache"]);?>
+ " . htmlspecialchars($graph["title_cache"]) . "

" : "");?>
- Zoom Graph
- CSV Export
- Graph Source/Properties
- Page Top
+ '>images/graph_zoom.gif' border='0' alt='Zoom Graph' title='Zoom Graph' style='padding: 3px;'>
+ '>images/graph_query.png' border='0' alt='CSV Export' title='CSV Export' style='padding: 3px;'>
+ '>images/graph_properties.gif' border='0' alt='Graph Source/Properties' title='Graph Source/Properties' style='padding: 3px;'>
+ 'graphs_thumbnails', 'local_graph_id' => $graph['local_graph_id'], 'rra' => 0, 'view_type' => 'view')); ?> + images/graph_page_top.gif' border='0' alt='Page Top' title='Page Top' style='padding: 3px;'>
@@ -177,6 +178,7 @@ @arg $extra_url_args - extra arguments to append to the url @arg $header - html to use as a header */ function html_graph_thumbnail_area(&$graph_array, $no_graphs_message = "", $extra_url_args = "", $header = "") { + global $config; $i = 0; $k = 0; $j = 0; $num_graphs = sizeof($graph_array); @@ -268,14 +270,15 @@
-
;"><?php print htmlspecialchars($graph["title_cache"]);?>
+
;">'><?php print htmlspecialchars($graph["title_cache"]);?>
" . htmlspecialchars($graph["title_cache"]) . "

" : "");?>
- Zoom Graph
- CSV Export
- Graph Source/Properties
- Page Top
+ '>images/graph_zoom.gif' border='0' alt='Zoom Graph' title='Zoom Graph' style='padding: 3px;'>
+ '>images/graph_query.png' border='0' alt='CSV Export' title='CSV Export' style='padding: 3px;'>
+ '>images/graph_properties.gif' border='0' alt='Graph Source/Properties' title='Graph Source/Properties' style='padding: 3px;'>
+ 'graphs_thumbnails', 'local_graph_id' => $graph['local_graph_id'], 'rra' => 0, 'view_type' => '')); ?> + ' border='0' alt='Page Top' title='Page Top' style='padding: 3px;'>
@@ -638,9 +641,9 @@ print "" . $item["hex"] . "\n"; if ($disable_controls == false) { - print "Move Down - Move Up\n"; - print "Delete\n"; + print "Move Down + Move Up\n"; + print "Delete\n"; } print ""; @@ -706,6 +709,8 @@ } while (list($item_sub_url, $item_sub_title) = each($item_title)) { + $item_sub_url = $config['url_path'] . $item_sub_url; + /* indent sub-items */ if ($i > 0) { $prepend_string = "--- "; @@ -715,7 +720,7 @@ /* do not put a line between each sub-item */ if (($i == 0) || ($draw_sub_items == false)) { - $background = "images/menu_line.gif"; + $background = $config['url_path'] . "images/menu_line.gif"; }else{ $background = ""; } @@ -744,17 +749,18 @@ }else{ if ($current_realm_id == -1 || (isset($user_realms[$current_realm_id])) || (!isset($user_auth_realm_filenames{basename($item_url)}))) { /* draw normal (non sub-item) menu item */ + $item_url = $config['url_path'] . $item_url; if (basename($_SERVER["PHP_SELF"]) == basename($item_url)) { - print "$item_title\n"; + print "$item_title\n"; }else{ - print "$item_title\n"; + print "$item_title\n"; } } } } } - print "\n"; + print "\n"; print ""; } @@ -764,11 +770,12 @@ @arg $actions_array - an array that contains a list of possible actions. this array should be compatible with the form_dropdown() function */ function draw_actions_dropdown($actions_array) { + global $config; ?>
-   + images/arrow.gif' alt='' align='middle'>  Choose an action: diff -Naur cacti-0.8.7g-old/lib/plugins.php cacti-0.8.7g/lib/plugins.php --- cacti-0.8.7g-old/lib/plugins.php 1969-12-31 19:00:00.000000000 -0500 +++ cacti-0.8.7g/lib/plugins.php 2010-07-09 18:34:11.000000000 -0400 @@ -0,0 +1,476 @@ + $function) { + if (function_exists($function) && !function_exists('plugin_' . $pname . '_install') && !in_array($pname, $p)) { + $function($data); + } + } + } + + /* Variable-length argument lists have a slight problem when */ + /* passing values by reference. Pity. This is a workaround. */ + return $data; +} + +function api_plugin_hook_function ($name, $parm=NULL) { + global $config, $plugin_hooks, $plugins_system; + $ret = $parm; + $p = array(); + $ps_where = ''; + + if (sizeof($plugins_system)) { + foreach($plugins_system as $plugin) { + $ps_where .= (strlen($ps_where) ? "', '":"('") . $plugin; + } + $ps_where .= "')"; + } + + /* order the plugin functions by system first, then followed by order */ + $result = db_fetch_assoc("SELECT 1 AS id, ph.name, ph.file, ph.function + FROM plugin_hooks AS ph + LEFT JOIN plugin_config AS pc + ON pc.directory=ph.name + WHERE ph.status = 1 AND hook = '$name' + AND ph.name IN $ps_where + UNION + SELECT pc.id, ph.name, ph.file, ph.function + FROM plugin_hooks AS ph + LEFT JOIN plugin_config AS pc + ON pc.directory=ph.name + WHERE ph.status = 1 AND hook = '$name' + AND ph.name NOT IN $ps_where + ORDER BY id ASC", true); + + if (count($result)) { + foreach ($result as $hdata) { + $p[] = $hdata['name']; + if (file_exists($config['base_path'] . '/plugins/' . $hdata['name'] . '/' . $hdata['file'])) { + include_once($config['base_path'] . '/plugins/' . $hdata['name'] . '/' . $hdata['file']); + } + $function = $hdata['function']; + if (function_exists($function)) { + $ret = $function($ret); + } + } + } + + if (isset($plugin_hooks[$name]) && is_array($plugin_hooks[$name])) { + foreach ($plugin_hooks[$name] as $pname => $function) { + if (function_exists($function) && !function_exists('plugin_' . $pname . '_install') && !in_array($pname, $p)) { + $ret = $function($ret); + } + } + } + + /* Variable-length argument lists have a slight problem when */ + /* passing values by reference. Pity. This is a workaround. */ + return $ret; +} + +function api_plugin_db_table_create ($plugin, $table, $data) { + global $config, $database_default; + include_once($config["library_path"] . "/database.php"); + + $result = db_fetch_assoc("show tables from `" . $database_default . "`") or die (mysql_error()); + $tables = array(); + foreach($result as $index => $arr) { + foreach ($arr as $t) { + $tables[] = $t; + } + } + if (!in_array($table, $tables)) { + $c = 0; + $sql = 'CREATE TABLE `' . $table . "` (\n"; + foreach ($data['columns'] as $column) { + if (isset($column['name'])) { + if ($c > 0) + $sql .= ",\n"; + $sql .= '`' . $column['name'] . '`'; + if (isset($column['type'])) + $sql .= ' ' . $column['type']; + if (isset($column['unsigned'])) + $sql .= ' unsigned'; + if (isset($column['NULL']) && $column['NULL'] == false) + $sql .= ' NOT NULL'; + if (isset($column['NULL']) && $column['NULL'] == true && !isset($column['default'])) + $sql .= ' default NULL'; + if (isset($column['default'])) + $sql .= ' default ' . (is_numeric($column['default']) ? $column['default'] : "'" . $column['default'] . "'"); + if (isset($column['auto_increment'])) + $sql .= ' auto_increment'; + $c++; + } + } + + if (isset($data['primary'])) { + $sql .= ",\n PRIMARY KEY (`" . $data['primary'] . '`)'; + } + + foreach ($data['keys'] as $key) { + if (isset($key['name'])) { + $sql .= ",\n KEY `" . $key['name'] . '` (`' . $key['columns'] . '`)'; + } + } + $sql .= ') TYPE = ' . $data['type']; + + if (isset($data['comment'])) { + $sql .= " COMMENT = '" . $data['comment'] . "'"; + } + if (db_execute($sql)) { + db_execute("INSERT INTO plugin_db_changes (plugin, `table`, method) VALUES ('$plugin', '$table', 'create')"); + } + } else { + db_execute("INSERT INTO plugin_db_changes (plugin, `table`, method) VALUES ('$plugin', '$table', 'create')"); + } +} + +function api_plugin_db_changes_remove ($plugin) { + // Example: api_plugin_db_changes_remove ('thold'); + + $tables = db_fetch_assoc("SELECT `table` FROM plugin_db_changes WHERE plugin = '$plugin' AND method ='create'", false); + if (count($tables)) { + foreach ($tables as $table) { + db_execute("DROP TABLE IF EXISTS `" . $table['table'] . "`;"); + } + db_execute("DELETE FROM plugin_db_changes where plugin = '$plugin' AND method ='create'", false); + } + $columns = db_fetch_assoc("SELECT `table`, `column` FROM plugin_db_changes WHERE plugin = '$plugin' AND method ='addcolumn'", false); + if (count($columns)) { + foreach ($columns as $column) { + db_execute('ALTER TABLE `' . $column['table'] . '` DROP `' . $column['column'] . '`'); + } + db_execute("DELETE FROM plugin_db_changes where plugin = '$plugin' AND method = 'addcolumn'", false); + } +} + +function api_plugin_db_add_column ($plugin, $table, $column) { + // Example: api_plugin_db_add_column ('thold', 'plugin_config', array('name' => 'test' . rand(1, 200), 'type' => 'varchar (255)', 'NULL' => false)); + + global $config, $database_default; + include_once($config['library_path'] . '/database.php'); + + $result = db_fetch_assoc('show columns from `' . $table . '`') or die (mysql_error()); + $columns = array(); + foreach($result as $index => $arr) { + foreach ($arr as $t) { + $columns[] = $t; + } + } + if (isset($column['name']) && !in_array($column['name'], $columns)) { + $sql = 'ALTER TABLE `' . $table . '` ADD `' . $column['name'] . '`'; + if (isset($column['type'])) + $sql .= ' ' . $column['type']; + if (isset($column['unsigned'])) + $sql .= ' unsigned'; + if (isset($column['NULL']) && $column['NULL'] == false) + $sql .= ' NOT NULL'; + if (isset($column['NULL']) && $column['NULL'] == true && !isset($column['default'])) + $sql .= ' default NULL'; + if (isset($column['default'])) + $sql .= ' default ' . (is_numeric($column['default']) ? $column['default'] : "'" . $column['default'] . "'"); + if (isset($column['auto_increment'])) + $sql .= ' auto_increment'; + if (isset($column['after'])) + $sql .= ' AFTER ' . $column['after']; + + if (db_execute($sql)) { + db_execute("INSERT INTO plugin_db_changes (plugin, `table`, `column`, `method`) VALUES ('$plugin', '$table', '" . $column['name'] . "', 'addcolumn')"); + } + } +} + +function api_plugin_install ($plugin) { + global $config; + include_once($config['base_path'] . "/plugins/$plugin/setup.php"); + + $exists = db_fetch_assoc("SELECT id FROM plugin_config WHERE directory = '$plugin'", false); + if (sizeof($exists)) { + db_execute("DELETE FROM plugin_config WHERE directory = '$plugin'"); + } + + $name = $author = $webpage = $version = ''; + $function = 'plugin_' . $plugin . '_version'; + if (function_exists($function)){ + $info = $function(); + $name = $info['longname']; + if (isset($info['homepage'])) { + $webpage = $info['homepage']; + }elseif (isset($info['webpage'])) { + $webpage = $info['webpage']; + }else{ + $webpage = "Not Stated"; + } + $author = $info['author']; + $version = $info['version']; + } + + db_execute("INSERT INTO plugin_config (directory, name, author, webpage, version) VALUES ('$plugin', '$name', '$author', '$webpage', '$version')"); + + $function = 'plugin_' . $plugin . '_install'; + if (function_exists($function)){ + $function(); + $ready = api_plugin_check_config ($plugin); + if ($ready) { + // Set the plugin as "disabled" so it can go live + db_execute("UPDATE plugin_config SET status = 4 WHERE directory = '$plugin'"); + } else { + // Set the plugin as "needs configuration" + db_execute("UPDATE plugin_config SET status = 2 WHERE directory = '$plugin'"); + } + } +} + +function api_plugin_uninstall ($plugin) { + global $config; + include_once($config['base_path'] . "/plugins/$plugin/setup.php"); + // Run the Plugin's Uninstall Function first + $function = 'plugin_' . $plugin . '_uninstall'; + if (function_exists($function)) { + $function(); + } + api_plugin_remove_hooks ($plugin); + api_plugin_remove_realms ($plugin); + db_execute("DELETE FROM plugin_config WHERE directory = '$plugin'"); + api_plugin_db_changes_remove ($plugin); +} + +function api_plugin_check_config ($plugin) { + global $config; + include_once($config['base_path'] . "/plugins/$plugin/setup.php"); + $function = 'plugin_' . $plugin . '_check_config'; + if (function_exists($function)) { + return $function(); + } + return TRUE; +} + +function api_plugin_enable ($plugin) { + $ready = api_plugin_check_config ($plugin); + if ($ready) { + api_plugin_enable_hooks ($plugin); + db_execute("UPDATE plugin_config SET status = 1 WHERE directory = '$plugin'"); + } +} + +function api_plugin_is_enabled ($plugin) { + $status = db_fetch_cell("SELECT status FROM plugin_config WHERE directory = '$plugin'", false); + if ($status == '1') + return true; + return false; +} + +function api_plugin_disable ($plugin) { + api_plugin_disable_hooks ($plugin); + db_execute("UPDATE plugin_config SET status = 4 WHERE directory = '$plugin'"); +} + +function api_plugin_moveup($plugin) { + global $plugins_system; + + $sql_where = ""; + if (sizeof($plugins_system)) { + foreach($plugins_system as $s) { + $sql_where .= (strlen($sql_where) ? " AND ":"(") . " directory!='$s'"; + } + + $sql_where .= ")"; + } + + $id = db_fetch_cell("SELECT id FROM plugin_config WHERE directory='$plugin'" . (strlen($sql_where) ? " AND " . $sql_where:"")); + $temp_id = db_fetch_cell("SELECT MAX(id) FROM plugin_config")+1; + $prior_id = db_fetch_cell("SELECT MAX(id) FROM plugin_config WHERE id<$id" . (strlen($sql_where) ? " AND " . $sql_where:"")); + + /* update the above plugin to the prior temp id */ + db_execute("UPDATE plugin_config SET id=$temp_id WHERE id=$prior_id"); + db_execute("UPDATE plugin_config SET id=$prior_id WHERE id=$id"); + db_execute("UPDATE plugin_config SET id=$id WHERE id=$temp_id"); +} + +function api_plugin_movedown($plugin) { + global $plugins_system; + + $sql_where = ""; + if (sizeof($plugins_system)) { + foreach($plugins_system as $s) { + $sql_where .= (strlen($sql_where) ? " AND ":"(") . " directory!='$s'"; + } + + $sql_where .= ")"; + } + + $id = db_fetch_cell("SELECT id FROM plugin_config WHERE directory='$plugin'" . (strlen($sql_where) ? " AND " . $sql_where:"")); + $temp_id = db_fetch_cell("SELECT MAX(id) FROM plugin_config")+1; + $next_id = db_fetch_cell("SELECT MIN(id) FROM plugin_config WHERE id>$id" . (strlen($sql_where) ? " AND " . $sql_where:"")); + + /* update the above plugin to the prior temp id */ + db_execute("UPDATE plugin_config SET id=$temp_id WHERE id=$next_id"); + db_execute("UPDATE plugin_config SET id=$next_id WHERE id=$id"); + db_execute("UPDATE plugin_config SET id=$id WHERE id=$temp_id"); +} + +function api_plugin_register_hook ($plugin, $hook, $function, $file) { + $exists = db_fetch_assoc("SELECT id FROM plugin_hooks WHERE name = '$plugin' AND hook = '$hook'", false); + if (!count($exists)) { + $settings = array('config_settings', 'config_arrays', 'config_form'); + if (!in_array($hook, $settings)) { + db_execute("INSERT INTO plugin_hooks (name, hook, function, file) VALUES ('$plugin', '$hook', '$function', '$file')"); + } else { + db_execute("INSERT INTO plugin_hooks (name, hook, function, file, status) VALUES ('$plugin', '$hook', '$function', '$file', 1)"); + } + } +} + +function api_plugin_remove_hooks ($plugin) { + db_execute("DELETE FROM plugin_hooks WHERE name = '$plugin'"); +} + +function api_plugin_enable_hooks ($plugin) { + db_execute("UPDATE plugin_hooks SET status = 1 WHERE name = '$plugin'"); +} + +function api_plugin_disable_hooks ($plugin) { + db_execute("UPDATE plugin_hooks SET status = 0 WHERE name = '$plugin' AND hook != 'config_settings' AND hook != 'config_arrays' AND hook != 'config_form'"); +} + +function api_plugin_register_realm ($plugin, $file, $display, $admin = false) { + $exists = db_fetch_assoc("SELECT id FROM plugin_realms WHERE plugin = '$plugin' AND file = '$file'", false); + if (!count($exists)) { + db_execute("INSERT INTO plugin_realms (plugin, file, display) VALUES ('$plugin', '$file', '$display')"); + if ($admin) { + $realm_id = db_fetch_assoc("SELECT id FROM plugin_realms WHERE plugin = '$plugin' AND file = '$file'", false); + $realm_id = $realm_id[0]['id'] + 100; + $user_id = db_fetch_assoc("SELECT id FROM user_auth WHERE username = 'admin'", false); + if (count($user_id)) { + $user_id = $user_id[0]['id']; + $exists = db_fetch_assoc("SELECT realm_id FROM user_auth_realm WHERE user_id = $user_id and realm_id = $realm_id", false); + if (!count($exists)) { + db_execute("INSERT INTO user_auth_realm (user_id, realm_id) VALUES ($user_id, $realm_id)"); + } + } + } + } +} + +function api_plugin_remove_realms ($plugin) { + $realms = db_fetch_assoc("SELECT id FROM plugin_realms WHERE plugin = '$plugin'", false); + foreach ($realms as $realm) { + $id = $realm['id'] + 100; + db_execute("DELETE FROM user_auth_realm WHERE realm_id = '$id'"); + } + db_execute("DELETE FROM plugin_realms WHERE plugin = '$plugin'"); +} + +function api_plugin_load_realms () { + global $user_auth_realms, $user_auth_realm_filenames; + $plugin_realms = db_fetch_assoc("SELECT * FROM plugin_realms ORDER BY plugin, display", false); + if (count($plugin_realms)) { + foreach ($plugin_realms as $plugin_realm) { + $plugin_files = explode(',', $plugin_realm['file']); + foreach($plugin_files as $plugin_file) { + $user_auth_realm_filenames[$plugin_file] = $plugin_realm['id'] + 100; + } + $user_auth_realms[$plugin_realm['id'] + 100] = $plugin_realm['display']; + } + } +} + +function api_plugin_user_realm_auth ($filename = '') { + global $user_realms, $user_auth_realms, $user_auth_realm_filenames; + /* list all realms that this user has access to */ + if (!isset($user_realms)) { + if (read_config_option('global_auth') == 'on' || read_config_option('auth_method') != 0) { + $user_realms = db_fetch_assoc("select realm_id from user_auth_realm where user_id=" . $_SESSION["sess_user_id"], false); + $user_realms = array_rekey($user_realms, "realm_id", "realm_id"); + }else{ + $user_realms = $user_auth_realms; + } + } + if ($filename != '') { + if (isset($user_realms[$user_auth_realm_filenames{basename($filename)}])) + return TRUE; + } + return FALSE; +} + +function plugin_config_arrays () { + global $menu; + $menu['Configuration']['plugins.php'] = 'Plugin Management'; + api_plugin_load_realms (); +} + +function plugin_draw_navigation_text ($nav) { + $nav["plugins.php:"] = array("title" => "Plugin Management", "mapping" => "index.php:", "url" => "plugins.php", "level" => "1"); + return $nav; +} + + + + + + + diff -Naur cacti-0.8.7g-old/lib/poller.php cacti-0.8.7g/lib/poller.php --- cacti-0.8.7g-old/lib/poller.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/lib/poller.php 2010-07-09 18:34:11.000000000 -0400 @@ -344,8 +344,11 @@ } } } + api_plugin_hook_function('poller_output', $rrd_update_array); - $rrds_processed = rrdtool_function_update($rrd_update_array, $rrdtool_pipe); + if (api_plugin_hook_function('poller_on_demand', $results)) { + $rrds_processed = rrdtool_function_update($rrd_update_array, $rrdtool_pipe); + } } return $rrds_processed; diff -Naur cacti-0.8.7g-old/lib/rrd.php cacti-0.8.7g/lib/rrd.php --- cacti-0.8.7g-old/lib/rrd.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/lib/rrd.php 2010-07-09 18:34:11.000000000 -0400 @@ -419,6 +419,9 @@ $data_source_path = get_data_source_path($local_data_id, true); + /* update the rrdfile if performing a fetch */ + api_plugin_hook_function('rrdtool_function_fetch_cache_check', $local_data_id); + /* build and run the rrdtool fetch command with all of our data */ $cmd_line = "fetch $data_source_path AVERAGE -s $start_time -e $end_time"; if ($resolution > 0) { @@ -539,6 +542,10 @@ } } + $data = api_plugin_hook_function('rrdtool_function_graph_cache_check', array('local_graph_id' => $local_graph_id,'rra_id' => $rra_id,'rrd_struc' => $rrdtool_pipe,'graph_data_array' => $graph_data_array, 'return' => false)); + if (isset($data['return']) && $data['return'] != false) + return $data['return']; + /* find the step and how often this graph is updated with new data */ $ds_step = db_fetch_cell("select data_template_data.rrd_step @@ -1376,6 +1383,13 @@ } } + $graph_array = api_plugin_hook_function('rrd_graph_graph_options', array('graph_opts' => $graph_opts, 'graph_defs' => $graph_defs, 'txt_graph_items' => $txt_graph_items, 'graph_id' => $local_graph_id, 'start' => $graph_start, 'end' => $graph_end)); + if (!empty($graph_array)) { + $graph_defs = $graph_array['graph_defs']; + $txt_graph_items = $graph_array['txt_graph_items']; + $graph_opts = $graph_array['graph_opts']; + } + /* either print out the source or pass the source onto rrdtool to get us a nice PNG */ if (isset($graph_data_array["print_source"])) { print "
" . htmlspecialchars(read_config_option("path_rrdtool") . " graph " . $graph_opts . $graph_defs . $txt_graph_items) . "
"; @@ -1384,13 +1398,19 @@ @rrdtool_execute("graph $graph_opts$graph_defs$txt_graph_items", false, RRDTOOL_OUTPUT_NULL, $rrdtool_pipe); return 0; }else{ + $graph_data_array = api_plugin_hook_function('prep_graph_array', $graph_data_array); + if (isset($graph_data_array["output_flag"])) { $output_flag = $graph_data_array["output_flag"]; }else{ $output_flag = RRDTOOL_OUTPUT_GRAPH_DATA; } - return @rrdtool_execute("graph $graph_opts$graph_defs$txt_graph_items", false, $output_flag, $rrdtool_pipe); + $output = @rrdtool_execute("graph $graph_opts$graph_defs$txt_graph_items", false, $output_flag, $rrdtool_pipe); + + api_plugin_hook_function('rrdtool_function_graph_set_file', array('output' => $output, 'local_graph_id' => $local_graph_id, 'rra_id' => $rra_id)); + + return $output; } } } diff -Naur cacti-0.8.7g-old/lib/variables.php cacti-0.8.7g/lib/variables.php --- cacti-0.8.7g-old/lib/variables.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/lib/variables.php 2010-07-09 18:34:11.000000000 -0400 @@ -183,6 +183,9 @@ $string = str_replace($l_escape_string . "host_max_oids" . $r_escape_string, $_SESSION["sess_host_cache_array"][$host_id]["max_oids"], $string); $string = str_replace($l_escape_string . "host_id" . $r_escape_string, $_SESSION["sess_host_cache_array"][$host_id]["id"], $string); + $temp = api_plugin_hook_function('substitute_host_data', array('string' => $string, 'l_escape_string' => $l_escape_string, 'r_escape_string' => $r_escape_string, 'host_id' => $host_id)); + $string = $temp['string']; + return $string; } diff -Naur cacti-0.8.7g-old/plugins/index.php cacti-0.8.7g/plugins/index.php --- cacti-0.8.7g-old/plugins/index.php 1969-12-31 19:00:00.000000000 -0500 +++ cacti-0.8.7g/plugins/index.php 2010-07-09 18:34:11.000000000 -0400 @@ -0,0 +1,5 @@ + diff -Naur cacti-0.8.7g-old/plugins.php cacti-0.8.7g/plugins.php --- cacti-0.8.7g-old/plugins.php 1969-12-31 19:00:00.000000000 -0500 +++ cacti-0.8.7g/plugins.php 2010-07-09 18:34:11.000000000 -0400 @@ -0,0 +1,647 @@ + "Install", + "enable" => "Enable", + "disable" => "Disable", + "uninstall" => "Uninstall", +// "check" => "Check" +); + +$status_names = array( + -2 => 'Disabled', + -1 => 'Active', + 0 => 'Not Installed', + 1 => 'Active', + 2 => 'Awaiting Configuration', + 3 => 'Awaiting Upgrade', + 4 => 'Installed' +); + +/* get the comprehensive list of plugins */ +$pluginslist = retrieve_plugin_list(); + +/* Check to see if we are installing, etc... */ +$modes = array('installold', 'uninstallold', 'install', 'uninstall', 'disable', 'enable', 'check', 'moveup', 'movedown'); + +if (isset($_GET['mode']) && in_array($_GET['mode'], $modes) && isset($_GET['id'])) { + input_validate_input_regex(get_request_var("id"), "^([a-zA-Z0-9]+)$"); + + $mode = $_GET['mode']; + $id = sanitize_search_string($_GET['id']); + + switch ($mode) { + case 'installold': + api_plugin_install_old($id); + header("Location: plugins.php"); + exit; + break; + case 'uninstallold': + api_plugin_uninstall_old($id); + header("Location: plugins.php"); + exit; + break; + case 'install': + api_plugin_install($id); + header("Location: plugins.php"); + exit; + break; + case 'uninstall': + if (!in_array($id, $pluginslist)) break; + api_plugin_uninstall($id); + header("Location: plugins.php"); + exit; + break; + case 'disable': + if (!in_array($id, $pluginslist)) break; + api_plugin_disable($id); + header("Location: plugins.php"); + exit; + break; + case 'enable': + if (!in_array($id, $pluginslist)) break; + api_plugin_enable($id); + header("Location: plugins.php"); + exit; + break; + case 'check': + if (!in_array($id, $pluginslist)) break; + break; + case 'moveup': + if (!in_array($id, $pluginslist)) break; + if (is_system_plugin($id)) break; + api_plugin_moveup($id); + header("Location: plugins.php"); + exit; + break; + case 'movedown': + if (!in_array($id, $pluginslist)) break; + if (is_system_plugin($id)) break; + api_plugin_movedown($id); + header("Location: plugins.php"); + exit; + break; + } +} + +function retrieve_plugin_list () { + $pluginslist = array(); + $temp = db_fetch_assoc('SELECT directory FROM plugin_config ORDER BY name'); + foreach ($temp as $t) { + $pluginslist[] = $t['directory']; + } + return $pluginslist; +} + +include("./include/top_header.php"); + +update_show_current(); + +include("./include/bottom_footer.php"); + + +function api_plugin_install_old ($plugin) { + global $config; + if (!file_exists($config['base_path'] . "/plugins/$plugin/setup.php")) { + return false; + } + $oldplugins = read_config_option('oldplugins'); + $oldplugins = explode(',', $oldplugins); + if (!in_array($plugin, $oldplugins)) { + include_once($config['base_path'] . "/plugins/$plugin/setup.php"); + $function = 'plugin_init_' . $plugin; + if (function_exists($function)){ + $oldplugins[] = $plugin; + $oldplugins = implode(',', $oldplugins); + set_config_option('oldplugins', $oldplugins); + unset($_SESSION['sess_config_array']['oldplugins']); + return true; + } else { + return false; + } + } + return false; +} + +function api_plugin_uninstall_old ($plugin) { + global $config; + $oldplugins = read_config_option('oldplugins'); + $oldplugins = explode(',', $oldplugins); + if (!empty($oldplugins)) { + if (in_array($plugin, $oldplugins)) { + for ($a = 0; $a < count($oldplugins); $a++) { + if ($oldplugins[$a] == $plugin) { + unset($oldplugins[$a]); + break; + } + } + $oldplugins = implode(',', $oldplugins); + set_config_option('oldplugins', $oldplugins); + unset($_SESSION['sess_config_array']['oldplugins']); + return true; + } + } + return false; +} + +function update_show_updates () { + global $pluginslist, $colors, $config, $plugin_architecture; + + $cinfo = array(); + sort($pluginslist); + + $cinfo = update_get_plugin_info (); + + $x = 0; + + $info = update_get_cached_plugin_info(); + + $cactinew = update_check_if_newer($cinfo['cacti']['version'], $info['cacti']['version']) ; + if (isset($cinfo['cacti_plugin_arch']['version'])) { + $archnew = update_check_if_newer($cinfo['cacti_plugin_arch']['version'], $info['cacti_plugin_arch']['version']); + } else { + $archnew = 0; + } + + if ($cactinew) { + $x++; + print "
"; + html_header(array("Cacti"), 2); + form_alternate_row_color($colors["alternate"],$colors["light"], 0); + print ""; + form_alternate_row_color($colors["alternate"],$colors["light"], 0); + print "
Version:" . $config["cacti_version"] . "
Changes:" . str_replace("\n", '
', $info['cacti']['changes']) . "
"; + } + if (isset($plugin_architecture['version']) && $archnew) { + $x++; + print ""; + html_header(array("Plugin Architecture"), 2); + form_alternate_row_color($colors["alternate"],$colors["light"], 0); + print ""; + form_alternate_row_color($colors["alternate"],$colors["light"], 0); + print "
Version:" . $plugin_architecture['version'] . "Changes:" . str_replace("\n", '
', $info['cacti_plugin_arch']['changes']) . "
"; + } + print ""; + + foreach ($pluginslist as $plugin) { + if (isset($cinfo[$plugin]) && update_check_if_newer($cinfo[$plugin]['version'], $info[$plugin]['version'])) { + $x++; + print "
"; + html_header(array((isset($cinfo[$plugin]['longname']) ? $cinfo[$plugin]['longname'] : $plugin)), 2); + form_alternate_row_color($colors["alternate"],$colors["light"], 0); + print ""; + form_alternate_row_color($colors["alternate"],$colors["light"], 0); + print ""; + form_alternate_row_color($colors["alternate"],$colors["light"], 0); + print ""; + form_alternate_row_color($colors["alternate"],$colors["light"], 0); + print ""; + form_alternate_row_color($colors["alternate"],$colors["light"], 0); + print ""; + + print "
Directory:$pluginVersion:" . $info[$plugin]['version'] . "Author:" . (isset($cinfo[$plugin]['author']) && $cinfo[$plugin]['author'] != '' ? (isset($cinfo[$plugin]['email']) && $cinfo[$plugin]['email'] != '' ? "" . $cinfo[$plugin]['author'] . "" : $cinfo[$plugin]['author']) : "") . "Home Page:" . (isset($cinfo[$plugin]['webpage']) && $cinfo[$plugin]['webpage'] != '' ? "" . $cinfo[$plugin]['webpage'] . "" : "") . "Changes:" . str_replace("\n", '
', $info[$plugin]['changes']) . "
"; + } + } + if ($x == 0) + print "
There are currently no Updates!

"; + print "
"; + html_end_box(TRUE); +} + +function update_check_if_newer() { + return false; +} + +function plugins_temp_table_exists($table) { + return sizeof(db_fetch_row("SHOW TABLES LIKE '$table'")); +} + +function plugins_load_temp_table() { + global $config, $plugins; + + $pluginslist = retrieve_plugin_list(); + + if (isset($_SESSION["plugin_temp_table"])) { + $table = $_SESSION["plugin_temp_table"]; + }else{ + $table = "plugin_temp_table_" . rand(); + } + + while (true) { + if (!plugins_temp_table_exists($table)) { + $_SESSION["plugin_temp_table"] = $table; + db_execute("CREATE TEMPORARY TABLE $table LIKE plugin_config"); + db_execute("INSERT INTO $table SELECT * FROM plugin_config"); + break; + }else{ + $table = "plugin_temp_table_" . rand(); + } + } + + $path = $config['base_path'] . '/plugins/'; + $dh = opendir($path); + while (($file = readdir($dh)) !== false) { + if ((is_dir("$path/$file")) && (file_exists("$path/$file/setup.php")) && (!in_array($file, $pluginslist))) { + if (!function_exists('plugin_' . $file . '_install')) { + include_once("$path/$file/setup.php"); + if (!function_exists('plugin_' . $file . '_install') && function_exists($file . '_version')) { + $function = $file . '_version'; + $cinfo[$file] = $function(); + if (!isset($cinfo[$file]['author'])) $cinfo[$file]['author'] = 'Unknown'; + if (!isset($cinfo[$file]['homepage'])) $cinfo[$file]['homepage'] = 'Not Stated'; + if (isset($cinfo[$file]['webpage'])) $cinfo[$file]['homepage'] = $cinfo[$file]['webpage']; + if (!isset($cinfo[$file]['longname'])) $cinfo[$file]['longname'] = ucfirst($file); + $cinfo[$file]['status'] = -2; + if (in_array($file, $plugins)) { + $cinfo[$file]['status'] = -1; + } + db_execute("REPLACE INTO $table (directory, name, status, author, webpage, version) + VALUES ('" . + $file . "', '" . + $cinfo[$file]['longname'] . "', '" . + $cinfo[$file]['status'] . "', '" . + $cinfo[$file]['author'] . "', '" . + $cinfo[$file]['homepage'] . "', '" . + $cinfo[$file]['version'] . "')"); + $pluginslist[] = $file; + } else if (function_exists('plugin_' . $file . '_install') && function_exists('plugin_' . $file . '_version')) { + $function = $file . '_version'; + $cinfo[$file] = $function(); + $cinfo[$file]['status'] = 0; + if (!isset($cinfo[$file]['author'])) $cinfo[$file]['author'] = 'Unknown'; + if (!isset($cinfo[$file]['homepage'])) $cinfo[$file]['homepage'] = 'Not Stated'; + if (isset($cinfo[$file]['webpage'])) $cinfo[$file]['homepage'] = $cinfo[$file]['webpage']; + if (!isset($cinfo[$file]['longname'])) $cinfo[$file]['homepage'] = ucfirst($file); + db_execute("REPLACE INTO $table (directory, name, status, author, webpage, version) + VALUES ('" . + $file . "', '" . + $cinfo[$file]['longname'] . "', '" . + $cinfo[$file]['status'] . "', '" . + $cinfo[$file]['author'] . "', '" . + $cinfo[$file]['homepage'] . "', '" . + $cinfo[$file]['version'] . "')"); + $pluginslist[] = $file; + } + }else{ + cacti_log("WARNING: Install function already exists for plugin directory '$file'", false); + } + } + } + closedir($dh); + + return $table; +} + +function update_show_current () { + global $plugins, $pluginslist, $colors, $plugin_architecture, $config, $status_names, $actions; + + /* ================= input validation ================= */ + input_validate_input_number(get_request_var_request("page")); + /* ==================================================== */ + + /* clean up search string */ + if (isset($_REQUEST["filter"])) { + $_REQUEST["filter"] = sanitize_search_string(get_request_var("filter")); + } + + /* clean up sort_column */ + if (isset($_REQUEST["sort_column"])) { + $_REQUEST["sort_column"] = sanitize_search_string(get_request_var("sort_column")); + } + + /* clean up search string */ + if (isset($_REQUEST["sort_direction"])) { + $_REQUEST["sort_direction"] = sanitize_search_string(get_request_var("sort_direction")); + } + + /* if the user pushed the 'clear' button */ + if (isset($_REQUEST["clear_x"])) { + kill_session_var("sess_plugins_filter"); + kill_session_var("sess_plugins_sort_column"); + kill_session_var("sess_plugins_sort_direction"); + + unset($_REQUEST["page"]); + unset($_REQUEST["filter"]); + unset($_REQUEST["sort_column"]); + unset($_REQUEST["sort_direction"]); + $_REQUEST["page"] = 1; + } + + /* remember these search fields in session vars so we don't have to keep passing them around */ + load_current_session_value("filter", "sess_plugins_filter", ""); + load_current_session_value("sort_column", "sess_plugins_sort_column", "name"); + load_current_session_value("sort_direction", "sess_plugins_sort_direction", "ASC"); + load_current_session_value("page", "sess_plugins_current_page", "1"); + + $table = plugins_load_temp_table(); + + html_start_box("Plugin Management (Cacti Version: " . $config["cacti_version"] . + (isset($plugin_architecture['version']) ? ", Plugin Architecture Version: " . $plugin_architecture['version']:"") . + ")", "100%", $colors["header"], "3", "center", ""); + + ?> + + +
+ + + + + + +
+ Search:  + + "> + +   + +
+ +
+ + + \n"; + + html_start_box("", "100%", $colors["header"], "3", "center", ""); + + /* form the 'where' clause for our main sql query */ + $sql_where = "WHERE ($table.name LIKE '%%" . get_request_var_request("filter") . "%%')"; + + if (get_request_var_request("sort_column") == "version") { + $sortc = "version+0"; + }else{ + $sortc = get_request_var_request("sort_column"); + } + + if (get_request_var_request("sort_column") == "id") { + $sortd = "ASC"; + }else{ + $sortd = get_request_var_request("sort_direction"); + } + + $total_rows = db_fetch_cell("SELECT + count(*) + FROM $table + $sql_where"); + + $plugins = db_fetch_assoc("SELECT * + FROM $table + $sql_where + ORDER BY " . $sortc . " " . $sortd . " + LIMIT " . (read_config_option("num_rows_device")*(get_request_var_request("page")-1)) . "," . read_config_option("num_rows_device")); + + db_execute("DROP TABLE $table"); + + /* generate page list */ + $url_page_select = get_page_list(get_request_var_request("page"), MAX_DISPLAY_PAGES, read_config_option("num_rows_device"), $total_rows, "plugins.php?filter=" . get_request_var_request("filter")); + + if ($total_rows == 0) { + $nav = " + + + + \n + +
+ No Plugins Found +
+ + \n"; + }elseif ($total_rows < read_config_option("num_rows_device")) { + $nav = " + + + + \n + +
+ Showing All $total_rows Rows +
+ + \n"; + }else{ + $nav = " + + + + \n + \n + \n + +
+ << "; if (get_request_var_request("page") > 1) { $nav .= ""; } $nav .= "Previous"; if (get_request_var_request("page") > 1) { $nav .= ""; } $nav .= " + + Showing Rows " . ((read_config_option("num_rows_device")*(get_request_var_request("page")-1))+1) . " to " . ((($total_rows < read_config_option("num_rows_device")) || ($total_rows < (read_config_option("num_rows_device")*get_request_var_request("page")))) ? $total_rows : (read_config_option("num_rows_device")*get_request_var_request("page"))) . " of $total_rows [$url_page_select] + + "; if ((get_request_var_request("page") * read_config_option("num_rows_device")) < $total_rows) { $nav .= ""; } $nav .= "Next"; if ((get_request_var_request("page") * read_config_option("num_rows_device")) < $total_rows) { $nav .= ""; } $nav .= " >> +
+ + \n"; + } + + print $nav; + + $display_text = array( + "nosort" => array("Actions", ""), + "directory" => array("Name", "ASC"), + "id" => array("Load Order", "ASC"), + "name" => array("Description", "ASC"), + "nosort1" => array("Type", "ASC"), + "status" => array("Status", "ASC"), + "author" => array("Author", "ASC"), + "webpage" => array("Web Page", "ASC"), + "version" => array("Version", "ASC")); + + html_header_sort($display_text, get_request_var_request("sort_column"), get_request_var_request("sort_direction"), 1); + + $i = 0; + if (sizeof($plugins)) { + if (get_request_var_request("sort_column") == "id") { + $inst_system_plugins = get_system_plugins($plugins); + if (sizeof($inst_system_plugins)) { + foreach($inst_system_plugins as $plugin) { + form_alternate_row_color($colors["alternate"], $colors["light"], $i); $i++; + print format_plugin_row($plugin, false, false, true); + } + } + } + + $j = 0; + foreach ($plugins as $plugin) { + if ((isset($plugins[$j+1]) && $plugins[$j+1]['status'] < 0) || (!isset($plugins[$j+1]))) { + $last_plugin = true; + }else{ + $last_plugin = false; + } + if ($plugin['status'] <= 0 || is_system_plugin($plugin) || (get_request_var_request('sort_column') != 'id')) { + $load_ordering = false; + }else{ + $load_ordering = true; + } + + if (get_request_var_request("sort_column") == "id") { + if (!is_system_plugin($plugin)) { + form_alternate_row_color($colors["alternate"], $colors["light"], $i); + print format_plugin_row($plugin, $last_plugin, $load_ordering, false); + $i++; + } + }else{ + form_alternate_row_color($colors["alternate"], $colors["light"], $i); + print format_plugin_row($plugin, $last_plugin, $load_ordering, is_system_plugin($plugin)); + $i++; + } + + $j++; + } + + print $nav; + }else{ + print "No Plugins Found"; + } + + html_end_box(false); + + html_start_box("", "100%", $colors["header"], "3", "center", ""); + echo "NOTE: Please sort by 'Load Order' to change plugin load ordering.
NOTE: SYSTEM plugins can not be ordered."; + html_end_box(); + + print "\n"; +} + +function format_plugin_row($plugin, $last_plugin, $include_ordering, $system_plugin) { + global $status_names; + static $first_plugin = true; + + $row = plugin_actions($plugin); + $row .= "" . (strlen(get_request_var_request("filter")) ? eregi_replace("(" . preg_quote(get_request_var_request("filter")) . ")", "\\1", ucfirst($plugin["directory"])) : ucfirst($plugin["directory"])) . ""; + if ($include_ordering) { + $row .= ""; + if (!$first_plugin) { + $row .= ""; + }else{ + $row .= ""; + } + if (!$last_plugin) { + $row .= ""; + }else{ + $row .= ""; + } + $row .= "\n"; + }else{ + $row .= "\n"; + } + + $row .= "" . (strlen(get_request_var_request("filter")) ? eregi_replace("(" . preg_quote(get_request_var_request("filter")) . ")", "\\1", $plugin["name"]) : $plugin["name"]) . "\n"; + $row .= "" . ($system_plugin ? "System": ($plugin['status'] < 0 ? "Old PIA":"General")) . "\n"; + $row .= "" . $status_names[$plugin["status"]] . "\n"; + $row .= "" . $plugin["author"] . "\n"; + $row .= "" . htmlspecialchars($plugin["webpage"]) . "\n"; + $row .= "" . $plugin["version"] . "\n"; + $row .= "\n"; + + if ($include_ordering) { + $first_plugin = false; + } + + return $row; +} + +function plugin_actions($plugin) { + $link = ""; + switch ($plugin['status']) { + case "-2": // Old PA Not Installed + $link .= ""; + $link .= ""; + break; + case "-1": // Old PA Currently Active + $oldplugins = read_config_option('oldplugins'); + $oldplugins = explode(',', $oldplugins); + if (in_array($plugin['directory'], $oldplugins)) { + $link .= ""; + } else { + $link .= ""; + } + $link .= ""; + break; + case "0": // Not Installed + $link .= ""; + $link .= ""; + break; + case "1": // Currently Active + $link .= ""; + $link .= ""; + break; + case "4": // Installed but not active + $link .= ""; + $link .= ""; + break; + default: // Old PIA + $link .= ""; + $link .= ""; + break; + } + $link .= ""; + + return $link; +} + +function is_system_plugin($plugin) { + global $plugins_system; + + if (is_array($plugin)) { + $plugin = $plugin["directory"]; + } + + if (!in_array($plugin, $plugins_system)) { + return false; + }else{ + return true; + } +} + +function get_system_plugins($plugins) { + $inst_system_plugins = array(); + + if (sizeof($plugins)) { + foreach($plugins as $plugin) { + if (is_system_plugin($plugin)) { + $inst_system_plugins[] = $plugin; + } + } + } + + return $inst_system_plugins; +} + + diff -Naur cacti-0.8.7g-old/poller.php cacti-0.8.7g/poller.php --- cacti-0.8.7g-old/poller.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/poller.php 2010-07-09 18:34:11.000000000 -0400 @@ -108,6 +108,8 @@ pcntl_signal(SIGINT, "sig_handler"); } +api_plugin_hook('poller_top'); + /* record the start time */ list($micro,$seconds) = split(" ", microtime()); $poller_start = $seconds + $micro; @@ -304,6 +306,8 @@ $total_procs = $concurrent_processes; } + $extra_args = api_plugin_hook_function ('poller_command_args', $extra_args); + /* Populate each execution file with appropriate information */ foreach ($polling_hosts as $item) { if ($host_count == 1) { @@ -446,9 +450,11 @@ /* sleep the appripriate amount of time */ if ($poller_runs_completed < $poller_runs) { + api_plugin_hook('poller_bottom'); db_close(); usleep($sleep_time * 1000000); db_connect_real($database_hostname, $database_username, $database_password, $database_default, $database_type, $database_port); + api_plugin_hook('poller_top'); } }else if (read_config_option('log_verbosity') >= POLLER_VERBOSITY_MEDIUM || $debug) { cacti_log("WARNING: Cacti Polling Cycle Exceeded Poller Interval by " . $loop_end-$loop_start-$poller_interval . " seconds", TRUE, "POLLER"); @@ -495,4 +501,6 @@ echo " --debug|-d Output debug information. Similar to cacti's DEBUG logging level.\n\n"; } +api_plugin_hook('poller_bottom'); + ?> diff -Naur cacti-0.8.7g-old/user_admin.php cacti-0.8.7g/user_admin.php --- cacti-0.8.7g-old/user_admin.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/user_admin.php 2010-07-09 18:34:11.000000000 -0400 @@ -57,9 +57,11 @@ break; default: - include_once("include/top_header.php"); - user(); - include_once("include/bottom_footer.php"); + if (!api_plugin_hook_function('user_admin_action', get_request_var_request("action"))) { + include_once("include/top_header.php"); + user(); + include_once("include/bottom_footer.php"); + } break; } @@ -402,6 +404,7 @@ $save["policy_graph_templates"] = form_input_validate(get_request_var_post("policy_graph_templates", get_request_var_post("_policy_graph_templates")), "policy_graph_templates", "", true, 3); $save["realm"] = get_request_var_post("realm", 0); $save["enabled"] = form_input_validate(get_request_var_post("enabled", ""), "enabled", "", true, 3); + $save = api_plugin_hook_function('user_admin_setup_sql_save', $save); if (!is_error_message()) { $user_id = sql_save($save, "user_auth"); @@ -444,6 +447,8 @@ policy_hosts = " . get_request_var_post("policy_hosts") . ", policy_graph_templates = " . get_request_var_post("policy_graph_templates") . " WHERE id = " . get_request_var_post("id")); + } else { + api_plugin_hook('user_admin_user_save'); } } } @@ -889,6 +894,8 @@ $header_label = "[new]"; } + api_plugin_hook_function('user_admin_edit', (isset($user) ? get_request_var("id") : 0)); + html_start_box("User Management $header_label", "100%", $colors["header"], "3", "center", ""); draw_edit_form(array( diff -Naur cacti-0.8.7g-old/utilities.php cacti-0.8.7g/utilities.php --- cacti-0.8.7g-old/utilities.php 2010-07-09 18:33:46.000000000 -0400 +++ cacti-0.8.7g/utilities.php 2010-07-09 18:34:11.000000000 -0400 @@ -123,11 +123,14 @@ include_once("./include/bottom_footer.php"); break; default: - include_once("./include/top_header.php"); - utilities(); + if (!api_plugin_hook_function('utilities_action', $_REQUEST['action'])) { + include_once('./include/top_header.php'); - include_once("./include/bottom_footer.php"); + utilities(); + + include_once('./include/bottom_footer.php'); + } break; } @@ -1644,6 +1647,8 @@