$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_integrated; $ret = $parm; $p = array(); if (defined('IN_CACTI_INSTALL')) { return $ret; } /* order the plugins by order */ $result = db_fetch_assoc_prepared('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 = ? ORDER BY id ASC', array($name), true); if (!empty($result)) { foreach ($result as $hdata) { if (!in_array($hdata['name'], $plugins_integrated)) { $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; include_once($config['library_path'] . '/database.php'); $result = db_fetch_assoc('SHOW TABLES'); $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'] . '`)'; } if (isset($data['keys']) && sizeof($data['keys'])) { foreach ($data['keys'] as $key) { if (isset($key['name'])) { $sql .= ",\n INDEX `" . $key['name'] . '` (`' . $key['columns'] . '`)'; } } } if (isset($data['unique_keys'])) { foreach ($data['unique_keys'] as $key) { if (isset($key['name'])) { $sql .= ",\n UNIQUE INDEX `" . $key['name'] . '` (`' . $key['columns'] . '`)'; } } } $sql .= ') ENGINE = ' . $data['type']; if (isset($data['comment'])) { $sql .= " COMMENT = '" . $data['comment'] . "'"; } if (db_execute($sql)) { db_execute_prepared("INSERT INTO plugin_db_changes (plugin, `table`, method) VALUES (?, ?, 'create')", array($plugin, $table)); } } } function api_plugin_db_changes_remove ($plugin) { $tables = db_fetch_assoc_prepared("SELECT `table` FROM plugin_db_changes WHERE plugin = ? AND method ='create'", array($plugin), false); if (count($tables)) { foreach ($tables as $table) { db_execute('DROP TABLE IF EXISTS `' . $table['table'] . '`;'); } db_execute_prepared("DELETE FROM plugin_db_changes where plugin = ? AND method ='create'", array($plugin), false); } $columns = db_fetch_assoc_prepared("SELECT `table`, `column` FROM plugin_db_changes WHERE plugin = ? AND method ='addcolumn'", array($plugin), false); if (count($columns)) { foreach ($columns as $column) { db_execute('ALTER TABLE `' . $column['table'] . '` DROP `' . $column['column'] . '`'); } db_execute_prepared("DELETE FROM plugin_db_changes WHERE plugin = ? AND method = 'addcolumn'", array($plugin), 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 . '`'); $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_prepared("INSERT INTO plugin_db_changes (plugin, `table`, `column`, `method`) VALUES (?, ?, ?, 'addcolumn')", array($plugin, $table, $column['name'])); } } } function api_plugin_install ($plugin) { global $config; include_once($config['base_path'] . "/plugins/$plugin/setup.php"); $exists = db_fetch_assoc_prepared('SELECT id FROM plugin_config WHERE directory = ?', array($plugin), false); if (sizeof($exists)) { db_execute_prepared('DELETE FROM plugin_config WHERE directory = ?', array($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_prepared('INSERT INTO plugin_config (directory, name, author, webpage, version) VALUES (?, ?, ?, ?, ?)', array($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_prepared('UPDATE plugin_config SET status = 4 WHERE directory = ?', array($plugin)); } else { // Set the plugin as "needs configuration" db_execute_prepared('UPDATE plugin_config SET status = 2 WHERE directory = ?', array($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_prepared('DELETE FROM plugin_config WHERE directory = ?', array($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_prepared('UPDATE plugin_config SET status = 1 WHERE directory = ?', array($plugin)); } } function api_plugin_is_enabled ($plugin) { $status = db_fetch_cell_prepared('SELECT status FROM plugin_config WHERE directory = ?', array($plugin), false); if ($status == '1') return true; return false; } function api_plugin_disable ($plugin) { api_plugin_disable_hooks ($plugin); db_execute_prepared('UPDATE plugin_config SET status = 4 WHERE directory = ?', array($plugin)); } function api_plugin_disable_all ($plugin) { api_plugin_disable_hooks_all ($plugin); db_execute_prepared('UPDATE plugin_config SET status = 4 WHERE directory = ?', array($plugin)); } function api_plugin_moveup($plugin) { $id = db_fetch_cell_prepared('SELECT id FROM plugin_config WHERE directory = ?', array($plugin)); if (!empty($id)) { $temp_id = db_fetch_cell('SELECT MAX(id) FROM plugin_config')+1; $prior_id = db_fetch_cell_prepared('SELECT MAX(id) FROM plugin_config WHERE id < ?', array($id)); /* update the above plugin to the prior temp id */ db_execute_prepared('UPDATE plugin_config SET id = ? WHERE id = ?', array($temp_id, $prior_id)); db_execute_prepared('UPDATE plugin_config SET id = ? WHERE id = ?', array($prior_id, $id)); db_execute_prepared('UPDATE plugin_config SET id = ? WHERE id = ?', array($id, $temp_id)); } } function api_plugin_movedown($plugin) { $id = db_fetch_cell_prepared('SELECT id FROM plugin_config WHERE directory = ?', array($plugin)); $temp_id = db_fetch_cell('SELECT MAX(id) FROM plugin_config')+1; $next_id = db_fetch_cell_prepared('SELECT MIN(id) FROM plugin_config WHERE id > ?', array($id)); /* update the above plugin to the prior temp id */ db_execute_prepared('UPDATE plugin_config SET id = ? WHERE id = ?', array($temp_id, $next_id)); db_execute_prepared('UPDATE plugin_config SET id = ? WHERE id = ?', array($next_id, $id)); db_execute_prepared('UPDATE plugin_config SET id = ? WHERE id = ?', array($id, $temp_id)); } function api_plugin_register_hook ($plugin, $hook, $function, $file) { $exists = db_fetch_assoc_prepared('SELECT id FROM plugin_hooks WHERE name = ? AND hook = ?', array($plugin, $hook), false); if (!count($exists)) { $settings = array('config_settings', 'config_arrays', 'config_form'); if (!in_array($hook, $settings)) { db_execute_prepared('INSERT INTO plugin_hooks (name, hook, function, file) VALUES (?, ?, ?, ?)', array($plugin, $hook, $function, $file)); } else { db_execute_prepared('INSERT INTO plugin_hooks (name, hook, function, file, status) VALUES (?, ?, ?, ?, 1)', array($plugin, $hook, $function, $file)); } } } function api_plugin_remove_hooks ($plugin) { db_execute_prepared('DELETE FROM plugin_hooks WHERE name = ?', array($plugin)); } function api_plugin_enable_hooks ($plugin) { db_execute_prepared('UPDATE plugin_hooks SET status = 1 WHERE name = ?', array($plugin)); } function api_plugin_disable_hooks ($plugin) { db_execute_prepared("UPDATE plugin_hooks SET status = 0 WHERE name = ? AND hook != 'config_settings' AND hook != 'config_arrays' AND hook != 'config_form'", array($plugin)); } function api_plugin_disable_hooks_all ($plugin) { db_execute_prepared("UPDATE plugin_hooks SET status = 0 WHERE name = ?", array($plugin)); } function api_plugin_register_realm ($plugin, $file, $display, $admin = false) { $exists = db_fetch_assoc_prepared('SELECT id FROM plugin_realms WHERE plugin = ? AND file = ?', array($plugin, $file), false); if (!count($exists)) { db_execute_prepared('INSERT INTO plugin_realms (plugin, file, display) VALUES (?, ?, ?)', array($plugin, $file, $display)); if ($admin) { $realm_id = db_fetch_assoc_prepared('SELECT id FROM plugin_realms WHERE plugin = ? AND file = ?', array($plugin, $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_prepared('SELECT realm_id FROM user_auth_realm WHERE user_id = ? and realm_id = ?', array($user_id, $realm_id), false); if (!count($exists)) { db_execute_prepared('INSERT INTO user_auth_realm (user_id, realm_id) VALUES (?, ?)', array($user_id, $realm_id)); } } } } } function api_plugin_remove_realms ($plugin) { $realms = db_fetch_assoc_prepared('SELECT id FROM plugin_realms WHERE plugin = ?', array($plugin), false); foreach ($realms as $realm) { $id = $realm['id'] + 100; db_execute_prepared('DELETE FROM user_auth_realm WHERE realm_id = ?', array($id)); db_execute_prepared('DELETE FROM user_auth_group_realm WHERE realm_id = ?', array($id)); } db_execute_prepared('DELETE FROM plugin_realms WHERE plugin = ?', array($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_auth_realm_filenames; /* list all realms that this user has access to */ if ($filename != '' && isset($user_auth_realm_filenames[basename($filename)])) { if (is_realm_allowed($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; }