#!/usr/bin/env php 1) { db_switch_remote_to_main(); print 'NOTE: Repairing Tables for Main Database' . PHP_EOL; } else { print 'NOTE: Repairing Tables for Local Database' . PHP_EOL; } } else { print 'NOTE: Repairing Tables for Local Database' . PHP_EOL; } global $cacti_version_codes; // we need to rerun the upgrade, force the current version if ($forcever == '') { $old_cacti_version = format_cacti_version(get_cacti_db_version(),3); } else { $old_cacti_version = format_cacti_version($forcever, 3); } // try to find current (old) version in the array $old_version_index = (array_key_exists($old_cacti_version, $cacti_version_codes) ? $old_cacti_version : ''); // do a version check if (cacti_version_compare($old_cacti_version,CACTI_VERSION,'=')) { exit_version_error($old_cacti_version, 'Your Cacti is already up to date'); } elseif (cacti_version_compare($old_cacti_version,'0.7','<')) { exit_error('You are attempting to install cacti ' . CACTI_VERSION . ' onto a 0.6.x database.' . PHP_EOL . ("To continue, you must create a new database, import 'cacti.sql' into " . 'it,') . PHP_EOL . "and\tupdate 'include/config.php' to point to the new database."); } elseif (empty($old_cacti_version)) { exit_error('You have created a new database, but have not yet imported the \'cacti.sql\' file.'); exit; } elseif ($old_version_index == '') { exit_version_error($old_cacti_version, 'Unable to identify version, cannot upgrade.'); } if (!register_process_start('install', 'master', 0, 86400)) { exit_error('An installation or upgrade is already in progress.'); } $upgrade_failed = false; try { print 'Upgrading from v' . get_cacti_version_text(false, $old_cacti_version) . PHP_EOL; $prev_cacti_version = $old_cacti_version; $orig_cacti_version = get_cacti_db_version(); // loop through versions from old version to the current, performing updates for each version in the chain foreach ($cacti_version_codes as $cacti_upgrade_version => $hash_code) { // skip versions old than the database version if (cacti_version_compare($old_cacti_version, $cacti_upgrade_version, '>=')) { continue; } // construct version upgrade include path $upgrade_file = CACTI_PATH_INSTALL . '/upgrades/' . str_replace('.', '_', $cacti_upgrade_version) . '.php'; $upgrade_function = 'upgrade_to_' . str_replace('.', '_', $cacti_upgrade_version); // check for upgrade version file, then include, check for function and execute if (file_exists($upgrade_file)) { print 'Performing Database Upgrade' . PHP_EOL; print ' - from v' . $prev_cacti_version . ' (DB ' . $orig_cacti_version . ')' . PHP_EOL; print ' to v' . $cacti_upgrade_version . PHP_EOL; include($upgrade_file); if (function_exists($upgrade_function)) { call_user_func($upgrade_function); $status = db_install_errors($cacti_upgrade_version); } else { $status = DB_STATUS_ERROR; print 'Error: upgrade function (' . $upgrade_function . ') not found' . PHP_EOL; } if ($status <= DB_STATUS_WARNING) { $upgrade_failed = true; break; } $prev_cacti_version = $cacti_upgrade_version; } // Forced replays may start below the installed schema version. Only // advance it, so a later failure cannot leave an older version recorded. if (cacti_version_compare($orig_cacti_version, $cacti_upgrade_version, '<')) { if (!db_execute_prepared('UPDATE version SET cacti = ?', [$cacti_upgrade_version])) { $upgrade_failed = true; break; } $orig_cacti_version = $cacti_upgrade_version; } if (cacti_version_compare(CACTI_VERSION, $cacti_upgrade_version, '=')) { $upgrade_failed = !db_execute_prepared('UPDATE version SET cacti = ?', [CACTI_VERSION_FULL]); break; } } } finally { unregister_process('install', 'master', 0); } print PHP_EOL; exit($upgrade_failed ? 1 : 0); function exit_error(string $text) : void { print "ERROR: $text" . PHP_EOL; exit(1); } function exit_version_error(string $old_cacti_version, string $text) : void { exit_error($text . PHP_EOL . ' - from: v' . get_cacti_version_text(false, $old_cacti_version) . PHP_EOL . ' to: v' . CACTI_VERSION_BRIEF_FULL); } function db_install_errors(string $cacti_version) : int { global $database_upgrade_status, $debug, $database_statuses; $error_status = DB_STATUS_SKIPPED; if (!isset($database_upgrade_status)) { $database_upgrade_status = []; } if (cacti_sizeof($database_upgrade_status)) { if (isset($database_upgrade_status[$cacti_version])) { foreach ($database_upgrade_status[$cacti_version] as $cache_item) { $status = $cache_item['status']; $error = empty($cache_item['error']) ? '' : $cache_item['error']; $sql = $cache_item['sql']; if ($error_status > $status) { $error_status = $status; } if ($debug || $status < DB_STATUS_SUCCESS) { $db_status = '[Unknown]'; if (isset($database_statuses[$status])) { $db_status = $database_statuses[$status]; } $sep1 = '################################'; $sep2 = '+------------------------------+'; printf('%s%s%s%-10s - %s%s%s%s%s%s%s%s', PHP_EOL, $sep1, PHP_EOL, $db_status, $error, PHP_EOL, $sep2, PHP_EOL, clean_up_lines($sql), PHP_EOL, $sep1, PHP_EOL); } } } } return $error_status; } /** * display_version - displays version information * * @return (void) */ function display_version() : void { $version = get_cacti_cli_version(); print "Cacti Database Upgrade Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } /** * display_help - displays help information * * @return void */ function display_help() : void { display_version(); print PHP_EOL . 'usage: upgrade_database.php [--debug] [--forcever=VERSION]' . PHP_EOL . PHP_EOL; print 'A command line version of the Cacti database upgrade tool. You must execute' . PHP_EOL; print 'this command as a super user, or someone who can write a PHP session file.' . PHP_EOL; print 'Typically, this user account will be apache, www-run, or root.' . PHP_EOL . PHP_EOL; print 'If you are running a beta or alpha version of Cacti and need to rerun' . PHP_EOL; print 'the upgrade script, simply set the forcever to the previous release.' . PHP_EOL . PHP_EOL; print '--forcever - Force the starting version, say ' . CACTI_VERSION . PHP_EOL; print '--local - Perform the action on the Remote Data Collector if run from there' . PHP_EOL; print '--debug - Display verbose output during execution' . PHP_EOL . PHP_EOL; }