#!/usr/bin/env php 1) { db_switch_remote_to_main(); } // process calling arguments $parms = $_SERVER['argv']; array_shift($parms); if (cacti_sizeof($parms)) { $host_template_ids = []; $host_ids = []; $graph_template_ids = []; $regex = []; $graph_ids = []; $graphTemplates = getGraphTemplates(); $hostTemplates = getHostTemplates(); $all = false; $force = false; $list = false; $preserve = false; $listHosts = false; $listGraphTemplates = false; $listHostTemplates = false; $quietMode = false; $shortopts = 'VvHh'; $longopts = [ 'host-id::', 'graph-type::', 'graph-template-id::', 'host-template-id::', 'graph-id::', 'graph-regex::', 'all', 'preserve', 'quiet', 'list', 'list-hosts', 'list-host-templates', 'list-graph-templates', 'force', 'version', 'help' ]; $options = getopt($shortopts, $longopts); foreach ($options as $arg => $value) { switch($arg) { case 'graph-regex': if (!is_array($value)) { $value = [$value]; } $regex = $value; foreach ($value as $item) { if (!validate_is_regex($item)) { print "ERROR: Regex specified '$item', is not a valid Regex!" . PHP_EOL; exit(1); } } break; case 'graph-template-id': if (!is_array($value)) { $value = [$value]; } $graph_template_ids = $value; break; case 'host-template-id': if (!is_array($value)) { $value = [$value]; } $host_template_ids = $value; break; case 'preserve': $preserve = true; break; case 'all': $all = true; break; case 'graph-id': if (!is_array($value)) { $value = [$value]; } $graph_ids = $value; break; case 'host-id': if (!is_array($value)) { $value = [$value]; } $host_ids = $value; break; case 'all': $all = true; break; case 'list': $list = true; break; case 'list-hosts': $listHosts = true; break; case 'list-graph-templates': $listGraphTemplates = true; break; case 'list-host-templates': $listHostTemplates = true; break; case 'force': $force = true; break; case 'version': case 'V': case 'v': display_version(); exit(0); case 'help': case 'H': case 'h': display_help(); exit(0); default: print "ERROR: Invalid Argument: ($arg)" . PHP_EOL . PHP_EOL; display_help(); exit(1); } } } else { display_help(); exit(0); } if ($list && $force) { print 'The --list and --force options are mutually exclusive. Pick one or the other.' . PHP_EOL; exit(1); } if (cacti_sizeof($host_template_ids)) { foreach ($host_template_ids as $id) { if (!is_numeric($id) || $id <= 0) { print "FATAL: Host Template ID $id is invalid" . PHP_EOL; exit(1); } } } if (cacti_sizeof($graph_template_ids)) { foreach ($graph_template_ids as $id) { if (!is_numeric($id) || $id <= 0) { print "FATAL: Graph Template ID $id is invalid" . PHP_EOL; exit(1); } } } if (cacti_sizeof($host_ids)) { foreach ($host_ids as $id) { if (!is_numeric($id) || $id < 0) { print "FATAL: Host ID $id is invalid" . PHP_EOL; exit(1); } } } if (cacti_sizeof($graph_ids)) { foreach ($graph_ids as $id) { if (!is_numeric($id) || $id <= 0) { print "FATAL: Graph ID $id is invalid" . PHP_EOL; exit(1); } } } if ($listHosts) { $hosts = getHosts($host_template_ids); displayHosts($hosts, $quietMode); exit(0); } if ($listHostTemplates) { $hostTemplates = getHostTemplates(); displayHostTemplates($hostTemplates, $quietMode); exit(0); } if ($listGraphTemplates) { $graphTemplates = getGraphTemplatesByHostTemplate($host_template_ids); displayGraphTemplates($graphTemplates, $quietMode); exit(0); } else { $sql_where = 'WHERE gl.id > 0'; $all_option = true; if (cacti_sizeof($host_ids) && $all === false) { $sql_where .= ' AND gl.host_id IN (' . implode(',', $host_ids) . ')'; $all_option = false; } /* Only join the host table when --host-template-id filtering is active, * since that is the only clause that references the h alias. An INNER JOIN * would silently exclude graphs with host_id=0 (no matching host row). */ $sql_join = ''; if (cacti_sizeof($host_template_ids) && $all === false) { $sql_join = 'INNER JOIN host AS h ON h.id = gl.host_id'; $sql_where .= ' AND h.host_template_id IN (' . implode(',', $host_template_ids) . ')'; $all_option = false; } if (cacti_sizeof($graph_template_ids) && $all === false) { $sql_where .= ' AND gl.graph_template_id IN (' . implode(',', $graph_template_ids) . ')'; $all_option = false; } if (cacti_sizeof($regex) && $all === false) { $sql_where .= ' AND ('; $sql_cwhere = ''; foreach ($regex as $r) { $sql_cwhere .= ($sql_cwhere == '' ? '' : ' OR ') . 'title_cache RLIKE "' . $r . '"'; } $sql_where .= $sql_cwhere . ')'; $all_option = false; } if ($all_option && $all === false && $list === false) { print ('ERROR: The options specified will remove all graphs. To do this you ' . 'must use the --all option. Exiting') . PHP_EOL; exit(1); } $graphs = db_fetch_assoc("SELECT gl.id, gtg.title_cache FROM graph_local AS gl INNER JOIN graph_templates_graph AS gtg ON gl.id=gtg.local_graph_id $sql_join $sql_where"); if ($graphs != false && cacti_sizeof($graphs)) { print 'There are ' . cacti_sizeof($graphs) . ' Graphs to Remove.' . (!$force ? ' Use the --force option to remove these Graphs.' : ''); if ($list) { print PHP_EOL . "ID\tGraphName" . PHP_EOL; foreach ($graphs as $graph) { print $graph['id'] . "\t" . $graph['title_cache'] . PHP_EOL; } } elseif ($force) { $local_graph_ids = array_rekey($graphs, 'id', 'id'); if ($preserve) { print ' Data Sources will be preserved.' . PHP_EOL; $delete_type = 1; } else { print ' Data Sources will be removed if possible.' . PHP_EOL; $delete_type = 2; } api_delete_graphs($local_graph_ids, $delete_type); print 'Delete Operation Completed' . PHP_EOL; } else { print PHP_EOL . ' Use the --list option to view the list of Graphs' . PHP_EOL; } } else { print 'No matching Graphs found.' . PHP_EOL; exit(1); } } exit(0); /** * display_version - displays version information * * @return void */ function display_version() : void { $version = get_cacti_cli_version(); print "Cacti Remove Graphs Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } /** * display_help - displays help information * * @return void */ function display_help() : void { display_version(); print PHP_EOL . 'usage: remove_graphs.php --graph-template-id=ID [--host-template-id=ID' . PHP_EOL; print ' [--host-id=ID] [--graph-regex=R]' . PHP_EOL; print ' [--force] [--preserve]' . PHP_EOL . PHP_EOL; print 'Cacti utility for removing Graphs through the command line.' . PHP_EOL . PHP_EOL; print 'Options:' . PHP_EOL; print ' --graph-template-id=ID Mandatory list of Graph Templates.' . PHP_EOL; print ' --host-template-id=ID Optional list of Device Templates.' . PHP_EOL; print ' --host-id=ID Optional list of Device IDs.' . PHP_EOL; print ' --graph-id=ID Optional list of Graphs.' . PHP_EOL; print ' --graph-regex=R Optional Graph name regular expression.' . PHP_EOL; print ' --all Remove all Graphs. Ignore other settings.' . PHP_EOL; print ' --force Actually remove the Graphs, dont just list.' . PHP_EOL; print ' --preserve Preserve the Data Sources. Default is to remove.' . PHP_EOL . PHP_EOL; print 'By default, you must provide from one to many graph-template-id. Device Template IDs' . PHP_EOL; print 'Device IDs and the regular expression are optional. If you wish to specify multiple' . PHP_EOL; print 'IDs, just repeat the parameter ex: --host-template-id=X --host-template-id=Y' . PHP_EOL . PHP_EOL; print 'By default, this utility will only report on the number of Graphs that will be removed. If you' . PHP_EOL; print 'provide the --force option, the Graphs will actually be removed. If you use the --list option' . PHP_EOL; print 'each of the Graphs to be removed, will be listed. Options --list and --force are' . PHP_EOL; print 'mutually exclusive.' . PHP_EOL . PHP_EOL; print 'List Options:' . PHP_EOL; print ' --list' . PHP_EOL; print ' --list-hosts [--host-template-id=ID]' . PHP_EOL; print ' --list-graph-templates [--host-template-id=ID]' . PHP_EOL; print ' --list-host-templates' . PHP_EOL . PHP_EOL; }