__('Install'), 'enable' => __('Enable'), 'disable' => __('Disable'), 'uninstall' => __('Uninstall'), ); $status_names = array( -1 => __('Not Compatible'), 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', 'remote_enable', 'remote_disable', 'moveup', 'movedown' ); if (isset_request_var('mode') && in_array(get_nfilter_request_var('mode'), $modes) && isset_request_var('id')) { get_filter_request_var('id', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9 _]+)$/'))); $mode = get_nfilter_request_var('mode'); $id = sanitize_search_string(get_request_var('id')); if (isset_request_var('header')) { $option = 'header=false'; } else { $option = ''; } switch ($mode) { case 'install': if (!in_array($id, $plugins_integrated)) { api_plugin_install($id); } define('IN_PLUGIN_INSTALL', 1); if ($_SESSION['sess_plugins_state'] >= 0) { header('Location: plugins.php?state=5' . ($option != '' ? '&' . $option:'')); } else { header('Location: plugins.php' . ($option != '' ? '?' . $option:'')); } exit; break; case 'uninstall': if (!in_array($id, $pluginslist)) { break; } define('IN_PLUGIN_INSTALL', 1); api_plugin_uninstall($id); header('Location: plugins.php' . ($option != '' ? '?' . $option:'')); exit; break; case 'disable': if (!in_array($id, $pluginslist)) { break; } api_plugin_disable($id); header('Location: plugins.php' . ($option != '' ? '?' . $option:'')); exit; break; case 'enable': if (!in_array($id, $pluginslist)) { break; } if (!in_array($id, $plugins_integrated)) { api_plugin_enable($id); } header('Location: plugins.php' . ($option != '' ? '?' . $option:'')); exit; break; case 'check': if (!in_array($id, $pluginslist)) { break; } break; case 'moveup': if (!in_array($id, $pluginslist)) { break; } if (in_array($id, $plugins_integrated)) { break; } api_plugin_moveup($id); header('Location: plugins.php' . ($option != '' ? '?' . $option:'')); exit; break; case 'movedown': if (!in_array($id, $pluginslist)) { break; } if (in_array($id, $plugins_integrated)) { break; } api_plugin_movedown($id); header('Location: plugins.php' . ($option != '' ? '&' . $option:'')); exit; break; case 'remote_enable': if (!in_array($id, $pluginslist)) { break; } if (in_array($id, $plugins_integrated)) { break; } if ($config['poller_id'] > 1) { db_execute_prepared('UPDATE plugin_config SET status = 1 WHERE directory = ?', array($id), false, $local_db_cnn_id); } header('Location: plugins.php' . ($option != '' ? '&' . $option:'')); exit; break; case 'remote_disable': if (!in_array($id, $pluginslist)) { break; } if (in_array($id, $plugins_integrated)) { break; } if ($config['poller_id'] > 1) { db_execute_prepared('UPDATE plugin_config SET status = 4 WHERE directory = ?', array($id), false, $local_db_cnn_id); } header('Location: plugins.php' . ($option != '' ? '&' . $option:'')); 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; } top_header(); update_show_current(); bottom_footer(); function plugins_temp_table_exists($table) { return cacti_sizeof(db_fetch_row("SHOW TABLES LIKE '$table'")); } function plugins_load_temp_table() { global $config, $plugins, $plugins_integrated, $local_db_cnn_id; $table = 'plugin_temp_table_' . rand(); $x = 0; while ($x < 30) { if (!plugins_temp_table_exists($table)) { $_SESSION['plugin_temp_table'] = $table; db_execute("CREATE TEMPORARY TABLE IF NOT EXISTS $table LIKE plugin_config"); db_execute("TRUNCATE $table"); db_execute("INSERT INTO $table SELECT * FROM plugin_config"); break; } else { $table = 'plugin_temp_table_' . rand(); } $x++; } if (!db_column_exists($table, 'requires')) { db_execute("ALTER TABLE $table ADD COLUMN remote_status tinyint(2) DEFAULT '0' AFTER status, ADD COLUMN capabilities varchar(128) DEFAULT NULL, ADD COLUMN requires varchar(80) DEFAULT NULL, ADD COLUMN infoname varchar(20) DEFAULT NULL"); } if ($config['poller_id'] > 1) { $status = db_fetch_assoc('SELECT directory, status FROM plugin_config', false, $local_db_cnn_id); if (cacti_sizeof($status)) { foreach($status as $r) { $exists = db_fetch_cell_prepared("SELECT id FROM $table WHERE directory = ?", array($r['directory'])); if ($exists) { $capabilities = api_plugin_remote_capabilities($r['directory']); db_execute_prepared("UPDATE $table SET capabilities = ? WHERE directory = ?", array($capabilities, $r['directory'])); db_execute_prepared("UPDATE $table SET remote_status = ? WHERE directory = ?", array($r['status'], $r['directory'])); } else { db_execute_prepared("UPDATE $table SET status = -2, remote_status = ? WHERE directory = ?", array($r['status'], $r['directory'])); } } } } $path = $config['base_path'] . '/plugins/'; $dh = opendir($path); $cinfo = array(); if ($dh !== false) { while (($file = readdir($dh)) !== false) { if (is_dir("$path$file") && file_exists("$path$file/setup.php") && !in_array($file, $plugins_integrated)) { $info_file = "$path$file/INFO"; if (file_exists($info_file)) { $cinfo[$file] = plugin_load_info_file($info_file); $pluginslist[] = $file; } else { $cinfo[$file] = plugin_load_info_defaults($info_file, false); } $exists = db_fetch_cell_prepared("SELECT COUNT(*) FROM $table WHERE directory = ?", array($file)); $infoname = ($cinfo[$file]['name'] == strtolower($cinfo[$file]['name']) ? ucfirst($cinfo[$file]['name']) : $cinfo[$file]['name']); if (!$exists) { db_execute_prepared("INSERT INTO $table (directory, name, status, author, webpage, version, requires, infoname) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", array( $file, $cinfo[$file]['longname'], $cinfo[$file]['status'], $cinfo[$file]['author'], $cinfo[$file]['homepage'], $cinfo[$file]['version'], $cinfo[$file]['requires'], $infoname ) ); } else { db_execute_prepared("UPDATE $table SET infoname = ?, requires = ? WHERE directory = ?", array($infoname, $cinfo[$file]['requires'], $file)); } } } closedir($dh); } $found_plugins = array_keys($cinfo); $plugins = db_fetch_assoc('SELECT id, directory, status FROM plugin_config'); if ($plugins !== false && sizeof($plugins)) { foreach ($plugins as $plugin) { if (!in_array($plugin['directory'], $found_plugins)) { $plugin['status'] = '-5'; $exists = db_fetch_cell_prepared("SELECT COUNT(*) FROM $table WHERE directory = ?", array($plugin['directory'])); if (!$exists) { db_execute_prepared("INSERT INTO $table (directory, name, status, author, webpage, version, requires, infoname) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", array( $plugin['directory'], $plugin['longname'], $plugin['status'], $plugin['author'], $plugin['homepage'], $plugin['version'], $plugin['requires'], ($plugin['name'] == strtolower($plugin['name']) ? ucfirst($plugin['name']) : $plugin['name']) ) ); } else { db_execute_prepared("UPDATE $table SET status = ? WHERE directory = ?", array($plugin['status'], $plugin['directory'])); } } } } return $table; } function update_show_current () { global $plugins, $pluginslist, $config, $status_names, $actions, $item_rows; /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'state' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-99' ) ); validate_store_request_vars($filters, 'sess_plugins'); /* ================= input validation ================= */ $table = plugins_load_temp_table(); ?>
array( 'display' => __('Actions'), 'align' => 'left', 'sort' => '', 'tip' => __('Actions available include \'Install\', \'Activate\', \'Disable\', \'Enable\', \'Uninstall\'.') ), 'directory' => array( 'display' => __('Plugin Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name for this Plugin. The name is controlled by the directory it resides in.') ), 'name' => array( 'display' => __('Plugin Description'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('A description that the Plugins author has given to the Plugin.') ), 'status' => array( 'display' => $config['poller_id'] == 1 ? __('Status'):__('Main / Remote Status'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The status of this Plugin.') ), 'author' => array( 'display' => __('Author'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The author of this Plugin.') ), 'requires' => array( 'display' => __('Requires'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('This Plugin requires the following Plugins be installed first.') ), 'version' => array( 'display' => __('Version'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The version of this Plugin.') ), 'id' => array( 'display' => __('Load Order'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The load order of the Plugin. You can change the load order by first sorting by it, then moving a Plugin either up or down.') ) ); html_header_sort($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), 1); $i = 0; if (cacti_sizeof($plugins)) { $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 || (get_request_var('sort_column') != 'id')) { $load_ordering = false; } else { $load_ordering = true; } form_alternate_row('', true); print format_plugin_row($plugin, $last_plugin, $load_ordering, $table); $i++; $j++; } } else { print '
";
break;
case '-4': // Plugins should have INFO file since 1.0.0
$link .= "
";
break;
case '-3': // Plugins can have spaces in their names
$link .= "
";
break;
case '-2': // Naming issues
$link .= "
";
break;
default: // Old PIA
$path = $config['base_path'] . '/plugins/' . $plugin['directory'];
$directory = $plugin['name'];
if (!file_exists("$path/setup.php")) {
$link .= "
";
} elseif (!file_exists("$path/INFO")) {
$link .= "
";
} elseif (in_array($directory, $plugins_integrated)) {
$link .= "
";
} else {
$link .= "
";
}
break;
}
if ($config['poller_id'] > 1) {
if (strpos($plugin['capabilities'], 'remote_collect:1') !== false || strpos($plugin['capabilities'], 'remote_poller:1') !== false) {
if ($plugin['remote_status'] == 1) { // Installed and Active
// TO-DO: Disabling here does not make much sense as the main will be replicated
// with any change of any other plugin thus undoing. Fix that moving forward
//$link .= "