mirror of
https://github.com/Cacti/cacti.git
synced 2026-10-26 21:18:40 +09:00
391 lines
14 KiB
PHP
Executable File
391 lines
14 KiB
PHP
Executable File
#!/usr/bin/env php
|
|
<?php
|
|
/*
|
|
+-------------------------------------------------------------------------+
|
|
| Copyright (C) 2004-2023 The Cacti Group |
|
|
| |
|
|
| This program is free software; you can redistribute it and/or |
|
|
| modify it under the terms of the GNU General Public License |
|
|
| as published by the Free Software Foundation; either version 2 |
|
|
| of the License, or (at your option) any later version. |
|
|
| |
|
|
| This program is distributed in the hope that it will be useful, |
|
|
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
| GNU General Public License for more details. |
|
|
+-------------------------------------------------------------------------+
|
|
| Cacti: The Complete RRDtool-based Graphing Solution |
|
|
+-------------------------------------------------------------------------+
|
|
| This code is designed, written, and maintained by the Cacti Group. See |
|
|
| about.php and/or the AUTHORS file for specific developer information. |
|
|
+-------------------------------------------------------------------------+
|
|
| http://www.cacti.net/ |
|
|
+-------------------------------------------------------------------------+
|
|
*/
|
|
|
|
require(__DIR__ . '/../include/cli_check.php');
|
|
require_once($config['base_path'] . '/install/functions.php');
|
|
|
|
/* process calling arguments */
|
|
$parms = $_SERVER['argv'];
|
|
array_shift($parms);
|
|
|
|
global $debug;
|
|
|
|
$debug = false;
|
|
$options = array('Runtime' => 'Cli');
|
|
|
|
$should_install = false;
|
|
$force_install = false;
|
|
|
|
display_version();
|
|
|
|
error_reporting(E_ALL);
|
|
db_execute("DELETE FROM settings WHERE name like 'log_install%' or name = 'install_eula'");
|
|
define('log_install_echo', 'on');
|
|
|
|
if (cacti_sizeof($parms)) {
|
|
foreach($parms as $parameter) {
|
|
if (strpos($parameter, '=')) {
|
|
list($arg, $value) = explode('=', $parameter);
|
|
} else {
|
|
$arg = $parameter;
|
|
$value = '';
|
|
}
|
|
|
|
switch ($arg) {
|
|
/* Standard parameters */
|
|
case '-d':
|
|
case '--debug':
|
|
$logname = 'log_install';
|
|
$tmplevel = false;
|
|
if (!empty($value)) {
|
|
$pos = strpos($value,':');
|
|
if ($pos !== false) {
|
|
$tmplevel = substr($value,$pos+1);
|
|
$value = substr($value,0,$pos);
|
|
}
|
|
if (!empty($value)) {
|
|
$logname .= '_' . $value;
|
|
}
|
|
}
|
|
if ($tmplevel !== false) {
|
|
$level = $tmplevel;
|
|
} else {
|
|
$level = log_install_level($logname, POLLER_VERBOSITY_NONE) + 1;
|
|
}
|
|
$level = log_install_level_sanitize($level);
|
|
set_config_option($logname, $level);
|
|
break;
|
|
case '--version':
|
|
case '-V':
|
|
case '-v':
|
|
exit(0);
|
|
case '--help':
|
|
case '-H':
|
|
case '-h':
|
|
display_help();
|
|
exit(0);
|
|
|
|
/* Script specific parameters */
|
|
case '--accept-eula':
|
|
set_install_option($options, 'Eula', 'End User License Agreement', 'Accepted');
|
|
break;
|
|
case '--automationmode':
|
|
case '-am':
|
|
set_install_option($options, 'AutomationMode', 'Automation Enabled', $value);
|
|
break;
|
|
case '--automationrange':
|
|
case '-ar':
|
|
set_install_option($options, 'AutomationRange', 'Automation Range', $value);
|
|
break;
|
|
case '--cron':
|
|
case '-c':
|
|
set_install_option($options, 'CronInterval', 'Cron Interval', $value);
|
|
break;
|
|
case '--force':
|
|
case '-f':
|
|
$force_install = true;
|
|
break;
|
|
case '--ini':
|
|
case '-i':
|
|
get_install_option($options, $value, false);
|
|
break;
|
|
case '--json':
|
|
case '-j':
|
|
get_install_option($options, $value, true);
|
|
break;
|
|
case '--install':
|
|
$should_install = true;
|
|
break;
|
|
case '--language':
|
|
case '--lang':
|
|
case '-l':
|
|
set_install_option($options, 'Language', 'Language', $value);
|
|
break;
|
|
case '--mode':
|
|
case '-m':
|
|
set_install_option($options, 'Mode', 'Mode', $value);
|
|
break;
|
|
case '--profile':
|
|
case '-p':
|
|
set_install_option($options, 'Profile', 'Collection Profile', $value);
|
|
break;
|
|
case '--path':
|
|
set_install_multioption($options, 'Paths', 'Path Option', $value, 'path_');
|
|
break;
|
|
case '--rrdtool':
|
|
case '-r':
|
|
set_install_option($options, 'RRDVersion', 'RRDTool Version', $value);
|
|
break;
|
|
case '--snmp':
|
|
set_install_multioption($options, 'SnmpOptions', 'Snmp Option', $value, 'Snmp');
|
|
break;
|
|
case '--table':
|
|
set_install_multioption($options, 'Tables', 'Table', $value, '');
|
|
break;
|
|
case '--template':
|
|
set_install_multioption($options, 'Templates', 'Template', $value, 'chk_template_', true);
|
|
break;
|
|
case '--theme':
|
|
case '-t':
|
|
set_install_option($options, 'Theme', 'Theme', $value);
|
|
break;
|
|
|
|
/* Bad or unexpected parameter! */
|
|
default:
|
|
print 'ERROR: Invalid Parameter ' . $parameter . PHP_EOL . PHP_EOL;
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
include_once($config['base_path'] . '/lib/api_automation.php');
|
|
include_once($config['base_path'] . '/lib/api_automation_tools.php');
|
|
include_once($config['base_path'] . '/lib/api_data_source.php');
|
|
include_once($config['base_path'] . '/lib/api_device.php');
|
|
include_once($config['base_path'] . '/lib/data_query.php');
|
|
include_once($config['base_path'] . '/lib/import.php');
|
|
include_once($config['base_path'] . '/lib/installer.php');
|
|
require_once($config['base_path'] . '/lib/poller.php');
|
|
include_once($config['base_path'] . '/lib/utility.php');
|
|
|
|
$options['Step'] = Installer::STEP_INSTALL_CONFIRM;
|
|
|
|
$results = array('Step' => $options['Step']);
|
|
$update_char = 'o';
|
|
|
|
debug_install_array('Options', $options);
|
|
$installer = new Installer($options);
|
|
$results = $installer->jsonSerialize();
|
|
debug_install_array('Result', $results);
|
|
|
|
process_install_errors($results);
|
|
|
|
$install_mode = 'no';
|
|
switch ($installer->getMode()) {
|
|
case Installer::MODE_INSTALL:
|
|
$install_mode = 'INSTALL CORE';
|
|
break;
|
|
case Installer::MODE_POLLER:
|
|
$install_mode = 'INSTALL POLLER';
|
|
break;
|
|
case Installer::MODE_UPGRADE:
|
|
$install_mode = 'UPGRADE';
|
|
break;
|
|
case Installer::MODE_DOWNGRADE:
|
|
$install_mode = 'DOWNGRADE';
|
|
break;
|
|
}
|
|
log_install_always('cli', 'Installer prepared for ' . $install_mode . ' action');
|
|
|
|
$message = '';
|
|
if ($installer->getStep() == Installer::STEP_INSTALL_CONFIRM && $should_install) {
|
|
$time = '';
|
|
if ($force_install) {
|
|
$time = '-b';
|
|
}
|
|
log_install_always('cli', 'Starting installation...');
|
|
Installer::beginInstall($time, $installer);
|
|
log_install_always('cli', 'Finished installation...');
|
|
}
|
|
|
|
$step = $installer->getStep();
|
|
log_install_high('cli','getStep(): ' . $step);
|
|
switch ($installer->getStep()) {
|
|
case Installer::STEP_INSTALL:
|
|
log_install_always('cli', 'An Installation was already in progress');
|
|
break;
|
|
case Installer::STEP_INSTALL_CONFIRM:
|
|
log_install_always('cli', 'No errors were detected. Install not performed as --install not specified');
|
|
break;
|
|
case Installer::STEP_ERROR:
|
|
log_install_always('cli', 'One or more errors occurred during install, please refer to log files');
|
|
process_install_errors(array('Errors'=>$installer->getErrors()));
|
|
break;
|
|
case Installer::STEP_COMPLETE:
|
|
log_install_always('cli', 'Installation has now completed, you may launch the web console');
|
|
break;
|
|
default:
|
|
log_install_always('cli', 'Unexpected step (' . $installer->getStep() . ')');
|
|
break;
|
|
}
|
|
print PHP_EOL;
|
|
|
|
/* get_install_option - gets the install options from a json file */
|
|
function get_install_option(&$options, $file, $json = true) {
|
|
if (empty($file)) {
|
|
print 'ERROR: Invalid file specified, unable to import options';
|
|
exit(1);
|
|
}
|
|
|
|
if ($json) {
|
|
$contents = @file_get_contents($file);
|
|
if (empty($contents)) {
|
|
print 'ERROR: Unable to import options from file ' . $file;
|
|
exit(1);
|
|
}
|
|
|
|
$options = @json_decode($contents, true);
|
|
if (empty($options)) {
|
|
print 'ERROR: Failed to decode options in file ' . $file;
|
|
exit(1);
|
|
}
|
|
} else {
|
|
$options = @parse_ini_file($file);
|
|
if (empty($options)) {
|
|
print 'ERROR: Unable to import options from file ' . $file;
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* set_install_option - sets and optional displays debug line of action */
|
|
function set_install_option(&$options, $key, $display_name, $value) {
|
|
global $debug;
|
|
|
|
$options[$key] = $value;
|
|
log_install_high('cli',sprintf('Setting %s to \'%s\'', $display_name, $value));
|
|
}
|
|
|
|
/* set_install_multioption - sets sub-options that have multiple key/value combinations with optional prefix */
|
|
function set_install_multioption(&$options, $key, $display_name, $value, $prefix, $replace_dots = false) {
|
|
$option_pos = strpos($value, ':');
|
|
if ($option_pos !== false) {
|
|
$option_name = trim(substr($value, 0, $option_pos));
|
|
if ($replace_dots) {
|
|
$option_name = str_replace('.', '_', $option_name);
|
|
}
|
|
$prefix_len = strlen($prefix);
|
|
if ($prefix_len > 0 && substr($option_name, 0, $prefix_len) == $prefix) {
|
|
$option_key = $option_name;
|
|
$option_name = substr($option_key, $prefix_len);
|
|
} else {
|
|
$option_key = $prefix . $option_name;
|
|
}
|
|
$option_value = trim(substr($value, $option_pos + 1));
|
|
set_install_option($options[$key], $option_key, $display_name . ' \'' . $option_name . '\'', $option_value);
|
|
} else {
|
|
echo 'ERROR: Invalid ' . $display_name . ' value ' . $value . PHP_EOL . PHP_EOL;
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
function debug_install_array($parent, $contents, $indent = 0) {
|
|
$hasContents = false;
|
|
foreach ($contents as $key => $value) {
|
|
if (is_array($value) || is_object($value)) {
|
|
debug_install_array($parent . '.' . $key, $value, $indent + 1);
|
|
} else {
|
|
$hasContents = true;
|
|
log_install_debug('cli',$parent . '.' . $key . ': ' . $value);
|
|
}
|
|
}
|
|
|
|
if (!$hasContents) {
|
|
log_install_debug('cli',$parent . ' (no items)');
|
|
}
|
|
}
|
|
|
|
function process_install_errors($results) {
|
|
if (isset($results['Errors']) && cacti_sizeof($results['Errors']) > 0) {
|
|
$errors = $results['Errors'];
|
|
$count = 0;
|
|
$sections = 0;
|
|
|
|
foreach ($errors as $error_section => $error_array) {
|
|
$sections++;
|
|
print $error_section . PHP_EOL;
|
|
foreach ($error_array as $error_key => $error) {
|
|
$count++;
|
|
print $error_key . ' Error #' . $count . ' - ' . $error . PHP_EOL;
|
|
}
|
|
}
|
|
|
|
print PHP_EOL . 'Unable to continue as ' . $count . ' issue' . ($count == 1?'':'s') . ' in ' . $sections . ' section' . ($sections == 1?'':'s') . ' were found.' . PHP_EOL;
|
|
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
/* display_version - displays version information */
|
|
function display_version() {
|
|
$version = get_cacti_cli_version();
|
|
print "Cacti Install Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL;
|
|
}
|
|
|
|
/* display_help - displays the usage of the function */
|
|
function display_help () {
|
|
print PHP_EOL . 'usage: install_cacti.php [--debug] --accept-eula ' . PHP_EOL;
|
|
print ' [--automationmode=] [--automationrange=] [--cron=]' . PHP_EOL;
|
|
print ' [--language=] [--mode=] [--profile=] [--path=]' . PHP_EOL;
|
|
print ' [--rrdtool=] [--snmp=] [--table=] [--template=]' . PHP_EOL;
|
|
print ' [--theme=]' . PHP_EOL;
|
|
print PHP_EOL . 'A utility to install/upgrade Cacti to the currently sourced version' . PHP_EOL;
|
|
print PHP_EOL . 'Flags:' . PHP_EOL;
|
|
print ' -d | --debug - Display verbose output during execution' . PHP_EOL;
|
|
print ' -h | --help - Display this help' . PHP_EOL;
|
|
print ' -v | --version - Display version' . PHP_EOL;
|
|
print ' -f | --force - Override certain safety checks' . PHP_EOL;
|
|
print PHP_EOL . 'Required:' . PHP_EOL;
|
|
print ' --accept-eula - Accept the End User License Agreement' . PHP_EOL;
|
|
print ' --install - Perform the installation' . PHP_EOL;
|
|
print PHP_EOL . 'Optional:' . PHP_EOL;
|
|
print ' -am | --automationmode - Enable/Disable automatic network discovery' . PHP_EOL;
|
|
print ' -ar | --automationrange - Set automatic network discovery subnet' . PHP_EOL;
|
|
print ' -c | --cron - Set the cron interval' . PHP_EOL;
|
|
print ' -l | --lang[uage] - Set system language' . PHP_EOL;
|
|
print ' -m | --mode - Set the installation mode' . PHP_EOL;
|
|
print ' -p | --profile - Set the default Data Collector profile' . PHP_EOL;
|
|
print ' -r | --rrdtool - Set the RRD Tool version' . PHP_EOL;
|
|
print ' -t | --theme - Set system theme' . PHP_EOL;
|
|
print ' -i | --ini - Load settings from ini file' . PHP_EOL;
|
|
print ' -j | --json - Load settings from json file' . PHP_EOL;
|
|
print PHP_EOL . 'Multi-value optional:' . PHP_EOL;
|
|
print ' These options may be used more than once to apply multiple values. All' . PHP_EOL;
|
|
print ' values should be in "option_key:option_value" format (see below). If an' . PHP_EOL;
|
|
print ' option has a prefix, this is optional and is automatically added to the' . PHP_EOL;
|
|
print ' the option_key specified if it does not start with that prefix' . PHP_EOL . PHP_EOL;
|
|
print ' Note: reusing an option_key will replace its value with the last one' . PHP_EOL;
|
|
print ' specified.' .PHP_EOL . PHP_EOL;
|
|
print ' --path - Sets path locations. Example: ' . PHP_EOL;
|
|
print ' --path=cactilog:/usr/share/cacti/log/cacti.log' . PHP_EOL;
|
|
print ' --path=cactilog:c:\cacti\log\cacti.log' . PHP_EOL;
|
|
print ' Prefix: path_' . PHP_EOL;
|
|
print PHP_EOL;
|
|
print ' --snmp - Sets default snmp options. Example:' . PHP_EOL;
|
|
print ' --snmp=SnmpCommunity:public' . PHP_EOL;
|
|
print ' --snmp=Community:public' . PHP_EOL;
|
|
print ' Prefix: Snmp' . PHP_EOL;
|
|
print PHP_EOL;
|
|
print ' Note: the following two options expect a value of either 1 (Action) or' . PHP_EOL;
|
|
print ' 0 (Skip)' . PHP_EOL;
|
|
print PHP_EOL;
|
|
print ' --template - Sets templates to be installed. Example:' . PHP_EOL;
|
|
print ' --template=Cisco_Router.xml.gz:1' . PHP_EOL;
|
|
print PHP_EOL;
|
|
print ' --table - Selects a table to be converted to UTF8. Example:' . PHP_EOL;
|
|
print ' --table=plugin_config:1' . PHP_EOL;
|
|
print PHP_EOL;
|
|
}
|