���ѧۧݧ�ӧ�� �ާ֧ߧ֧էا֧� - ���֧էѧܧ�ڧ��ӧѧ�� - /home3/cpr76684/public_html/cli.tar
���ѧ٧ѧ�
purge_caches.php 0000644 00000004445 15151174103 0007712 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * CLI script to purge caches without asking for confirmation. * * @package core * @subpackage cli * @copyright 2011 David Mudrak <david@moodle.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); $longoptions = [ 'help' => false, 'muc' => false, 'theme' => false, 'lang' => false, 'js' => false, 'filter' => false, 'other' => false ]; list($options, $unrecognized) = cli_get_params($longoptions, ['h' => 'help']); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2); } if ($options['help']) { // The indentation of this string is "wrong" but this is to avoid a extra whitespace in console output. $help = <<<EOF Invalidates Moodle internal caches Specific caches can be defined (alone or in combination) using arguments. If none are specified, all caches will be purged. Options: -h, --help Print out this help --muc Purge all MUC caches (includes lang cache) --theme Purge theme cache --lang Purge language string cache --js Purge JavaScript cache --filter Purge text filter cache --other Purge all file caches and other miscellaneous caches (may include MUC if using cachestore_file). Example: \$ sudo -u www-data /usr/bin/php admin/cli/purge_caches.php EOF; echo $help; exit(0); } purge_caches(array_filter($options)); exit(0); mysql_compressed_rows.php 0000644 00000015041 15151174103 0011717 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * MySQL table row compression tool tool. * * @package core * @copyright 2014 Totara Learning Solutions Ltd {@link http://www.totaralms.com/} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @author Petr Skoda <petr.skoda@totaralms.com> */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir . '/clilib.php'); if ($DB->get_dbfamily() !== 'mysql') { cli_error('This script is used for MySQL databases only.'); } $engine = strtolower($DB->get_dbengine()); if ($engine !== 'innodb' and $engine !== 'xtradb') { cli_error('This script is for MySQL servers using InnoDB or XtraDB engines only.'); } list($options, $unrecognized) = cli_get_params( array('help' => false, 'info' => false, 'list' => false, 'fix' => false, 'showsql' => false), array('h' => 'help', 'i' => 'info', 'l' => 'list', 'f' => 'fix', 's' => 'showsql') ); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } $help = "Script for detection of row size problems in MySQL InnoDB tables. By default InnoDB storage table is using legacy Antelope file format which has major restriction on database row size. Use this script to detect and fix database tables with potential data overflow problems. Options: -i, --info Show database information -l, --list List problematic tables -f, --fix Attempt to fix all tables (requires SUPER privilege) -s, --showsql Print SQL statements for fixing of tables -h, --help Print out this help Example: \$ sudo -u www-data /usr/bin/php admin/cli/mysql_compressed_rows.php -l "; /** @var mysql_sql_generator $generator */ $generator = $DB->get_manager()->generator; $info = $DB->get_server_info(); $filepertable = $DB->get_record_sql("SHOW VARIABLES LIKE 'innodb_file_per_table'"); $filepertable = $filepertable ? $filepertable->value : ''; $fileformat = $DB->get_record_sql("SHOW VARIABLES LIKE 'innodb_file_format'"); $fileformat = $fileformat ? $fileformat->value : ''; $prefix = $DB->get_prefix(); $database = $CFG->dbname; if (!empty($options['info'])) { echo "Database version: " . $info['description'] . "\n"; echo "Database name: $database\n"; echo "Database engine: " . $DB->get_dbengine() . "\n"; echo "innodb_file_per_table: $filepertable\n"; echo "innodb_file_format: $fileformat\n"; exit(0); } else if (!empty($options['list'])) { $problem = false; foreach ($DB->get_tables(false) as $table) { $columns = $DB->get_columns($table, false); $size = $generator->guess_antelope_row_size($columns); $format = $DB->get_row_format($table); if ($size <= $generator::ANTELOPE_MAX_ROW_SIZE) { continue; } echo str_pad($prefix . $table, 32, ' ', STR_PAD_RIGHT); echo str_pad($format, 11, ' ', STR_PAD_RIGHT); if ($format === 'Compact' or $format === 'Redundant') { $problem = true; echo " (needs fixing)\n"; } else if ($format !== 'Compressed' and $format !== 'Dynamic') { echo " (unknown)\n"; } else { echo "\n"; } } if ($problem) { exit(1); } exit(0); } else if (!empty($options['fix'])) { $fixtables = array(); foreach ($DB->get_tables(false) as $table) { $columns = $DB->get_columns($table, false); $size = $generator->guess_antelope_row_size($columns); $format = $DB->get_row_format($table); if ($size <= $generator::ANTELOPE_MAX_ROW_SIZE) { continue; } if ($format === 'Compact' or $format === 'Redundant') { $fixtables[$table] = $table; } } if (!$fixtables) { echo "No changes necessary\n"; exit(0); } if ($filepertable !== 'ON') { try { $DB->execute("SET GLOBAL innodb_file_per_table=1"); } catch (dml_exception $e) { echo "Cannot enable GLOBAL innodb_file_per_table setting, use --showsql option and execute the statements manually."; throw $e; } } if ($fileformat !== 'Barracuda') { try { $DB->execute("SET GLOBAL innodb_file_format=Barracuda"); } catch (dml_exception $e) { echo "Cannot change GLOBAL innodb_file_format setting, use --showsql option and execute the statements manually."; throw $e; } } if (!$DB->is_compressed_row_format_supported(false)) { echo "MySQL server is not compatible with compressed row format."; exit(1); } foreach ($fixtables as $table) { $DB->change_database_structure("ALTER TABLE `{$prefix}$table` ROW_FORMAT=Compressed"); echo str_pad($prefix . $table, 32, ' ', STR_PAD_RIGHT) . " ... Compressed\n"; } exit(0); } else if (!empty($options['showsql'])) { $fixtables = array(); foreach ($DB->get_tables(false) as $table) { $columns = $DB->get_columns($table, false); $size = $generator->guess_antelope_row_size($columns); $format = $DB->get_row_format($table); if ($size <= $generator::ANTELOPE_MAX_ROW_SIZE) { continue; } if ($format === 'Compact' or $format === 'Redundant') { $fixtables[$table] = $table; } } if (!$fixtables) { echo "No changes necessary\n"; exit(0); } echo "Copy the following SQL statements and execute them using account with SUPER privilege:\n\n"; echo "USE $database;\n"; echo "SET SESSION sql_mode=STRICT_ALL_TABLES;\n"; echo "SET GLOBAL innodb_file_per_table=1;\n"; echo "SET GLOBAL innodb_file_format=Barracuda;\n"; foreach ($fixtables as $table) { echo "ALTER TABLE `{$prefix}$table` ROW_FORMAT=Compressed;\n"; } echo "\n"; exit(0); } else { echo $help; die; } error_log 0000644 00000000235 15151174103 0006457 0 ustar 00 [21-Nov-2025 21:14:35 America/Santiago] Exception ignored in shutdown function core\lock\mysql_lock_factory::auto_release: Error al leer de la base de datos cron.php 0000644 00000011653 15151174103 0006222 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * CLI cron * * This script looks through all the module directories for cron.php files * and runs them. These files can contain cleanup functions, email functions * or anything that needs to be run on a regular basis. * * @package core * @subpackage cli * @copyright 2009 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); // cli only functions require_once($CFG->libdir.'/cronlib.php'); // now get cli options list($options, $unrecognized) = cli_get_params( [ 'help' => false, 'stop' => false, 'list' => false, 'force' => false, 'enable' => false, 'disable' => false, 'disable-wait' => false, ], [ 'h' => 'help', 's' => 'stop', 'l' => 'list', 'f' => 'force', 'e' => 'enable', 'd' => 'disable', 'w' => 'disable-wait', ] ); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { $help = "Execute periodic cron actions. Options: -h, --help Print out this help -s, --stop Notify all other running cron processes to stop after the current task -l, --list Show the list of currently running tasks and how long they have been running -f, --force Execute task even if cron is disabled -e, --enable Enable cron -d, --disable Disable cron -w, --disable-wait=600 Disable cron and wait until all tasks finished or fail after N seconds (optional param) Example: \$sudo -u www-data /usr/bin/php admin/cli/cron.php "; echo $help; die; } if ($options['stop']) { // By clearing the caches this signals to other running processes // to exit after finishing the current task. \core\task\manager::clear_static_caches(); die; } if ($options['enable']) { set_config('cron_enabled', 1); mtrace('Cron has been enabled for the site.'); exit(0); } if ($options['disable']) { set_config('cron_enabled', 0); \core\task\manager::clear_static_caches(); mtrace('Cron has been disabled for the site.'); exit(0); } if ($options['list']) { $tasks = \core\task\manager::get_running_tasks(); mtrace('The list of currently running tasks:'); $format = "%7s %-12s %-9s %-20s %-52s\n"; printf ($format, 'PID', 'HOST', 'TYPE', 'TIME', 'CLASSNAME' ); foreach ($tasks as $task) { printf ($format, $task->pid, substr($task->hostname, 0, 12), $task->type, format_time(time() - $task->timestarted), substr($task->classname, 0, 52) ); } exit(0); } if ($wait = $options['disable-wait']) { $started = time(); if (true === $wait) { // Default waiting time. $waitsec = 600; } else { $waitsec = $wait; $wait = true; } set_config('cron_enabled', 0); \core\task\manager::clear_static_caches(); mtrace('Cron has been disabled for the site.'); mtrace('Allocating '. format_time($waitsec) . ' for the tasks to finish.'); $lastcount = 0; while ($wait) { $tasks = \core\task\manager::get_running_tasks(); if (count($tasks) == 0) { mtrace(''); mtrace('All scheduled and adhoc tasks finished.'); exit(0); } if (time() - $started >= $waitsec) { mtrace(''); mtrace('Wait time ('. format_time($waitsec) . ') elapsed, but ' . count($tasks) . ' task(s) still running.'); mtrace('Exiting with code 1.'); exit(1); } if (count($tasks) !== $lastcount) { mtrace(''); mtrace(count($tasks) . " tasks currently running.", ''); $lastcount = count($tasks); } else { mtrace('.', ''); } sleep(1); } } if (!get_config('core', 'cron_enabled') && !$options['force']) { mtrace('Cron is disabled. Use --force to override.'); exit(1); } \core\local\cli\shutdown::script_supports_graceful_exit(); cron_run(); build_theme_css.php 0000644 00000006553 15151174103 0010415 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Build and store theme CSS. * * @package core * @subpackage cli * @copyright 2017 Ryan Wyllie <ryan@moodle.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once("$CFG->libdir/clilib.php"); require_once("$CFG->libdir/csslib.php"); require_once("$CFG->libdir/outputlib.php"); $longparams = [ 'themes' => null, 'direction' => null, 'help' => false, 'verbose' => false ]; $shortmappings = [ 't' => 'themes', 'd' => 'direction', 'h' => 'help', 'v' => 'verbose' ]; // Get CLI params. list($options, $unrecognized) = cli_get_params($longparams, $shortmappings); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { echo "Compile the CSS for one or more installed themes. Existing CSS caches will replaced. By default all themes will be recompiled unless otherwise specified. Options: -t, --themes A comma separated list of themes to be compiled -d, --direction Only compile a single direction (either ltr or rtl) -v, --verbose Print info comments to stdout -h, --help Print out this help Example: \$ sudo -u www-data /usr/bin/php admin/cli/build_theme_css.php --themes=boost --direction=ltr "; die; } if (empty($options['verbose'])) { $trace = new null_progress_trace(); } else { $trace = new text_progress_trace(); } cli_heading('Build theme css'); // Determine which themes we need to build. $themenames = []; if (is_null($options['themes'])) { $trace->output('No themes specified. Finding all installed themes.'); $themenames = array_keys(core_component::get_plugin_list('theme')); } else { if (is_string($options['themes'])) { $themenames = explode(',', $options['themes']); } else { cli_error('--themes must be a comma separated list of theme names'); } } $trace->output('Checking that each theme is correctly installed...'); $themeconfigs = []; foreach ($themenames as $themename) { if (is_null(theme_get_config_file_path($themename))) { cli_error("Unable to find theme config for {$themename}"); } // Load the config for the theme. $themeconfigs[] = theme_config::load($themename); } $directions = ['ltr', 'rtl']; if (!is_null($options['direction'])) { if (!in_array($options['direction'], $directions)) { cli_error("--direction must be either ltr or rtl"); } $directions = [$options['direction']]; } $trace->output('Building CSS for themes: ' . implode(', ', $themenames)); theme_build_css_for_themes($themeconfigs, $directions); exit(0); upgrade.php 0000644 00000020252 15151174103 0006703 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This script creates config.php file and prepares database. * * This script is not intended for beginners! * Potential problems: * - su to apache account or sudo before execution * - not compatible with Windows platform * * @package core * @subpackage cli * @copyright 2009 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ // Force OPcache reset if used, we do not want any stale caches // when detecting if upgrade necessary or when running upgrade. if (function_exists('opcache_reset') and !isset($_SERVER['REMOTE_ADDR'])) { opcache_reset(); } define('CLI_SCRIPT', true); define('CACHE_DISABLE_ALL', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/adminlib.php'); // various admin-only functions require_once($CFG->libdir.'/upgradelib.php'); // general upgrade/install related functions require_once($CFG->libdir.'/clilib.php'); // cli only functions require_once($CFG->libdir.'/environmentlib.php'); // now get cli options $lang = isset($SESSION->lang) ? $SESSION->lang : $CFG->lang; list($options, $unrecognized) = cli_get_params( array( 'non-interactive' => false, 'allow-unstable' => false, 'help' => false, 'lang' => $lang, 'verbose-settings' => false, 'is-pending' => false, ), array( 'h' => 'help' ) ); if ($options['lang']) { $SESSION->lang = $options['lang']; } $interactive = empty($options['non-interactive']); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { $help = "Command line Moodle upgrade. Please note you must execute this script with the same uid as apache! Site defaults may be changed via local/defaults.php. Options: --non-interactive No interactive questions or confirmations --allow-unstable Upgrade even if the version is not marked as stable yet, required in non-interactive mode. --lang=CODE Set preferred language for CLI output. Defaults to the site language if not set. Defaults to 'en' if the lang parameter is invalid or if the language pack is not installed. --verbose-settings Show new settings values. By default only the name of new core or plugin settings are displayed. This option outputs the new values as well as the setting name. --is-pending If an upgrade is needed it exits with an error code of 2 so it distinct from other types of errors. -h, --help Print out this help Example: \$sudo -u www-data /usr/bin/php admin/cli/upgrade.php "; //TODO: localize - to be translated later when everything is finished echo $help; die; } if (empty($CFG->version)) { cli_error(get_string('missingconfigversion', 'debug')); } require("$CFG->dirroot/version.php"); // defines $version, $release, $branch and $maturity $CFG->target_release = $release; // used during installation and upgrades if ($version < $CFG->version) { cli_error(get_string('downgradedcore', 'error')); } $oldversion = "$CFG->release ($CFG->version)"; $newversion = "$release ($version)"; if (!moodle_needs_upgrading()) { cli_error(get_string('cliupgradenoneed', 'core_admin', $newversion), 0); } if ($options['is-pending']) { cli_error(get_string('cliupgradepending', 'core_admin'), 2); } // Test environment first. list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE); if (!$envstatus) { $errors = environment_get_errors($environment_results); cli_heading(get_string('environment', 'admin')); foreach ($errors as $error) { list($info, $report) = $error; echo "!! $info !!\n$report\n\n"; } exit(1); } // Make sure there are no files left over from previous versions. if (upgrade_stale_php_files_present()) { cli_problem(get_string('upgradestalefiles', 'admin')); // Stale file info contains HTML elements which aren't suitable for CLI. $upgradestalefilesinfo = get_string('upgradestalefilesinfo', 'admin', get_docs_url('Upgrading')); cli_error(strip_tags($upgradestalefilesinfo)); } // Test plugin dependencies. $failed = array(); if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed, $CFG->branch)) { cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed))))); cli_error(get_string('pluginschecktodo', 'admin')); } $a = new stdClass(); $a->oldversion = $oldversion; $a->newversion = $newversion; if ($interactive) { echo cli_heading(get_string('databasechecking', '', $a)) . PHP_EOL; } // make sure we are upgrading to a stable release or display a warning if (isset($maturity)) { if (($maturity < MATURITY_STABLE) and !$options['allow-unstable']) { $maturitylevel = get_string('maturity'.$maturity, 'admin'); if ($interactive) { cli_separator(); cli_heading(get_string('notice')); echo get_string('maturitycorewarning', 'admin', $maturitylevel) . PHP_EOL; echo get_string('morehelp') . ': ' . get_docs_url('admin/versions') . PHP_EOL; cli_separator(); } else { cli_problem(get_string('maturitycorewarning', 'admin', $maturitylevel)); cli_error(get_string('maturityallowunstable', 'admin')); } } } if ($interactive) { echo html_to_text(get_string('upgradesure', 'admin', $newversion))."\n"; $prompt = get_string('cliyesnoprompt', 'admin'); $input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin'))); if ($input == get_string('clianswerno', 'admin')) { exit(1); } } if ($version > $CFG->version) { // We purge all of MUC's caches here. // Caches are disabled for upgrade by CACHE_DISABLE_ALL so we must set the first arg to true. // This ensures a real config object is loaded and the stores will be purged. // This is the only way we can purge custom caches such as memcache or APC. // Note: all other calls to caches will still used the disabled API. cache_helper::purge_all(true); upgrade_core($version, true); } set_config('release', $release); set_config('branch', $branch); // unconditionally upgrade upgrade_noncore(true); // log in as admin - we need doanything permission when applying defaults \core\session\manager::set_user(get_admin()); // Apply default settings and output those that have changed. cli_heading(get_string('cliupgradedefaultheading', 'admin')); $settingsoutput = admin_apply_default_settings(null, false); foreach ($settingsoutput as $setting => $value) { if ($options['verbose-settings']) { $stringvlaues = array( 'name' => $setting, 'defaultsetting' => var_export($value, true) // Expand objects. ); echo get_string('cliupgradedefaultverbose', 'admin', $stringvlaues) . PHP_EOL; } else { echo get_string('cliupgradedefault', 'admin', $setting) . PHP_EOL; } } // This needs to happen at the end to ensure it occurs after all caches // have been purged for the last time. // This will build a cached version of the current theme for the user // to immediately start browsing the site. upgrade_themes(); echo get_string('cliupgradefinished', 'admin', $a)."\n"; exit(0); // 0 means success alternative_component_cache.php 0000644 00000006000 15151174103 0012772 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This hack is intended for clustered sites that do not want * to use shared cachedir for component cache. * * This file needs to be called after any change in PHP files in dataroot, * that is before upgrade and install. * * @package core * @copyright 2013 Petr Skoda (skodak) {@link http://skodak.org} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); define('ABORT_AFTER_CONFIG', true); // We need just the values from config.php. define('CACHE_DISABLE_ALL', true); // This prevents reading of existing caches. define('IGNORE_COMPONENT_CACHE', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); // Now get cli options. list($options, $unrecognized) = cli_get_params( array( 'file' => false, 'rebuild' => false, 'print' => false, 'help' => false ), array( 'h' => 'help' ) ); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2); } if (!$options['rebuild'] and !$options['file'] and !$options['print']) { $help = "Create alternative component cache file Options: -h, --help Print out this help --rebuild Rebuild \$CFG->alternative_component_cache file --file=filepath Save component cache to file --print Print component cache file content Example: \$ php admin/cli/rebuild_alternative_component_cache.php --rebuild "; echo $help; exit(0); } error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 1); $content = core_component::get_cache_content(); if ($options['print']) { echo $content; exit(0); } if ($options['rebuild']) { if (empty($CFG->alternative_component_cache)) { fwrite(STDERR, 'config.php does not contain $CFG->alternative_component_cache setting'); fwrite(STDERR, "\n"); exit(2); } $target = $CFG->alternative_component_cache; } else { $target = $options['file']; } if (!$target) { fwrite(STDERR, "Invalid target file $target"); fwrite(STDERR, "\n"); exit(1); } $bytes = file_put_contents($target, $content); if (!$bytes) { fwrite(STDERR, "Error writing to $target"); fwrite(STDERR, "\n"); exit(1); } // Success. echo "File $target was updated\n"; exit(0); generate_key.php 0000644 00000005114 15151174103 0007716 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Generates a secure key for the current server (presuming it does not already exist). * * @package core_admin * @copyright 2020 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ use \core\encryption; define('CLI_SCRIPT', true); require(__DIR__ . '/../../config.php'); require_once($CFG->libdir . '/clilib.php'); // Get cli options. [$options, $unrecognized] = cli_get_params( ['help' => false, 'method' => null], ['h' => 'help']); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } // TODO: MDL-71421 - Remove the openssl alternative once sodium becomes a requirement in Moodle 4.2. if ($options['help']) { echo "Generate secure key This script manually creates a secure key within the secret data root folder (configured in config.php as \$CFG->secretdataroot). You must run it using an account with access to write to that folder. In normal use Moodle automatically creates the key; this script is intended when setting up a new Moodle system, for cases where the secure folder is not on shared storage and the key may be manually installed on multiple servers. Options: -h, --help Print out this help --method <method> Generate key for specified encryption method instead of default. * sodium * openssl-aes-256-ctr Example: php admin/cli/generate_key.php "; exit; } $method = $options['method']; if (encryption::key_exists($method)) { echo 'Key already exists: ' . encryption::get_key_file($method) . "\n"; exit; } // Creates key with default permissions (no chmod). echo "Generating key...\n"; encryption::create_key($method, false); echo "\nKey created: " . encryption::get_key_file($method) . "\n\n"; echo "If the key folder is not shared storage, then key files should be copied to all servers.\n"; install.php 0000644 00000076623 15151174103 0006737 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This script creates config.php file and prepares database. * * This script is not intended for beginners! * Potential problems: * - su to apache account or sudo before execution * - not compatible with Windows platform * * @package core * @subpackage cli * @copyright 2009 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); // extra execution prevention - we can not just require config.php here if (isset($_SERVER['REMOTE_ADDR'])) { exit(1); } // Force OPcache reset if used, we do not want any stale caches // when preparing test environment. if (function_exists('opcache_reset')) { opcache_reset(); } $help = "Command line Moodle installer, creates config.php and initializes database. Please note you must execute this script with the same uid as apache or use chmod/chown after installation. Site defaults may be changed via local/defaults.php. Options: --chmod=OCTAL-MODE Permissions of new directories created within dataroot. Default is 2777. You may want to change it to 2770 or 2750 or 750. See chmod man page for details. --lang=CODE Installation and default site language. --wwwroot=URL Web address for the Moodle site, required in non-interactive mode. --dataroot=DIR Location of the moodle data folder, must not be web accessible. Default is moodledata in the parent directory. --dbtype=TYPE Database type. Default is mysqli --dbhost=HOST Database host. Default is localhost --dbname=NAME Database name. Default is moodle --dbuser=USERNAME Database user. Default is root --dbpass=PASSWORD Database password. Default is blank --dbport=NUMBER Use database port. --dbsocket=PATH Use database socket, 1 means default. Available for some databases only. --prefix=STRING Table prefix for above database tables. Default is mdl_ --fullname=STRING The fullname of the site --shortname=STRING The shortname of the site --summary=STRING The summary to be displayed on the front page --adminuser=USERNAME Username for the moodle admin account. Default is admin --adminpass=PASSWORD Password for the moodle admin account, required in non-interactive mode. --adminemail=STRING Email address for the moodle admin account. --sitepreset=STRING Admin site preset to be applied during the installation process. --supportemail=STRING Email address for support and help. --upgradekey=STRING The upgrade key to be set in the config.php, leave empty to not set it. --non-interactive No interactive questions, installation fails if any problem encountered. --agree-license Indicates agreement with software license, required in non-interactive mode. --allow-unstable Install even if the version is not marked as stable yet, required in non-interactive mode. --skip-database Stop the installation before installing the database. -h, --help Print out this help Example: \$sudo -u www-data /usr/bin/php admin/cli/install.php --lang=cs "; //TODO: localize, mark as needed in install - to be translated later when everything is finished // distro specific customisation $distrolibfile = __DIR__.'/../../install/distrolib.php'; $distro = null; if (file_exists($distrolibfile)) { require_once($distrolibfile); if (function_exists('distro_get_config')) { $distro = distro_get_config(); } } // Nothing to do if config.php exists $configfile = __DIR__.'/../../config.php'; if (file_exists($configfile)) { require($configfile); require_once($CFG->libdir.'/clilib.php'); list($options, $unrecognized) = cli_get_params(array('help'=>false), array('h'=>'help')); if ($options['help']) { echo $help; echo "\n\n"; } if ($DB->get_manager()->table_exists('config')) { cli_error(get_string('clialreadyinstalled', 'install')); } else { cli_error(get_string('clialreadyconfigured', 'install')); } } $olddir = getcwd(); // change directory so that includes below work properly chdir(dirname($_SERVER['argv'][0])); // Servers should define a default timezone in php.ini, but if they don't then make sure something is defined. if (!function_exists('date_default_timezone_set') or !function_exists('date_default_timezone_get')) { fwrite(STDERR, "Timezone functions are not available.\n"); exit(1); } date_default_timezone_set(@date_default_timezone_get()); // make sure PHP errors are displayed - helps with diagnosing of problems @error_reporting(E_ALL); @ini_set('display_errors', '1'); // we need a lot of memory @ini_set('memory_limit', '128M'); /** Used by library scripts to check they are being called by Moodle */ define('MOODLE_INTERNAL', true); // Disables all caching. define('CACHE_DISABLE_ALL', true); define('PHPUNIT_TEST', false); define('IGNORE_COMPONENT_CACHE', true); // Check that PHP is of a sufficient version as soon as possible. require_once(__DIR__.'/../../lib/phpminimumversionlib.php'); moodle_require_minimum_php_version(); // set up configuration global $CFG; $CFG = new stdClass(); $CFG->lang = 'en'; $CFG->dirroot = dirname(dirname(__DIR__)); $CFG->libdir = "$CFG->dirroot/lib"; $CFG->wwwroot = "http://localhost"; $CFG->httpswwwroot = $CFG->wwwroot; $CFG->docroot = 'http://docs.moodle.org'; $CFG->running_installer = true; $CFG->early_install_lang = true; $CFG->ostype = (stristr(PHP_OS, 'win') && !stristr(PHP_OS, 'darwin')) ? 'WINDOWS' : 'UNIX'; $CFG->dboptions = array(); $CFG->debug = (E_ALL | E_STRICT); $CFG->debugdisplay = true; $CFG->debugdeveloper = true; $parts = explode('/', str_replace('\\', '/', dirname(__DIR__))); $CFG->admin = array_pop($parts); //point pear include path to moodles lib/pear so that includes and requires will search there for files before anywhere else //the problem is that we need specific version of quickforms and hacked excel files :-( ini_set('include_path', $CFG->libdir.'/pear' . PATH_SEPARATOR . ini_get('include_path')); require_once($CFG->libdir.'/classes/component.php'); require_once($CFG->libdir.'/classes/text.php'); require_once($CFG->libdir.'/classes/string_manager.php'); require_once($CFG->libdir.'/classes/string_manager_install.php'); require_once($CFG->libdir.'/classes/string_manager_standard.php'); require_once($CFG->libdir.'/installlib.php'); require_once($CFG->libdir.'/clilib.php'); require_once($CFG->libdir.'/setuplib.php'); require_once($CFG->libdir.'/weblib.php'); require_once($CFG->libdir.'/dmllib.php'); require_once($CFG->libdir.'/moodlelib.php'); require_once($CFG->libdir.'/deprecatedlib.php'); require_once($CFG->libdir.'/adminlib.php'); require_once($CFG->libdir.'/componentlib.class.php'); require_once($CFG->dirroot.'/cache/lib.php'); // Register our classloader, in theory somebody might want to replace it to load other hacked core classes. // Required because the database checks below lead to session interaction which is going to lead us to requiring autoloaded classes. if (defined('COMPONENT_CLASSLOADER')) { spl_autoload_register(COMPONENT_CLASSLOADER); } else { spl_autoload_register('core_component::classloader'); } require($CFG->dirroot.'/version.php'); $CFG->target_release = $release; \core\session\manager::init_empty_session(); global $SESSION; global $USER; global $COURSE; $COURSE = new stdClass(); $COURSE->id = 1; global $SITE; $SITE = $COURSE; define('SITEID', 1); //Database types $databases = array('mysqli' => moodle_database::get_driver_instance('mysqli', 'native'), 'auroramysql' => moodle_database::get_driver_instance('auroramysql', 'native'), 'mariadb'=> moodle_database::get_driver_instance('mariadb', 'native'), 'pgsql' => moodle_database::get_driver_instance('pgsql', 'native'), 'oci' => moodle_database::get_driver_instance('oci', 'native'), 'sqlsrv' => moodle_database::get_driver_instance('sqlsrv', 'native'), // MS SQL*Server PHP driver ); foreach ($databases as $type=>$database) { if ($database->driver_installed() !== true) { unset($databases[$type]); } } if (empty($databases)) { $defaultdb = ''; } else { reset($databases); $defaultdb = key($databases); } // now get cli options list($options, $unrecognized) = cli_get_params( array( 'chmod' => isset($distro->directorypermissions) ? sprintf('%04o',$distro->directorypermissions) : '2777', // let distros set dir permissions 'lang' => $CFG->lang, 'wwwroot' => '', 'dataroot' => empty($distro->dataroot) ? str_replace('\\', '/', dirname(dirname(dirname(__DIR__))).'/moodledata'): $distro->dataroot, // initialised later after including libs or by distro 'dbtype' => empty($distro->dbtype) ? $defaultdb : $distro->dbtype, // let distro skip dbtype selection 'dbhost' => empty($distro->dbhost) ? 'localhost' : $distro->dbhost, // let distros set dbhost 'dbname' => 'moodle', 'dbuser' => empty($distro->dbuser) ? 'root' : $distro->dbuser, // let distros set dbuser 'dbpass' => '', 'dbport' => '', 'dbsocket' => '', 'prefix' => 'mdl_', 'fullname' => '', 'shortname' => '', 'summary' => '', 'adminuser' => 'admin', 'adminpass' => '', 'adminemail' => '', 'sitepreset' => '', 'supportemail' => '', 'upgradekey' => '', 'non-interactive' => false, 'agree-license' => false, 'allow-unstable' => false, 'skip-database' => false, 'help' => false ), array( 'h' => 'help' ) ); $interactive = empty($options['non-interactive']); $skipdatabase = $options['skip-database']; // set up language $lang = clean_param($options['lang'], PARAM_SAFEDIR); $languages = get_string_manager()->get_list_of_translations(); if (array_key_exists($lang, $languages)) { $CFG->lang = $lang; } // Set up site admin preset. $sitepreset = clean_param($options['sitepreset'], PARAM_RAW); if (!empty($sitepreset)) { $CFG->setsitepresetduringinstall = $sitepreset; } if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { echo $help; die; } //Print header cli_logo(); echo PHP_EOL; echo get_string('cliinstallheader', 'install', $CFG->target_release)."\n"; //Fist select language if ($interactive) { cli_separator(); // Do not put the langs into columns because it is not compatible with RTL. $default = $CFG->lang; cli_heading(get_string('chooselanguagehead', 'install')); if (array_key_exists($default, $languages)) { echo $default.' - '.$languages[$default]."\n"; } if ($default !== 'en') { echo 'en - English (en)'."\n"; } echo '? - '.get_string('availablelangs', 'install')."\n"; $prompt = get_string('clitypevaluedefault', 'admin', $CFG->lang); $error = ''; do { echo $error; $input = cli_input($prompt, $default); if ($input === '?') { echo implode("\n", $languages)."\n"; $error = "\n"; } else { $input = clean_param($input, PARAM_SAFEDIR); if (!array_key_exists($input, $languages)) { $error = get_string('cliincorrectvalueretry', 'admin')."\n"; } else { $error = ''; } } } while ($error !== ''); $CFG->lang = $input; } else { // already selected and verified } // Set directorypermissions first $chmod = octdec(clean_param($options['chmod'], PARAM_INT)); if ($interactive) { cli_separator(); cli_heading(get_string('datarootpermission', 'install')); $prompt = get_string('clitypevaluedefault', 'admin', decoct($chmod)); $error = ''; do { echo $error; $input = cli_input($prompt, decoct($chmod)); $input = octdec(clean_param($input, PARAM_INT)); if (empty($input)) { $error = get_string('cliincorrectvalueretry', 'admin')."\n"; } else { $error = ''; } } while ($error !== ''); $chmod = $input; } else { if (empty($chmod)) { $a = (object)array('option' => 'chmod', 'value' => decoct($chmod)); cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } } $CFG->directorypermissions = $chmod; $CFG->filepermissions = ($CFG->directorypermissions & 0666); $CFG->umaskpermissions = (($CFG->directorypermissions & 0777) ^ 0777); //We need wwwroot before we test dataroot $wwwroot = clean_param($options['wwwroot'], PARAM_URL); $wwwroot = trim($wwwroot, '/'); if ($interactive) { cli_separator(); cli_heading(get_string('wwwroot', 'install')); if (strpos($wwwroot, 'http') === 0) { $prompt = get_string('clitypevaluedefault', 'admin', $wwwroot); } else { $wwwroot = null; $prompt = get_string('clitypevalue', 'admin'); } $error = ''; do { echo $error; $input = cli_input($prompt, $wwwroot); $input = clean_param($input, PARAM_URL); $input = trim($input, '/'); if (strpos($input, 'http') !== 0) { $error = get_string('cliincorrectvalueretry', 'admin')."\n"; } else { $error = ''; } } while ($error !== ''); $wwwroot = $input; } else { if (strpos($wwwroot, 'http') !== 0) { $a = (object)array('option'=>'wwwroot', 'value'=>$wwwroot); cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } } $CFG->wwwroot = $wwwroot; $CFG->httpswwwroot = $CFG->wwwroot; //We need dataroot before lang download $CFG->dataroot = $options['dataroot']; if ($interactive) { cli_separator(); $i=0; while(is_dataroot_insecure()) { $parrent = dirname($CFG->dataroot); $i++; if ($parrent == '/' or $parrent == '.' or preg_match('/^[a-z]:\\\?$/i', $parrent) or ($i > 100)) { $CFG->dataroot = ''; //can not find secure location for dataroot break; } $CFG->dataroot = dirname($parrent).'/moodledata'; } cli_heading(get_string('dataroot', 'install')); $error = ''; do { if ($CFG->dataroot !== '') { $prompt = get_string('clitypevaluedefault', 'admin', $CFG->dataroot); } else { $prompt = get_string('clitypevalue', 'admin'); } echo $error; $CFG->dataroot = cli_input($prompt, $CFG->dataroot); if ($CFG->dataroot === '') { $error = get_string('cliincorrectvalueretry', 'admin')."\n"; } else if (is_dataroot_insecure()) { $CFG->dataroot = ''; $error = get_string('pathsunsecuredataroot', 'install')."\n"; } else { if (install_init_dataroot($CFG->dataroot, $CFG->directorypermissions)) { $error = ''; } else { $a = (object)array('dataroot' => $CFG->dataroot); $error = get_string('pathserrcreatedataroot', 'install', $a)."\n"; } } } while ($error !== ''); } else { if (is_dataroot_insecure()) { cli_error(get_string('pathsunsecuredataroot', 'install')); } if (!install_init_dataroot($CFG->dataroot, $CFG->directorypermissions)) { $a = (object)array('dataroot' => $CFG->dataroot); cli_error(get_string('pathserrcreatedataroot', 'install', $a)); } } $CFG->tempdir = $CFG->dataroot.'/temp'; $CFG->backuptempdir = $CFG->tempdir.'/backup'; $CFG->cachedir = $CFG->dataroot.'/cache'; $CFG->localcachedir = $CFG->dataroot.'/localcache'; // download required lang packs if ($CFG->lang !== 'en') { $installer = new lang_installer($CFG->lang); $results = $installer->run(); foreach ($results as $langcode => $langstatus) { if ($langstatus === lang_installer::RESULT_DOWNLOADERROR) { $a = new stdClass(); $a->url = $installer->lang_pack_url($langcode); $a->dest = $CFG->dataroot.'/lang'; cli_problem(get_string('remotedownloaderror', 'error', $a)); } } } // switch the string_manager instance to stop using install/lang/ $CFG->early_install_lang = false; $CFG->langotherroot = $CFG->dataroot.'/lang'; $CFG->langlocalroot = $CFG->dataroot.'/lang'; get_string_manager(true); // make sure we are installing stable release or require a confirmation if (isset($maturity)) { if (($maturity < MATURITY_STABLE) and !$options['allow-unstable']) { $maturitylevel = get_string('maturity'.$maturity, 'admin'); if ($interactive) { cli_separator(); cli_heading(get_string('notice')); echo get_string('maturitycorewarning', 'admin', $maturitylevel) . PHP_EOL; echo get_string('morehelp') . ': ' . get_docs_url('admin/versions') . PHP_EOL; echo get_string('continue') . PHP_EOL; $prompt = get_string('cliyesnoprompt', 'admin'); $input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin'))); if ($input == get_string('clianswerno', 'admin')) { exit(1); } } else { cli_problem(get_string('maturitycorewarning', 'admin', $maturitylevel)); cli_error(get_string('maturityallowunstable', 'admin')); } } } // ask for db type - show only drivers available if ($interactive) { $options['dbtype'] = strtolower($options['dbtype']); cli_separator(); cli_heading(get_string('databasetypehead', 'install')); foreach ($databases as $type=>$database) { echo " $type \n"; } if (!empty($databases[$options['dbtype']])) { $prompt = get_string('clitypevaluedefault', 'admin', $options['dbtype']); } else { $prompt = get_string('clitypevalue', 'admin'); } $CFG->dbtype = cli_input($prompt, $options['dbtype'], array_keys($databases)); } else { if (empty($databases[$options['dbtype']])) { $a = (object)array('option'=>'dbtype', 'value'=>$options['dbtype']); cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } $CFG->dbtype = $options['dbtype']; } $database = $databases[$CFG->dbtype]; // We cannot do any validation until all DB connection data is provided. $hintdatabase = ''; do { echo $hintdatabase; // Ask for db host. if ($interactive) { cli_separator(); cli_heading(get_string('databasehost', 'install')); if ($options['dbhost'] !== '') { $prompt = get_string('clitypevaluedefault', 'admin', $options['dbhost']); } else { $prompt = get_string('clitypevalue', 'admin'); } $CFG->dbhost = cli_input($prompt, $options['dbhost']); } else { $CFG->dbhost = $options['dbhost']; } // Ask for db name. if ($interactive) { cli_separator(); cli_heading(get_string('databasename', 'install')); if ($options['dbname'] !== '') { $prompt = get_string('clitypevaluedefault', 'admin', $options['dbname']); } else { $prompt = get_string('clitypevalue', 'admin'); } $CFG->dbname = cli_input($prompt, $options['dbname']); } else { $CFG->dbname = $options['dbname']; } // Ask for db prefix. if ($interactive) { cli_separator(); cli_heading(get_string('dbprefix', 'install')); //TODO: solve somehow the prefix trouble for oci. if ($options['prefix'] !== '') { $prompt = get_string('clitypevaluedefault', 'admin', $options['prefix']); } else { $prompt = get_string('clitypevalue', 'admin'); } $CFG->prefix = cli_input($prompt, $options['prefix']); } else { $CFG->prefix = $options['prefix']; } // Ask for db port. if ($interactive) { cli_separator(); cli_heading(get_string('databaseport', 'install')); $prompt = get_string('clitypevaluedefault', 'admin', $options['dbport']); $CFG->dboptions['dbport'] = (int) cli_input($prompt, $options['dbport']); } else { $CFG->dboptions['dbport'] = (int) $options['dbport']; } if ($CFG->dboptions['dbport'] <= 0) { $CFG->dboptions['dbport'] = ''; } // Ask for db socket. if ($CFG->ostype === 'WINDOWS') { $CFG->dboptions['dbsocket'] = ''; } else if ($interactive and empty($CFG->dboptions['dbport'])) { cli_separator(); cli_heading(get_string('databasesocket', 'install')); $prompt = get_string('clitypevaluedefault', 'admin', $options['dbsocket']); $CFG->dboptions['dbsocket'] = cli_input($prompt, $options['dbsocket']); } else { $CFG->dboptions['dbsocket'] = $options['dbsocket']; } // Ask for db user. if ($interactive) { cli_separator(); cli_heading(get_string('databaseuser', 'install')); if ($options['dbuser'] !== '') { $prompt = get_string('clitypevaluedefault', 'admin', $options['dbuser']); } else { $prompt = get_string('clitypevalue', 'admin'); } $CFG->dbuser = cli_input($prompt, $options['dbuser']); } else { $CFG->dbuser = $options['dbuser']; } // Ask for db password. if ($interactive) { cli_separator(); cli_heading(get_string('databasepass', 'install')); if ($options['dbpass'] !== '') { $prompt = get_string('clitypevaluedefault', 'admin', $options['dbpass']); } else { $prompt = get_string('clitypevalue', 'admin'); } $CFG->dbpass = cli_input($prompt, $options['dbpass']); if (function_exists('distro_pre_create_db')) { // Hook for distros needing to do something before DB creation. $distro = distro_pre_create_db($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist' => 0, 'dbport' => $CFG->dboptions['dbport'], 'dbsocket' => $CFG->dboptions['dbsocket']), $distro); } $hintdatabase = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist' => 0, 'dbport' => $CFG->dboptions['dbport'], 'dbsocket' => $CFG->dboptions['dbsocket'])); } else { $CFG->dbpass = $options['dbpass']; $hintdatabase = install_db_validate($database, $CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->prefix, array('dbpersist' => 0, 'dbport' => $CFG->dboptions['dbport'], 'dbsocket' => $CFG->dboptions['dbsocket'])); if ($hintdatabase !== '') { cli_error(get_string('dbconnectionerror', 'install')); } } } while ($hintdatabase !== ''); // If --skip-database option is provided, we do not need to ask for site fullname, shortname, adminuser, adminpass, adminemail. // These fields will be requested during the database install part. if (!$skipdatabase) { // Ask for fullname. if ($interactive) { cli_separator(); cli_heading(get_string('fullsitename', 'moodle')); if ($options['fullname'] !== '') { $prompt = get_string('clitypevaluedefault', 'admin', $options['fullname']); } else { $prompt = get_string('clitypevalue', 'admin'); } do { $options['fullname'] = cli_input($prompt, $options['fullname']); } while (empty($options['fullname'])); } else { if (empty($options['fullname'])) { $a = (object)['option' => 'fullname', 'value' => $options['fullname']]; cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } } // Ask for shortname. if ($interactive) { cli_separator(); cli_heading(get_string('shortsitename', 'moodle')); if ($options['shortname'] !== '') { $prompt = get_string('clitypevaluedefault', 'admin', $options['shortname']); } else { $prompt = get_string('clitypevalue', 'admin'); } do { $options['shortname'] = cli_input($prompt, $options['shortname']); } while (empty($options['shortname'])); } else { if (empty($options['shortname'])) { $a = (object)['option' => 'shortname', 'value' => $options['shortname']]; cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } } // Ask for admin user name. if ($interactive) { cli_separator(); cli_heading(get_string('cliadminusername', 'install')); if (!empty($options['adminuser'])) { $prompt = get_string('clitypevaluedefault', 'admin', $options['adminuser']); } else { $prompt = get_string('clitypevalue', 'admin'); } do { $options['adminuser'] = cli_input($prompt, $options['adminuser']); } while (empty($options['adminuser']) or $options['adminuser'] === 'guest'); } else { if ((empty($options['adminuser']) || $options['adminuser'] === 'guest')) { $a = (object)['option' => 'adminuser', 'value' => $options['adminuser']]; cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } } // Ask for admin user password. if ($interactive) { cli_separator(); cli_heading(get_string('cliadminpassword', 'install')); $prompt = get_string('clitypevalue', 'admin'); do { $options['adminpass'] = cli_input($prompt); } while (empty($options['adminpass']) or $options['adminpass'] === 'admin'); } else { if ((empty($options['adminpass']) or $options['adminpass'] === 'admin')) { $a = (object)['option' => 'adminpass', 'value' => $options['adminpass']]; cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } } // Ask for the admin email address. if ($interactive) { cli_separator(); cli_heading(get_string('cliadminemail', 'install')); $prompt = get_string('clitypevaluedefault', 'admin', $options['adminemail']); $options['adminemail'] = cli_input($prompt, $options['adminemail']); } // Validate that the address provided was an e-mail address. if (!empty($options['adminemail']) && !validate_email($options['adminemail'])) { $a = (object)['option' => 'adminemail', 'value' => $options['adminemail']]; cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } // Ask for the support email address. if ($interactive) { cli_separator(); cli_heading(get_string('clisupportemail', 'install')); $prompt = get_string('clitypevaluedefault', 'admin', $options['supportemail']); $options['supportemail'] = cli_input($prompt, $options['supportemail']); } // Validate that the support email address provided is valid. if (!empty($options['supportemail']) && !validate_email($options['supportemail'])) { $a = (object)['option' => 'supportemail', 'value' => $options['supportemail']]; cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } } // Ask for the upgrade key. if ($interactive) { cli_separator(); cli_heading(get_string('upgradekeyset', 'admin')); if ($options['upgradekey'] !== '') { $prompt = get_string('clitypevaluedefault', 'admin', $options['upgradekey']); $options['upgradekey'] = cli_input($prompt, $options['upgradekey']); } else { $prompt = get_string('clitypevalue', 'admin'); $options['upgradekey'] = cli_input($prompt); } } // Set the upgrade key if it was provided. if ($options['upgradekey'] !== '') { $CFG->upgradekey = $options['upgradekey']; } // The user does not also need to pass agree-license when --skip-database is provided as the user will need to accept // the license again in the database install part. if (!$skipdatabase) { if ($interactive) { if (!$options['agree-license']) { cli_separator(); cli_heading(get_string('copyrightnotice')); echo "Moodle - Modular Object-Oriented Dynamic Learning Environment\n"; echo get_string('gpl3')."\n\n"; echo get_string('doyouagree')."\n"; $prompt = get_string('cliyesnoprompt', 'admin'); $input = cli_input($prompt, '', array(get_string('clianswerno', 'admin'), get_string('cliansweryes', 'admin'))); if ($input == get_string('clianswerno', 'admin')) { exit(1); } } } else { if (!$options['agree-license'] && !$skipdatabase) { cli_error(get_string('climustagreelicense', 'install')); } } } // Finally we have all info needed for config.php $configphp = install_generate_configphp($database, $CFG); umask(0137); if (($fh = fopen($configfile, 'w')) !== false) { fwrite($fh, $configphp); fclose($fh); } if (!file_exists($configfile)) { cli_error('Can not create config file.'); } // remember selected language $installlang = $CFG->lang; // return back to original dir before executing setup.php which changes the dir again chdir($olddir); // We have config.php, it is a real php script from now on :-) require($configfile); // use selected language $CFG->lang = $installlang; $SESSION->lang = $CFG->lang; require("$CFG->dirroot/version.php"); // Test environment first. require_once($CFG->libdir . '/environmentlib.php'); list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE); if (!$envstatus) { $errors = environment_get_errors($environment_results); cli_heading(get_string('environment', 'admin')); foreach ($errors as $error) { list($info, $report) = $error; echo "!! $info !!\n$report\n\n"; } exit(1); } // Test plugin dependencies. $failed = array(); if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) { cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed))))); cli_error(get_string('pluginschecktodo', 'admin')); } if (!$skipdatabase) { install_cli_database($options, $interactive); // This needs to happen at the end to ensure it occurs after all caches // have been purged for the last time. // This will build a cached version of the current theme for the user // to immediately start browsing the site. require_once($CFG->libdir.'/upgradelib.php'); upgrade_themes(); } else { echo get_string('cliskipdatabase', 'install')."\n"; } echo get_string('cliinstallfinished', 'install')."\n"; exit(0); // 0 means success uninstall_plugins.php 0000644 00000014314 15151174103 0011030 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * CLI script to uninstall plugins. * * @package core * @subpackage cli * @copyright 2018 Dmitrii Metelkin <dmitriim@catalyst-au.net> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__ . '/../../config.php'); require_once($CFG->libdir . '/clilib.php'); require_once($CFG->libdir . '/adminlib.php'); $help = "Command line tool to uninstall plugins. Options: -h --help Print this help. --show-all Displays a list of all installed plugins. --show-contrib Displays a list of all third-party installed plugins. --show-missing Displays a list of plugins missing from disk. --purge-missing Uninstall all missing from disk plugins. --plugins=<plugin name> A comma separated list of plugins to be uninstalled. E.g. mod_assign,mod_forum --run Execute uninstall. If this option is not set, then the script will be run in a dry mode. --showsql Show sql queries before they are executed. --showdebugging Show developer level debugging information. Examples: # php uninstall_plugins.php --show-all Prints tab-separated list of all installed plugins. # php uninstall_plugins.php --show-contrib Prints tab-separated list of all third-party installed plugins. # php uninstall_plugins.php --show-missing Prints tab-separated list of all missing from disk plugins. # php uninstall_plugins.php --purge-missing A dry run of uninstalling all missing plugins. # php uninstall_plugins.php --purge-missing --run Run uninstall of all missing plugins. # php uninstall_plugins.php --plugins=mod_assign,mod_forum A dry run of uninstalling mod_assign and mod_forum plugins. # php uninstall_plugins.php --plugins=mod_assign,mod_forum --run Run uninstall for mod_assign and mod_forum plugins. "; list($options, $unrecognised) = cli_get_params([ 'help' => false, 'show-all' => false, 'show-contrib' => false, 'show-missing' => false, 'purge-missing' => false, 'plugins' => false, 'run' => false, 'showsql' => false, 'showdebugging' => false, ], [ 'h' => 'help' ]); if ($unrecognised) { $unrecognised = implode(PHP_EOL.' ', $unrecognised); cli_error(get_string('cliunknowoption', 'core_admin', $unrecognised)); } if ($options['help']) { cli_writeln($help); exit(0); } if ($options['showdebugging']) { set_debugging(DEBUG_DEVELOPER, true); } if ($options['showsql']) { $DB->set_debug(true); } $pluginman = core_plugin_manager::instance(); $plugininfo = $pluginman->get_plugins(); if ($options['show-all'] || $options['show-missing'] || $options['show-contrib']) { foreach ($plugininfo as $type => $plugins) { foreach ($plugins as $name => $plugin) { if ($options['show-contrib'] && $plugin->is_standard()) { continue; } $pluginstring = $plugin->component . "\t" . $plugin->displayname; if ($options['show-all'] || $options['show-contrib']) { cli_writeln($pluginstring); } else { if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) { cli_writeln($pluginstring); } } } } exit(0); } if ($options['purge-missing']) { foreach ($plugininfo as $type => $plugins) { foreach ($plugins as $name => $plugin) { if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) { $pluginstring = $plugin->component . "\t" . $plugin->displayname; if ($pluginman->can_uninstall_plugin($plugin->component)) { if ($options['run']) { cli_writeln('Uninstalling: ' . $pluginstring); $progress = new progress_trace_buffer(new text_progress_trace(), true); $pluginman->uninstall_plugin($plugin->component, $progress); $progress->finished(); cli_write($progress->get_buffer()); } else { cli_writeln('Will be uninstalled: ' . $pluginstring); } } else { cli_writeln('Can not be uninstalled: ' . $pluginstring); } } } } exit(0); } if ($options['plugins']) { $components = explode(',', $options['plugins']); foreach ($components as $component) { $plugin = $pluginman->get_plugin_info($component); if (is_null($plugin)) { cli_writeln('Unknown plugin: ' . $component); } else { $pluginstring = $plugin->component . "\t" . $plugin->displayname; if ($pluginman->can_uninstall_plugin($plugin->component)) { if ($options['run']) { cli_writeln('Uninstalling: ' . $pluginstring); $progress = new progress_trace_buffer(new text_progress_trace(), true); $pluginman->uninstall_plugin($plugin->component, $progress); $progress->finished(); cli_write($progress->get_buffer()); } else { cli_writeln('Will be uninstalled: ' . $pluginstring); } } else { cli_writeln('Can not be uninstalled: ' . $pluginstring); } } } exit(0); } cli_writeln($help); exit(0); dashboard_reset.php 0000644 00000003372 15151174103 0010411 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * CLI script to reset dashboards. * * @package core * @subpackage cli * @copyright 2021 Brendan Heywood (brendan@catalyst-au.net) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); require_once($CFG->dirroot.'/my/lib.php'); list($options, $unrecognized) = cli_get_params([ 'help' => false, 'execute' => false, ], [ 'h' => 'help', 'e' => 'execute', ]); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2); } if (!$options['execute']) { $help = <<<EOF Resets Moodle dashboards for all users Options: -h, --help Print out this help -e, --execute Actually run the reset Example: \$ sudo -u www-data /usr/bin/php admin/cli/dashboard_reset.php -e EOF; echo $help; exit(0); } $progressbar = new progress_bar(); $progressbar->create(); my_reset_page_for_all_users(MY_PAGE_PRIVATE, 'my-index', $progressbar); svgtool.php 0000644 00000012066 15151174103 0006755 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This script implements some useful svg manipulation tricks. * * @package core_admin * @subpackage cli * @copyright 2012 Petr Skoda {@link http://skodak.org} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); // Now get cli options. list($options, $unrecognized) = cli_get_params(array('help'=>false, 'ie9fix'=>false, 'noaspectratio'=>false, 'path'=>$CFG->dirroot), array('h'=>'help')); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } // If necessary add files that should be ignored - such as in 3rd party plugins. $ignorelist = array(); $path = $options['path']; if (!file_exists($path)) { cli_error("Invalid path $path"); } if ($options['ie9fix']) { core_admin_recurse_svgs($path, '', 'core_admin_svgtool_ie9fix', $ignorelist); } else if ($options['noaspectratio']) { core_admin_recurse_svgs($path, '', 'core_admin_svgtool_noaspectratio', $ignorelist); } else { $help = "Some svg image tweaks for icon designers. Options: -h, --help Print out this help --ie9fix Adds preserveAspectRatio=\"xMinYMid meet\" to every svg image --noaspectratio Removes preserveAspectRatio from svg files --path=PATH Path to directory or file to be converted, by default \$CFG->dirroot Examples: \$ php svgtool.php --ie9fix \$ php svgtool.php --ie9fix --path=../../../pix \$ php svgtool.php --noaspectratio "; echo $help; die; } exit(0); /** * Fixes SVG images for IE9. * * @param string $file */ function core_admin_svgtool_ie9fix($file) { global $CFG; if (strpos($file, $CFG->dirroot.DIRECTORY_SEPARATOR) === 0) { $relfile = substr($file, strlen($CFG->dirroot)); } else { $relfile = $file; } $content = file_get_contents($file); if (!preg_match('/<svg\s[^>]*>/', $content, $matches)) { echo " skipping $relfile (invalid format)\n"; return; } $svg = $matches[0]; if (strpos($svg, 'preserveAspectRatio') !== false) { return; } if (!is_writable($file)) { echo " skipping $relfile (can not modify file)\n"; return; } $newsvg = rtrim($svg, '>').' preserveAspectRatio="xMinYMid meet">'; $content = str_replace($svg, $newsvg, $content); echo "converting $relfile\n"; file_put_contents($file, $content); } /** * Removes preserveAspectRatio attributes from SVG images. * * @param string $file */ function core_admin_svgtool_noaspectratio($file) { global $CFG; if (strpos($file, $CFG->dirroot.DIRECTORY_SEPARATOR) === 0) { $relfile = substr($file, strlen($CFG->dirroot)); } else { $relfile = $file; } $content = file_get_contents($file); if (!preg_match('/<svg\s[^>]*>/', $content, $matches)) { echo " skipping $relfile (invalid format)\n"; return; } $svg = $matches[0]; if (strpos($svg, 'preserveAspectRatio="xMinYMid meet"') === false) { return; } if (!is_writable($file)) { echo " skipping $relfile (can not modify file)\n"; return; } $newsvg = preg_replace('/ ?preserveAspectRatio="xMinYMid meet"/', '', $svg); $content = str_replace($svg, $newsvg, $content); echo "resetting $relfile\n"; file_put_contents($file, $content); } /** * Recursively works through directories of this theme, finding and fixing SVG images. * * @param string $base * @param string $sub * @param string $filecallback * @param array $ignorelist List of files to be ignored and skipped. */ function core_admin_recurse_svgs($base, $sub, $filecallback, $ignorelist) { if (is_dir("$base/$sub")) { $items = new DirectoryIterator("$base/$sub"); foreach ($items as $item) { if ($item->isDot()) { continue; } $file = $item->getFilename(); core_admin_recurse_svgs("$base/$sub", $file, $filecallback, $ignorelist); } unset($item); unset($items); return; } else if (is_file("$base/$sub")) { if (substr($sub, -4) !== '.svg') { return; } $file = realpath("$base/$sub"); if (in_array($file, $ignorelist)) { return; } $filecallback($file); } } adhoc_task.php 0000644 00000006713 15151174103 0007362 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Task executor for adhoc tasks. * * @package core * @subpackage cli * @copyright 2018 Andrew Nicols <andrew@nicols.co.uk> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__ . '/../../config.php'); require_once("{$CFG->libdir}/clilib.php"); require_once("{$CFG->libdir}/cronlib.php"); list($options, $unrecognized) = cli_get_params( [ 'execute' => false, 'help' => false, 'keep-alive' => 0, 'showsql' => false, 'showdebugging' => false, 'ignorelimits' => false, 'force' => false, ], [ 'h' => 'help', 'e' => 'execute', 'k' => 'keep-alive', 'i' => 'ignorelimits', 'f' => 'force', ] ); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help'] or empty($options['execute'])) { $help = <<<EOT Ad hoc cron tasks. Options: -h, --help Print out this help --showsql Show sql queries before they are executed --showdebugging Show developer level debugging information -e, --execute Run all queued adhoc tasks -k, --keep-alive=N Keep this script alive for N seconds and poll for new adhoc tasks -i --ignorelimits Ignore task_adhoc_concurrency_limit and task_adhoc_max_runtime limits -f, --force Run even if cron is disabled Example: \$sudo -u www-data /usr/bin/php admin/cli/adhoc_task.php --execute EOT; echo $help; die; } if ($options['showdebugging']) { set_debugging(DEBUG_DEVELOPER, true); } if ($options['showsql']) { $DB->set_debug(true); } if (CLI_MAINTENANCE) { echo "CLI maintenance mode active, cron execution suspended.\n"; exit(1); } if (moodle_needs_upgrading()) { echo "Moodle upgrade pending, cron execution suspended.\n"; exit(1); } if (empty($options['execute'])) { exit(0); } if (!get_config('core', 'cron_enabled') && !$options['force']) { mtrace('Cron is disabled. Use --force to override.'); exit(1); } if (empty($options['keep-alive'])) { $options['keep-alive'] = 0; } if (!empty($CFG->showcronsql)) { $DB->set_debug(true); } if (!empty($CFG->showcrondebugging)) { set_debugging(DEBUG_DEVELOPER, true); } $checklimits = empty($options['ignorelimits']); core_php_time_limit::raise(); // Increase memory limit. raise_memory_limit(MEMORY_EXTRA); // Emulate normal session - we use admin account by default. cron_setup_user(); $humantimenow = date('r', time()); $keepalive = (int)$options['keep-alive']; \core\local\cli\shutdown::script_supports_graceful_exit(); mtrace("Server Time: {$humantimenow}\n"); cron_run_adhoc_tasks(time(), $keepalive, $checklimits); fix_course_sequence.php 0000644 00000010443 15151174103 0011313 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This script fixed incorrectly deleted users. * * @package core * @subpackage cli * @copyright 2013 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); // Get cli options. list($options, $unrecognized) = cli_get_params( array( 'courses' => false, 'fix' => false, 'help' => false ), array( 'h' => 'help', 'c' => 'courses', 'f' => 'fix' ) ); if ($options['help'] || empty($options['courses'])) { $help = "Checks and fixes that course modules and sections reference each other correctly. Compares DB fields course_sections.sequence and course_modules.section checking that: - course_sections.sequence contains each module id not more than once in the course - for each moduleid from course_sections.sequence the field course_modules.section refers to the same section id (this means course_sections.sequence is more important if they are different) - each module in the course is present in one of course_sections.sequence - section sequences do not contain non-existing course modules If there are any mismatches, the message is displayed. If --fix is specified, the records in DB are corrected. This script may run for a long time on big systems if called for all courses. Avoid executing the script when another user may simultaneously edit any of the courses being checked (recommended to run in mainenance mode). Options: -c, --courses List courses that need to be checked (comma-separated values or * for all). Required -f, --fix Fix the mismatches in DB. If not specified check only and report problems to STDERR -h, --help Print out this help Example: \$sudo -u www-data /usr/bin/php admin/cli/fix_course_sequence.php --courses=* \$sudo -u www-data /usr/bin/php admin/cli/fix_course_sequence.php --courses=2,3,4 --fix "; echo $help; die; } $courseslist = preg_split('/\s*,\s*/', $options['courses'], -1, PREG_SPLIT_NO_EMPTY); if (in_array('*', $courseslist)) { $where = ''; $params = array(); } else { list($sql, $params) = $DB->get_in_or_equal($courseslist, SQL_PARAMS_NAMED, 'id'); $where = 'WHERE id '. $sql; } $coursescount = $DB->get_field_sql('SELECT count(id) FROM {course} '. $where, $params); if (!$coursescount) { cli_error('No courses found'); } echo "Checking $coursescount courses...\n\n"; require_once($CFG->dirroot. '/course/lib.php'); $problems = array(); $courses = $DB->get_fieldset_sql('SELECT id FROM {course} '. $where, $params); foreach ($courses as $courseid) { $errors = course_integrity_check($courseid, null, null, true, empty($options['fix'])); if ($errors) { if (!empty($options['fix'])) { // Reset the course cache to make sure cache is recalculated next time the course is viewed. rebuild_course_cache($courseid, true); } foreach ($errors as $error) { cli_problem($error); } $problems[] = $courseid; } else { echo "Course [$courseid] is OK\n"; } } if (!count($problems)) { echo "\n...All courses are OK\n"; } else { if (!empty($options['fix'])) { echo "\n...Found and fixed ".count($problems)." courses with problems". "\n"; } else { echo "\n...Found ".count($problems)." courses with problems. To fix run:\n"; echo "\$sudo -u www-data /usr/bin/php admin/cli/fix_course_sequence.php --courses=".join(',', $problems)." --fix". "\n"; } } cfg.php 0000644 00000014775 15151174103 0006030 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * CLI script allowing to get and set config values. * * This is technically just a thin wrapper for {@link get_config()} and * {@link set_config()} functions. * * @package core * @subpackage cli * @copyright 2017 David Mudrák <david@moodle.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); $usage = "Displays the current value of the given site setting. Allows to set it to the given value, too. Usage: # php cfg.php [--component=<componentname>] [--json] [--shell-arg] # php cfg.php --name=<configname> [--component=<componentname>] [--shell-arg] [--no-eol] # php cfg.php --name=<configname> [--component=<componentname>] --set=<value> # php cfg.php --name=<configname> [--component=<componentname>] --unset # php cfg.php [--help|-h] Options: -h --help Print this help. --component=<frankenstyle> Name of the component the variable is part of. Defaults to core. --name=<configname> Name of the configuration variable to get/set. If missing, print all configuration variables of the given component. --set=<value> Set the given variable to this value. --unset Unset the given variable. --shell-arg Escape output values so that they can be directly used as shell script arguments. --json Encode output list of values using JSON notation. --no-eol Do not include the trailing new line character when printing the value. The list of all variables of the given component can be printed as tab-separated list (default) or JSON object (--json). Particular values are printed as raw text values, optionally escaped so that they can be directly used as shell script arguments (--shell-arg). Single values are displayed with trailing new line by default, unless explicitly disabled (--no-eol). In the read mode, the script exits with success status 0 if the requested value is found. If the requested variable is not set, the script exits with status 3. When listing all variables of the component, the exit status is always 0 even if no variables for the given component are found. When setting/unsetting a value, the exit status is 0. When attempting to set/unset a value that has already been hard-set in config.php, the script exits with error status 4. In case of unexpected error, the script exits with error status 1. Examples: # php cfg.php Prints tab-separated list of all core configuration variables and their values. # php cfg.php --json Prints list of all core configuration variables and their values as a JSON object. # php cfg.php --name=release Prints the given configuration variable - e.g. \$CFG->release in this case. # php cfg.php --component=tool_recyclebin # Prints tab-separated list of the plugin's configuration variables. # export DATAROOT=\$(php cfg.php --name=dataroot --shell-arg --no-eol) Stores the given configuration variable in the shell variable, escaped so that it can be safely used as a shell argument. # php cfg.php --name=theme --set=classic Sets the given configuration variable to the given value. # php cfg.php --name=noemailever --unset Unsets the previously configured variable. "; list($options, $unrecognised) = cli_get_params([ 'help' => false, 'component' => null, 'name' => null, 'set' => null, 'unset' => false, 'shell-arg' => false, 'json' => false, 'no-eol' => false, ], [ 'h' => 'help' ]); if ($unrecognised) { $unrecognised = implode(PHP_EOL.' ', $unrecognised); cli_error(get_string('cliunknowoption', 'core_admin', $unrecognised)); } if ($options['help']) { cli_writeln($usage); exit(2); } if ($options['unset'] || $options['set'] !== null) { // Unset the variable or set it to the given value. if (empty($options['name'])) { cli_error('Missing configuration variable name', 2); } // Check that the variable is not hard-set in the main config.php already. $component = $options['component']; if (!empty($component)) { $componentsettings = $CFG->forced_plugin_settings[$component] ?? []; $settinginconfig = array_key_exists($options['name'], $componentsettings); } else { $settinginconfig = array_key_exists($options['name'], $CFG->config_php_settings); } if ($settinginconfig) { cli_error('The configuration variable is hard-set in the config.php, unable to change.', 4); } $new = $options['set']; $old = get_config($options['component'], $options['name']); if ($new !== $old) { set_config($options['name'], $options['set'], $options['component']); add_to_config_log($options['name'], $old, $new, $options['component']); } exit(0); } if ($options['name'] === null) { // List all variables provided by the component (defaults to core). $got = get_config($options['component']); if ($options['json']) { cli_writeln(json_encode($got)); } else { foreach ($got as $name => $value) { if ($options['shell-arg']) { $value = escapeshellarg($value); } cli_writeln($name."\t".$value); } } exit(0); } else { // Display the value of a single variable. $got = get_config($options['component'], $options['name']); if ($got === false) { cli_error('No such configuration variable found.', 3); } if ($options['shell-arg']) { $got = escapeshellarg($got); } if ($options['json']) { $got = json_encode($got); } if ($options['no-eol']) { cli_write($got); } else { cli_writeln($got); } exit(0); } checks.php 0000644 00000011177 15151174103 0006522 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * CLI tool for system checks * * @package core * @category check * @copyright 2020 Brendan Heywood (brendan@catalyst-au.net) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__ . '/../../config.php'); require_once($CFG->libdir.'/clilib.php'); use core\check\result; list($options, $unrecognized) = cli_get_params([ 'help' => false, 'filter' => '', 'type' => 'status', 'verbose' => false, ], [ 'h' => 'help', 'f' => 'filter', 'v' => 'verbose', 't' => 'type', ]); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } $checks = \core\check\manager::get_checks($options['type']); $types = join(', ', \core\check\manager::TYPES); $help = "Run Moodle system checks Options: -h, --help Print out this help -f, --filter Filter to a subset of checks -t, --type Which set of checks? Defaults to 'status' One of $types -v, --verbose Show details of all checks, not just failed checks Example: sudo -u www-data php admin/cli/checks.php sudo -u www-data php admin/cli/checks.php -v sudo -u www-data php admin/cli/checks.php -v --filter=environment "; if ($options['help']) { echo $help; die(); } $filter = $options['filter']; if ($filter) { $checks = array_filter($checks, function($check, $key) use ($filter) { $ref = $check->get_ref(); return (strpos($ref, $filter) !== false); }, 1); } // These shell exit codes and labels align with the NRPE standard. $exitcodes = [ result::NA => 0, result::OK => 0, result::INFO => 0, result::UNKNOWN => 3, result::WARNING => 1, result::ERROR => 2, result::CRITICAL => 2, ]; $exitlabel = [ result::NA => 'OK', result::OK => 'OK', result::INFO => 'OK', result::UNKNOWN => 'UNKNOWN', result::WARNING => 'WARNING', result::ERROR => 'CRITICAL', result::CRITICAL => 'CRITICAL', ]; $format = "% 10s| % -60s\n"; $spacer = "----------+--------------------------------------------------------------------\n"; $prefix = ' |'; $output = ''; $header = $exitlabel[result::OK] . ': ' . get_string('checksok', '', $options['type']) . "\n"; $exitcode = $exitcodes[result::OK]; foreach ($checks as $check) { $ref = $check->get_ref(); $result = $check->get_result(); $status = $result->get_status(); $checkexitcode = $exitcodes[$status]; // Summary is treated as html. $summary = $result->get_summary(); $summary = html_to_text($summary, 60, false); if ($checkexitcode > $exitcode) { $exitcode = $checkexitcode; $header = $exitlabel[$status] . ': ' . $check->get_name() . " (" . $check->get_ref() . ")\n"; } if (empty($messages[$status])) { $messages[$status] = $result; } $len = strlen(get_string('status' . $status)); if ($options['verbose'] || $status == result::WARNING || $status == result::CRITICAL || $status == result::ERROR) { $output .= sprintf( $format, $OUTPUT->check_result($result), sprintf('%s (%s)', $check->get_name(), $ref) ); $summary = str_replace("\n", "\n" . $prefix . ' ', $summary); $output .= sprintf( $format, '', ' ' . $summary); if ($options['verbose']) { $actionlink = $check->get_action_link(); if ($actionlink) { $output .= sprintf( $format, '', ' ' . $actionlink->url); } $output .= sprintf( $format, '', ''); } } } // Print NRPE header. print $header; // Only show the table header if there is anything to show. if ($output) { print sprintf($format, get_string('status'). ' ', get_string('check') ) . $spacer; print $output; } // NRPE shell exit code. exit($exitcode); maintenance.php 0000644 00000007170 15151174103 0007542 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Enable or disable maintenance mode. * * @package core * @subpackage cli * @copyright 2009 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once("$CFG->libdir/clilib.php"); require_once("$CFG->libdir/adminlib.php"); // Now get cli options. list($options, $unrecognized) = cli_get_params(array('enable'=>false, 'enablelater'=>0, 'enableold'=>false, 'disable'=>false, 'help'=>false), array('h'=>'help')); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { $help = "Maintenance mode settings. Current status displayed if not option specified. Options: --enable Enable CLI maintenance mode --enablelater=MINUTES Number of minutes before entering CLI maintenance mode --enableold Enable legacy half-maintenance mode --disable Disable maintenance mode -h, --help Print out this help Example: \$ sudo -u www-data /usr/bin/php admin/cli/maintenance.php "; //TODO: localize - to be translated later when everything is finished echo $help; die; } cli_heading(get_string('sitemaintenancemode', 'admin')." ($CFG->wwwroot)"); if ($options['enablelater']) { if (file_exists("$CFG->dataroot/climaintenance.html")) { // Already enabled, sorry. echo get_string('clistatusenabled', 'admin')."\n"; return 1; } $time = time() + ($options['enablelater']*60); set_config('maintenance_later', $time); echo get_string('clistatusenabledlater', 'admin', userdate($time))."\n"; return 0; } else if ($options['enable']) { if (file_exists("$CFG->dataroot/climaintenance.html")) { // The maintenance is already enabled, nothing to do. } else { enable_cli_maintenance_mode(); } set_config('maintenance_enabled', 0); unset_config('maintenance_later'); echo get_string('sitemaintenanceoncli', 'admin')."\n"; exit(0); } else if ($options['enableold']) { set_config('maintenance_enabled', 1); unset_config('maintenance_later'); echo get_string('sitemaintenanceon', 'admin')."\n"; exit(0); } else if ($options['disable']) { set_config('maintenance_enabled', 0); unset_config('maintenance_later'); if (file_exists("$CFG->dataroot/climaintenance.html")) { unlink("$CFG->dataroot/climaintenance.html"); } echo get_string('sitemaintenanceoff', 'admin')."\n"; exit(0); } if (!empty($CFG->maintenance_enabled) or file_exists("$CFG->dataroot/climaintenance.html")) { echo get_string('clistatusenabled', 'admin')."\n"; } else if (isset($CFG->maintenance_later)) { echo get_string('clistatusenabledlater', 'admin', userdate($CFG->maintenance_later))."\n"; } else { echo get_string('clistatusdisabled', 'admin')."\n"; } reset_password.php 0000644 00000006257 15151174103 0010331 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This script allows you to reset any local user password. * * @package core * @subpackage cli * @copyright 2009 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); // cli only functions // Define the input options. $longparams = array( 'help' => false, 'username' => '', 'password' => '', 'ignore-password-policy' => false ); $shortparams = array( 'h' => 'help', 'u' => 'username', 'p' => 'password', 'i' => 'ignore-password-policy' ); // now get cli options list($options, $unrecognized) = cli_get_params($longparams, $shortparams); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { $help = "Reset local user passwords, useful especially for admin acounts. There are no security checks here because anybody who is able to execute this file may execute any PHP too. Options: -h, --help Print out this help -u, --username=username Specify username to change -p, --password=newpassword Specify new password --ignore-password-policy Ignore password policy when setting password Example: \$sudo -u www-data /usr/bin/php admin/cli/reset_password.php \$sudo -u www-data /usr/bin/php admin/cli/reset_password.php --username=rosaura --password=jiu3jiu --ignore-password-policy "; echo $help; die; } if ($options['username'] == '' ) { cli_heading('Password reset'); $prompt = "Enter username (manual authentication only)"; $username = cli_input($prompt); } else { $username = $options['username']; } if (!$user = $DB->get_record('user', array('auth'=>'manual', 'username'=>$username, 'mnethostid'=>$CFG->mnet_localhost_id))) { cli_error("Can not find user '$username'"); } if ($options['password'] == '' ) { $prompt = "Enter new password"; $password = cli_input($prompt); } else { $password = $options['password']; } $errmsg = '';//prevent eclipse warning if (!$options['ignore-password-policy'] ) { if (!check_password_policy($password, $errmsg, $user)) { cli_error(html_to_text($errmsg, 0)); } } $hashedpassword = hash_internal_user_password($password); $DB->set_field('user', 'password', $hashedpassword, array('id'=>$user->id)); echo "Password changed\n"; exit(0); // 0 means success. fix_deleted_users.php 0000644 00000006454 15151174103 0010761 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This script fixed incorrectly deleted users. * * @package core * @subpackage cli * @copyright 2013 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); // Now get cli options. list($options, $unrecognized) = cli_get_params(array('help'=>false), array('h'=>'help')); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { $help = "Fix incorrectly deleted users. This scripts detects users that are marked as deleted instead of calling delete_user(). Deleted users do not have original username, idnumber or email, we must also delete all roles, enrolments, group memberships, etc. Please note this script does not delete any public information such as forum posts. Options: -h, --help Print out this help Example: \$sudo -u www-data /usr/bin/php admin/cli/fix_deleted_users.php "; echo $help; die; } cli_heading('Looking for sloppy user deletes'); // Look for sloppy deleted users where somebody only flipped the deleted flag. $sql = "SELECT * FROM {user} WHERE deleted = 1 AND email LIKE '%@%' AND username NOT LIKE '%@%'"; $rs = $DB->get_recordset_sql($sql); foreach ($rs as $user) { echo "Redeleting user $user->id: $user->username ($user->email)\n"; delete_user($user); } $rs->close(); cli_heading('Deleting all leftovers'); $DB->set_field('user', 'idnumber', '', array('deleted'=>1)); $DB->delete_records_select('role_assignments', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); $DB->delete_records_select('cohort_members', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); $DB->delete_records_select('groups_members', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); $DB->delete_records_select('user_enrolments', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); $DB->delete_records_select('user_preferences', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); $DB->delete_records_select('user_info_data', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); $DB->delete_records_select('user_lastaccess', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); $DB->delete_records_select('external_tokens', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); $DB->delete_records_select('external_services_users', "userid IN (SELECT id FROM {user} WHERE deleted = 1)"); exit(0); kill_all_sessions.php 0000644 00000003055 15151174103 0010767 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * CLI script to kill all user sessions without asking for confirmation. * * @package core * @subpackage cli * @copyright 2017 Alexander Bias <alexander.bias@uni-ulm.de> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); list($options, $unrecognized) = cli_get_params(array('help' => false), array('h' => 'help')); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized), 2); } if ($options['help']) { $help = "Kill all Moodle sessions Options: -h, --help Print out this help Example: \$sudo -u www-data /usr/bin/php admin/cli/kill_all_sessions.php "; echo $help; exit(0); } \core\session\manager::kill_all_sessions(); exit(0); scheduled_task.php 0000644 00000012426 15151174103 0010242 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * CLI task execution. * * @package core * @subpackage cli * @copyright 2014 Petr Skoda * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__ . '/../../config.php'); require_once("$CFG->libdir/clilib.php"); require_once("$CFG->libdir/cronlib.php"); list($options, $unrecognized) = cli_get_params( [ 'help' => false, 'list' => false, 'execute' => false, 'showsql' => false, 'showdebugging' => false, 'force' => false, ], [ 'h' => 'help', 'f' => 'force', ] ); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help'] or (!$options['list'] and !$options['execute'])) { $help = "Scheduled cron tasks. Options: --execute=\\some\\task Execute scheduled task manually --list List all scheduled tasks --showsql Show sql queries before they are executed --showdebugging Show developer level debugging information -h, --help Print out this help -f, --force Execute task even if cron is disabled Example: \$sudo -u www-data /usr/bin/php admin/cli/scheduled_task.php --execute=\\core\\task\\session_cleanup_task "; echo $help; die; } if ($options['showdebugging'] || !empty($CFG->showcrondebugging)) { set_debugging(DEBUG_DEVELOPER, true); } if ($options['showsql'] || !empty($CFG->showcronsql)) { $DB->set_debug(true); } if ($options['list']) { cli_heading("List of scheduled tasks ($CFG->wwwroot)"); $shorttime = get_string('strftimedatetimeshort'); $tasks = \core\task\manager::get_all_scheduled_tasks(); echo str_pad(get_string('scheduledtasks', 'tool_task'), 50, ' ') . ' ' . str_pad(get_string('runpattern', 'tool_task'), 17, ' ') . ' ' . str_pad(get_string('lastruntime', 'tool_task'), 40, ' ') . get_string('nextruntime', 'tool_task') . "\n"; foreach ($tasks as $task) { $class = '\\' . get_class($task); $schedule = $task->get_minute() . ' ' . $task->get_hour() . ' ' . $task->get_day() . ' ' . $task->get_day_of_week() . ' ' . $task->get_month() . ' ' . $task->get_day_of_week(); $nextrun = $task->get_next_run_time(); $lastrun = $task->get_last_run_time(); $plugininfo = core_plugin_manager::instance()->get_plugin_info($task->get_component()); $plugindisabled = $plugininfo && $plugininfo->is_enabled() === false && !$task->get_run_if_component_disabled(); if ($plugindisabled) { $nextrun = get_string('plugindisabled', 'tool_task'); } else if ($task->get_disabled()) { $nextrun = get_string('taskdisabled', 'tool_task'); } else if ($nextrun > time()) { $nextrun = userdate($nextrun); } else { $nextrun = get_string('asap', 'tool_task'); } if ($lastrun) { $lastrun = userdate($lastrun); } else { $lastrun = get_string('never'); } echo str_pad($class, 50, ' ') . ' ' . str_pad($schedule, 17, ' ') . ' ' . str_pad($lastrun, 40, ' ') . ' ' . $nextrun . "\n"; } exit(0); } if ($execute = $options['execute']) { if (!$task = \core\task\manager::get_scheduled_task($execute)) { mtrace("Task '$execute' not found"); exit(1); } if (moodle_needs_upgrading()) { mtrace("Moodle upgrade pending, cannot execute tasks."); exit(1); } if (!get_config('core', 'cron_enabled') && !$options['force']) { mtrace('Cron is disabled. Use --force to override.'); exit(1); } \core\task\manager::scheduled_task_starting($task); // Increase memory limit. raise_memory_limit(MEMORY_EXTRA); // Emulate normal session - we use admin account by default. cron_setup_user(); // Execute the task. \core\local\cli\shutdown::script_supports_graceful_exit(); $cronlockfactory = \core\lock\lock_config::get_lock_factory('cron'); if (!$cronlock = $cronlockfactory->get_lock('core_cron', 10)) { mtrace('Cannot obtain cron lock'); exit(129); } if (!$lock = $cronlockfactory->get_lock('\\' . get_class($task), 10)) { $cronlock->release(); mtrace('Cannot obtain task lock'); exit(130); } $task->set_lock($lock); if (!$task->is_blocking()) { $cronlock->release(); } else { $task->set_cron_lock($cronlock); } cron_run_inner_scheduled_task($task); } fix_orphaned_question_categories.php 0000644 00000006717 15151174103 0014070 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This script fixes orphaned question categories. * * Orphaned question categories have had their associated context deleted * but the category itself remains in the database with an invalid context. * * @package core * @subpackage cli * @copyright 2013 Tyler Bannister (tyler.bannister@remote-learner.net) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); require_once($CFG->libdir.'/questionlib.php'); $long = array('fix' => false, 'help' => false); $short = array('f' => 'fix', 'h' => 'help'); // Now get cli options. list($options, $unrecognized) = cli_get_params($long, $short); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { $help = "Fix orphaned question categories. This scripts detects question categories that have had their context deleted, thus severing them from their original purpose. This script will find the orphaned categories and delete the unused questions in each category found. Used questions will not be deleted, instead they will be moved to a rescue question category. Options: -h, --help Print out this help -f, --fix Fix the orphaned question categories in the DB. If not specified only check and report problems to STDERR. Example: \$sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_question_categories.php \$sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_question_categories.php -f "; echo $help; die; } cli_heading('Checking for orphaned categories'); $sql = 'SELECT qc.id, qc.contextid, qc.name FROM {question_categories} qc LEFT JOIN {context} c ON qc.contextid = c.id WHERE c.id IS NULL'; $categories = $DB->get_recordset_sql($sql); $i = 0; foreach ($categories as $category) { $i += 1; echo "Found orphaned category: {$category->name}\n"; if (!empty($options['fix'])) { echo "Cleaning..."; // One transaction per category. $transaction = $DB->start_delegated_transaction(); question_category_delete_safe($category); $transaction->allow_commit(); echo " Done!\n"; } } if (($i > 0) && !empty($options['fix'])) { echo "Found and removed {$i} orphaned question categories\n"; } else if ($i > 0) { echo "Found {$i} orphaned question categories. To fix, run:\n"; echo "\$sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_question_categories.php --fix\n"; } else { echo "No orphaned question categories found.\n"; } $categories->close(); delete_course.php 0000644 00000007204 15151174103 0010100 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * CLI script to delete a course. * * @package core * @subpackage cli * @author Mikhail Golenkov <mikhailgolenkov@catalyst-au.net> * @copyright 2022 Catalyst IT * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__ . '/../../config.php'); require_once($CFG->libdir . '/clilib.php'); require_once($CFG->libdir . '/cronlib.php'); list($options, $unrecognized) = cli_get_params( [ 'courseid' => false, 'help' => false, 'showsql' => false, 'showdebugging' => false, 'disablerecyclebin' => false, 'non-interactive' => false, ], [ 'c' => 'courseid', 'h' => 'help', ] ); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help'] || empty($options['courseid'])) { $help = <<<EOT CLI script to delete a course. Options: -h, --help Print out this help --showsql Show sql queries before they are executed --showdebugging Show developer level debugging information --disablerecyclebin Skip backing up the course --non-interactive No interactive questions or confirmations -c, --courseid Course id to be deleted Example: \$sudo -u www-data /usr/bin/php admin/cli/delete_course.php --courseid=123456 \$sudo -u www-data /usr/bin/php admin/cli/delete_course.php --courseid=123456 --showdebugging \$sudo -u www-data /usr/bin/php admin/cli/delete_course.php --courseid=123456 --disablerecyclebin EOT; echo $help; die; } $interactive = empty($options['non-interactive']); if ($options['showdebugging']) { mtrace('Enabling debugging...'); set_debugging(DEBUG_DEVELOPER, true); } if ($options['showsql']) { mtrace('Enabling SQL debugging...'); $DB->set_debug(true); } if (CLI_MAINTENANCE) { cli_error('CLI maintenance mode active, CLI execution suspended'); } if (moodle_needs_upgrading()) { cli_error('Moodle upgrade pending, CLI execution suspended'); } $course = $DB->get_record('course', array('id' => $options['courseid'])); if (empty($course)) { cli_error('Course not found'); } mtrace('Deleting course id ' . $course->id); mtrace('Course name: ' . $course->fullname); mtrace('Short name: ' . $course->shortname); if ($interactive) { mtrace(''); $input = cli_input('Are you sure you wish to delete this course? (y/N)', 'N', ['y', 'Y', 'n', 'N']); if (strtolower($input) != 'y') { exit(0); } } if ($options['disablerecyclebin']) { mtrace('Disabling recycle bin...'); $overrideconfig = ['tool_recyclebin' => ['coursebinenable' => false, 'categorybinenable' => false]]; $CFG->forced_plugin_settings = array_merge($CFG->forced_plugin_settings, $overrideconfig); } core_php_time_limit::raise(); delete_course($course); mtrace('Updating course count in categories...'); fix_course_sortorder(); mtrace('Done!'); check_database_schema.php 0000644 00000003624 15151174103 0011501 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Validate that the current db structure matches the install.xml files. * * @package core * @copyright 2014 Totara Learning Solutions Ltd {@link http://www.totaralms.com/} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @author Petr Skoda <petr.skoda@totaralms.com> */ define('CLI_SCRIPT', true); require(__DIR__ . '/../../config.php'); require_once($CFG->libdir.'/clilib.php'); $help = "Validate database structure Options: -h, --help Print out this help. Example: \$ sudo -u www-data /usr/bin/php admin/cli/check_database_schema.php "; list($options, $unrecognized) = cli_get_params( array( 'help' => false, ), array( 'h' => 'help', ) ); if ($options['help']) { echo $help; exit(0); } if (empty($CFG->version)) { echo "Database is not yet installed.\n"; exit(2); } $dbmanager = $DB->get_manager(); $schema = $dbmanager->get_install_xml_schema(); if (!$errors = $dbmanager->check_database_schema($schema)) { echo "Database structure is ok.\n"; exit(0); } foreach ($errors as $table => $items) { cli_separator(); echo "$table\n"; foreach ($items as $item) { echo " * $item\n"; } } cli_separator(); exit(1); automated_backups.php 0000644 00000005325 15151174103 0010753 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Automated backups CLI cron * * This script executes * * @package core * @subpackage cli * @copyright 2010 Sam Hemelryk * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); // cli only functions require_once($CFG->libdir.'/cronlib.php'); // now get cli options list($options, $unrecognized) = cli_get_params(array('help'=>false), array('h'=>'help')); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { $help = "Execute automated backups. This script executes automated backups completely and is designed to be called via cron. Options: -h, --help Print out this help Example: \$sudo -u www-data /usr/bin/php admin/cli/automated_backups.php "; echo $help; die; } if (CLI_MAINTENANCE) { echo "CLI maintenance mode active, backup execution suspended.\n"; exit(1); } if (moodle_needs_upgrading()) { echo "Moodle upgrade pending, backup execution suspended.\n"; exit(1); } require_once($CFG->libdir.'/adminlib.php'); require_once($CFG->libdir.'/gradelib.php'); if (!empty($CFG->showcronsql)) { $DB->set_debug(true); } if (!empty($CFG->showcrondebugging)) { set_debugging(DEBUG_DEVELOPER, true); } $starttime = microtime(); /// emulate normal session cron_setup_user(); /// Start output log $timenow = time(); mtrace("Server Time: ".date('r',$timenow)."\n\n"); // Run automated backups if required. require_once($CFG->dirroot.'/backup/util/includes/backup_includes.php'); require_once($CFG->dirroot.'/backup/util/helper/backup_cron_helper.class.php'); backup_cron_automated_helper::run_automated_backup(backup_cron_automated_helper::RUN_IMMEDIATELY); mtrace("Automated cron backups completed correctly"); $difftime = microtime_diff($starttime, microtime()); mtrace("Execution took ".$difftime." seconds"); backup.php 0000644 00000007743 15151174103 0006533 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This script allows to do backup. * * @package core * @subpackage cli * @copyright 2013 Lancaster University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', 1); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php'); // Now get cli options. list($options, $unrecognized) = cli_get_params(array( 'courseid' => false, 'courseshortname' => '', 'destination' => '', 'help' => false, ), array('h' => 'help')); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help'] || !($options['courseid'] || $options['courseshortname'])) { $help = <<<EOL Perform backup of the given course. Options: --courseid=INTEGER Course ID for backup. --courseshortname=STRING Course shortname for backup. --destination=STRING Path where to store backup file. If not set the backup will be stored within the course backup file area. -h, --help Print out this help. Example: \$sudo -u www-data /usr/bin/php admin/cli/backup.php --courseid=2 --destination=/moodle/backup/\n EOL; echo $help; die; } $admin = get_admin(); if (!$admin) { mtrace("Error: No admin account was found"); die; } // Do we need to store backup somewhere else? $dir = rtrim($options['destination'], '/'); if (!empty($dir)) { if (!file_exists($dir) || !is_dir($dir) || !is_writable($dir)) { mtrace("Destination directory does not exists or not writable."); die; } } // Check that the course exists. if ($options['courseid']) { $course = $DB->get_record('course', array('id' => $options['courseid']), '*', MUST_EXIST); } else if ($options['courseshortname']) { $course = $DB->get_record('course', array('shortname' => $options['courseshortname']), '*', MUST_EXIST); } cli_heading('Performing backup...'); $bc = new backup_controller(backup::TYPE_1COURSE, $course->id, backup::FORMAT_MOODLE, backup::INTERACTIVE_YES, backup::MODE_GENERAL, $admin->id); // Set the default filename. $format = $bc->get_format(); $type = $bc->get_type(); $id = $bc->get_id(); $users = $bc->get_plan()->get_setting('users')->get_value(); $anonymised = $bc->get_plan()->get_setting('anonymize')->get_value(); $filename = backup_plan_dbops::get_default_backup_filename($format, $type, $id, $users, $anonymised); $bc->get_plan()->get_setting('filename')->set_value($filename); // Execution. $bc->finish_ui(); $bc->execute_plan(); $results = $bc->get_results(); $file = $results['backup_destination']; // May be empty if file already moved to target location. // Do we need to store backup somewhere else? if (!empty($dir)) { if ($file) { mtrace("Writing " . $dir.'/'.$filename); if ($file->copy_content_to($dir.'/'.$filename)) { $file->delete(); mtrace("Backup completed."); } else { mtrace("Destination directory does not exist or is not writable. Leaving the backup in the course backup file area."); } } } else { mtrace("Backup completed, the new file is listed in the backup area of the given course"); } $bc->destroy(); exit(0); mysql_collation.php 0000644 00000030571 15151174103 0010472 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * MySQL collation conversion tool. * * @package core * @copyright 2012 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); // cli only functions if ($DB->get_dbfamily() !== 'mysql') { cli_error('This function is designed for MySQL databases only!'); } // now get cli options list($options, $unrecognized) = cli_get_params(array('help'=>false, 'list'=>false, 'collation'=>false, 'available'=>false), array('h'=>'help', 'l'=>'list', 'a'=>'available')); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } $help = "MySQL collation conversions script. It is strongly recommended to stop the web server before the conversion. This script may be executed before the main upgrade - 1.9.x data for example. Options: --collation=COLLATION Convert MySQL tables to different collation -l, --list Show table and column information -a, --available Show list of available collations -h, --help Print out this help Example: \$ sudo -u www-data /usr/bin/php admin/cli/mysql_collation.php --collation=utf8mb4_unicode_ci "; if (!empty($options['collation'])) { $collations = mysql_get_collations(); $collation = clean_param($options['collation'], PARAM_ALPHANUMEXT); $collation = strtolower($collation); if (!isset($collations[$collation])) { cli_error("Error: collation '$collation' is not available on this server!"); } $collationinfo = explode('_', $collation); $charset = reset($collationinfo); $engine = strtolower($DB->get_dbengine()); // Do checks for utf8mb4. if (strpos($collation, 'utf8mb4') === 0) { // Do we have the right engine? if ($engine !== 'innodb' && $engine !== 'xtradb') { cli_error("Error: '$collation' requires InnoDB or XtraDB set as the engine."); } // Are we using Barracuda? if ($DB->get_row_format() != 'Barracuda') { // Try setting it here. try { $DB->execute("SET GLOBAL innodb_file_format=Barracuda"); } catch (dml_exception $e) { cli_error("Error: '$collation' requires the file format to be set to Barracuda. An attempt was made to change the format, but it failed. Please try doing this manually."); } echo "GLOBAL SETTING: innodb_file_format changed to Barracuda\n"; } // Is one file per table being used? if (!$DB->is_file_per_table_enabled()) { try { $DB->execute("SET GLOBAL innodb_file_per_table=1"); } catch (dml_exception $e) { cli_error("Error: '$collation' requires the setting 'innodb_file_per_table' be set to 'ON'. An attempt was made to change the format, but it failed. Please try doing this manually."); } echo "GLOBAL SETTING: innodb_file_per_table changed to 1\n"; } // Is large prefix set? if (!$DB->is_large_prefix_enabled()) { try { $DB->execute("SET GLOBAL innodb_large_prefix=1"); } catch (dml_exception $e) { cli_error("Error: '$collation' requires the setting 'innodb_large_prefix' be set to 'ON'. An attempt was made to change the format, but it failed. Please try doing this manually."); } echo "GLOBAL SETTING: innodb_large_prefix changed to 1\n"; } } $sql = "SHOW VARIABLES LIKE 'collation_database'"; if (!$dbcollation = $DB->get_record_sql($sql)) { cli_error("Error: Could not access collation information on the database."); } $sql = "SHOW VARIABLES LIKE 'character_set_database'"; if (!$dbcharset = $DB->get_record_sql($sql)) { cli_error("Error: Could not access character set information on the database."); } if ($dbcollation->value !== $collation || $dbcharset->value !== $charset) { // Try to convert the DB. echo "Converting database to '$collation' for $CFG->wwwroot:\n"; $sql = "ALTER DATABASE `$CFG->dbname` DEFAULT CHARACTER SET $charset DEFAULT COLLATE = $collation"; try { $DB->change_database_structure($sql); } catch (exception $e) { cli_error("Error: Tried to alter the database with no success. Please try manually changing the database to the new collation and character set and then run this script again."); } echo "DATABASE CONVERTED\n"; } echo "Converting tables and columns to '$collation' for $CFG->wwwroot:\n"; $prefix = $DB->get_prefix(); $prefix = str_replace('_', '\\_', $prefix); $sql = "SHOW TABLE STATUS WHERE Name LIKE BINARY '$prefix%'"; $rs = $DB->get_recordset_sql($sql); $converted = 0; $skipped = 0; $errors = 0; foreach ($rs as $table) { echo str_pad($table->name, 40). " - "; if ($table->collation === $collation) { echo "NO CHANGE\n"; $skipped++; } else { try { $DB->change_database_structure("ALTER TABLE `$table->name` CONVERT TO CHARACTER SET $charset COLLATE $collation"); echo "CONVERTED\n"; $converted++; } catch (ddl_exception $e) { $result = mysql_set_row_format($table->name, $charset, $collation, $engine); if ($result) { echo "CONVERTED\n"; $converted++; } else { // We don't know what the problem is. Stop the conversion. cli_error("Error: Tried to convert $table->name, but there was a problem. Please check the details of this table and try again."); die(); } } } $sql = "SHOW FULL COLUMNS FROM `$table->name` WHERE collation IS NOT NULL"; $rs2 = $DB->get_recordset_sql($sql); foreach ($rs2 as $column) { $column = (object)array_change_key_case((array)$column, CASE_LOWER); echo ' '.str_pad($column->field, 36). " - "; if ($column->collation === $collation) { echo "NO CHANGE\n"; $skipped++; continue; } // Check for utf8mb4 collation. $rowformat = $DB->get_row_format_sql($engine, $collation); if ($column->type === 'tinytext' or $column->type === 'mediumtext' or $column->type === 'text' or $column->type === 'longtext') { $notnull = ($column->null === 'NO') ? 'NOT NULL' : 'NULL'; $default = (!is_null($column->default) and $column->default !== '') ? "DEFAULT '$column->default'" : ''; // primary, unique and inc are not supported for texts $sql = "ALTER TABLE `$table->name` MODIFY COLUMN $column->field $column->type CHARACTER SET $charset COLLATE $collation $notnull $default"; $DB->change_database_structure($sql); } else if (strpos($column->type, 'varchar') === 0) { $notnull = ($column->null === 'NO') ? 'NOT NULL' : 'NULL'; $default = !is_null($column->default) ? "DEFAULT '$column->default'" : ''; if ($rowformat != '') { $sql = "ALTER TABLE `$table->name` $rowformat"; $DB->change_database_structure($sql); } $sql = "ALTER TABLE `$table->name` MODIFY COLUMN $column->field $column->type CHARACTER SET $charset COLLATE $collation $notnull $default"; $DB->change_database_structure($sql); } else { echo "ERROR (unknown column type: $column->type)\n"; $errors++; continue; } echo "CONVERTED\n"; $converted++; } $rs2->close(); } $rs->close(); echo "Converted: $converted, skipped: $skipped, errors: $errors\n"; exit(0); // success } else if (!empty($options['list'])) { echo "List of tables for $CFG->wwwroot:\n"; $prefix = $DB->get_prefix(); $prefix = str_replace('_', '\\_', $prefix); $sql = "SHOW TABLE STATUS WHERE Name LIKE BINARY '$prefix%'"; $rs = $DB->get_recordset_sql($sql); $counts = array(); foreach ($rs as $table) { if (isset($counts[$table->collation])) { $counts[$table->collation]++; } else { $counts[$table->collation] = 1; } echo str_pad($table->name, 40); echo $table->collation. "\n"; $collations = mysql_get_column_collations($table->name); foreach ($collations as $columname=>$collation) { if (isset($counts[$collation])) { $counts[$collation]++; } else { $counts[$collation] = 1; } echo ' '; echo str_pad($columname, 36); echo $collation. "\n"; } } $rs->close(); echo "\n"; echo "Table collations summary for $CFG->wwwroot:\n"; foreach ($counts as $collation => $count) { echo "$collation: $count\n"; } exit(0); // success } else if (!empty($options['available'])) { echo "List of available MySQL collations for $CFG->wwwroot:\n"; $collations = mysql_get_collations(); foreach ($collations as $collation) { echo " $collation\n"; } die; } else { echo $help; die; } // ========== Some functions ============== function mysql_get_collations() { global $DB; $collations = array(); $sql = "SHOW COLLATION WHERE Collation LIKE 'utf8\_%' AND Charset = 'utf8' OR Collation LIKE 'utf8mb4\_%' AND Charset = 'utf8mb4'"; $rs = $DB->get_recordset_sql($sql); foreach ($rs as $collation) { $collations[$collation->collation] = $collation->collation; } $rs->close(); $collation = $DB->get_dbcollation(); if (isset($collations[$collation])) { $collations[$collation] .= ' (default)'; } return $collations; } function mysql_get_column_collations($tablename) { global $DB; $collations = array(); $sql = "SELECT column_name, collation_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE() AND table_name = ? AND collation_name IS NOT NULL"; $rs = $DB->get_recordset_sql($sql, array($tablename)); foreach($rs as $record) { $collations[$record->column_name] = $record->collation_name; } $rs->close(); return $collations; } function mysql_set_row_format($tablename, $charset, $collation, $engine) { global $DB; $sql = "SELECT row_format FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = DATABASE() AND table_name = ?"; $rs = $DB->get_record_sql($sql, array($tablename)); if ($rs) { if ($rs->row_format == 'Compact' || $rs->row_format == 'Redundant') { $rowformat = $DB->get_row_format_sql($engine, $collation); // Try to convert to compressed format and then try updating the collation again. $DB->change_database_structure("ALTER TABLE `$tablename` $rowformat"); $DB->change_database_structure("ALTER TABLE `$tablename` CONVERT TO CHARACTER SET $charset COLLATE $collation"); } else { // Row format may not be the problem. Can not diagnose problem. Send fail reply. return false; } } else { return false; } return true; } install_database.php 0000644 00000014662 15151174103 0010556 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This installs Moodle into empty database, config.php must already exist. * * This script is intended for advanced usage such as in Debian packages. * - sudo to www-data (apache account) before * - not compatible with Windows platform * * @package core * @subpackage cli * @copyright 2010 Petr Skoda (http://skodak.org) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); define('CACHE_DISABLE_ALL', true); // extra execution prevention - we can not just require config.php here if (isset($_SERVER['REMOTE_ADDR'])) { exit(1); } // Force OPcache reset if used, we do not want any stale caches // when preparing test environment. if (function_exists('opcache_reset')) { opcache_reset(); } $help = "Advanced command line Moodle database installer. Please note you must execute this script with the same uid as apache. Site defaults may be changed via local/defaults.php. Options: --lang=CODE Installation and default site language. Default is en. --adminuser=USERNAME Username for the moodle admin account. Default is admin. --adminpass=PASSWORD Password for the moodle admin account. --adminemail=STRING Email address for the moodle admin account. --agree-license Indicates agreement with software license. --fullname=STRING Name of the site --shortname=STRING Name of the site --summary=STRING The summary to be displayed on the front page -h, --help Print out this help Example: \$sudo -u www-data /usr/bin/php admin/cli/install_database.php --lang=cs --adminpass=soMePass123 --agree-license "; // Check that PHP is of a sufficient version as soon as possible. require_once(__DIR__.'/../../lib/phpminimumversionlib.php'); moodle_require_minimum_php_version(); // Nothing to do if config.php does not exist $configfile = __DIR__.'/../../config.php'; if (!file_exists($configfile)) { fwrite(STDERR, 'config.php does not exist, can not continue'); // do not localize fwrite(STDERR, "\n"); exit(1); } // Include necessary libs require($configfile); require_once($CFG->libdir.'/clilib.php'); require_once($CFG->libdir.'/installlib.php'); require_once($CFG->libdir.'/adminlib.php'); require_once($CFG->libdir.'/componentlib.class.php'); $CFG->early_install_lang = true; get_string_manager(true); raise_memory_limit(MEMORY_EXTRA); // now get cli options list($options, $unrecognized) = cli_get_params( array( 'lang' => 'en', 'adminuser' => 'admin', 'adminpass' => '', 'adminemail' => '', 'fullname' => '', 'shortname' => '', 'summary' => '', 'agree-license' => false, 'help' => false ), array( 'h' => 'help' ) ); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } // We show help text even if tables are installed. if ($options['help']) { echo $help; die; } // Make sure no tables are installed yet. if ($DB->get_tables() ) { cli_error(get_string('clitablesexist', 'install')); } if (!$options['agree-license']) { cli_error('You have to agree to the license. --help prints out the help'); // TODO: localize } if ($options['adminpass'] === true or $options['adminpass'] === '') { cli_error('You have to specify admin password. --help prints out the help'); // TODO: localize } // Validate that the address provided was an e-mail address. if (!empty($options['adminemail']) && !validate_email($options['adminemail'])) { $a = (object) array('option' => 'adminemail', 'value' => $options['adminemail']); cli_error(get_string('cliincorrectvalueerror', 'admin', $a)); } $options['lang'] = clean_param($options['lang'], PARAM_SAFEDIR); if (!file_exists($CFG->dirroot.'/install/lang/'.$options['lang'])) { $options['lang'] = 'en'; } $CFG->lang = $options['lang']; // download required lang packs if ($CFG->lang !== 'en') { make_upload_directory('lang'); $installer = new lang_installer($CFG->lang); $results = $installer->run(); foreach ($results as $langcode => $langstatus) { if ($langstatus === lang_installer::RESULT_DOWNLOADERROR) { $a = new stdClass(); $a->url = $installer->lang_pack_url($langcode); $a->dest = $CFG->dataroot.'/lang'; cli_problem(get_string('remotedownloaderror', 'error', $a)); } } } // switch the string_manager instance to stop using install/lang/ $CFG->early_install_lang = false; get_string_manager(true); require("$CFG->dirroot/version.php"); // Test environment first. require_once($CFG->libdir . '/environmentlib.php'); list($envstatus, $environment_results) = check_moodle_environment(normalize_version($release), ENV_SELECT_RELEASE); if (!$envstatus) { $errors = environment_get_errors($environment_results); cli_heading(get_string('environment', 'admin')); foreach ($errors as $error) { list($info, $report) = $error; echo "!! $info !!\n$report\n\n"; } exit(1); } // Test plugin dependencies. $failed = array(); if (!core_plugin_manager::instance()->all_plugins_ok($version, $failed)) { cli_problem(get_string('pluginscheckfailed', 'admin', array('pluginslist' => implode(', ', array_unique($failed))))); cli_error(get_string('pluginschecktodo', 'admin')); } install_cli_database($options, true); // This needs to happen at the end to ensure it occurs after all caches // have been purged for the last time. // This will build a cached version of the current theme for the user // to immediately start browsing the site. require_once($CFG->libdir.'/upgradelib.php'); upgrade_themes(); echo get_string('cliinstallfinished', 'install')."\n"; exit(0); // 0 means success fix_orphaned_calendar_events.php 0000644 00000012353 15151174103 0013142 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Fix orphaned calendar events that were broken by MDL-67494. * * This script will look for all the calendar events which userids * where broken by a wrong upgrade step, affecting to Moodle 3.9.5 * and up. * * It performs checks to both: * a) Detect if the site was affected (ran the wrong upgrade step). * b) Look for orphaned calendar events, categorising them as: * - standard: site / category / course / group / user events * - subscription: events created via subscriptions. * - action: normal action events, created to show common important dates. * - override: user and group override events, particular, that some activities support. * - custom: other events, not being any of the above, common or particular. * By specifying it (--fix) try to recover as many broken events (missing userid) as * possible. Standard, subscription, action, override events in core are fully supported but * override or custom events should be fixed by each plugin as far as there isn't any standard * API (plugin-wise) to launch a rebuild of the calendar events. * * @package core * @copyright 2021 onwards Simey Lameze <simey@moodle.com> * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require_once(__DIR__ . '/../../config.php'); require_once($CFG->libdir . "/clilib.php"); require_once($CFG->libdir . '/db/upgradelib.php'); // Supported options. $long = ['fix' => false, 'help' => false]; $short = ['f' => 'fix', 'h' => 'help']; // CLI options. [$options, $unrecognized] = cli_get_params($long, $short); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { $help = <<<EOT Fix orphaned calendar events. This script detects calendar events that have had their userid lost. By default it will perform various checks and report them, showing the site status in an easy way. Also, optionally (--fix), it wil try to recover as many lost userids as possible from different sources. Note that this script aims to process well-know events in core, leaving custom events in 3rd part plugins mostly unmodified because there isn't any consistent way to regenerate them. For more details: https://tracker.moodle.org/browse/MDL-71156 Options: -h, --help Print out this help. -f, --fix Fix the orphaned calendar events in the DB. If not specified only check and report problems to STDERR. Usage: - Only report: \$ sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_calendar_events.php - Report and fix: \$ sudo -u www-data /usr/bin/php admin/cli/fix_orphaned_calendar_events.php -f EOT; cli_writeln($help); die; } // Check various usual pre-requisites. if (empty($CFG->version)) { cli_error('Database is not yet installed.'); } $admin = get_admin(); if (!$admin) { cli_error('Error: No admin account was found.'); } if (moodle_needs_upgrading()) { cli_error('Moodle upgrade pending, script execution suspended.'); } // Do everything as admin by default. \core\session\manager::set_user($admin); // Report current site status. cli_heading('Checking the site status'); $needsfix = upgrade_calendar_site_status(); // Report current calendar events status. cli_heading('Checking the calendar events status'); $info = upgrade_calendar_events_status(); $hasbadevents = $info['total']->bad > 0 || $info['total']->bad != $info['other']->bad; $needsfix = $needsfix || $hasbadevents; // If, selected, fix as many calendar events as possible. if ($options['fix']) { // If the report has told us that the fix was not needed... ask for confirmation! if (!$needsfix) { cli_writeln("This site DOES NOT NEED to run the calendar events fix."); $input = cli_input('Are you completely sure that you want to run the fix? (y/N)', 'N', ['y', 'Y', 'n', 'N']); if (strtolower($input) != 'y') { exit(0); } cli_writeln(""); } cli_heading('Fixing as many as possible calendar events'); upgrade_calendar_events_fix_remaining($info); // Report current (after fix) calendar events status. cli_heading('Checking the calendar events status (after fix)'); upgrade_calendar_events_status(); } else if ($needsfix) { // Fix option was not provided but problem events have been found. Notify the user and provide info how to fix these events. cli_writeln("This site NEEDS to run the calendar events fix!"); cli_writeln("To fix the calendar events, re-run this script with the --fix option."); } restore_backup.php 0000644 00000006707 15151174103 0010275 0 ustar 00 <?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This script allows to restore a course from CLI. * * @package core * @subpackage cli * @copyright 2020 Catalyst IT * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', 1); require(__DIR__ . '/../../config.php'); require_once($CFG->libdir . '/clilib.php'); require_once($CFG->dirroot . "/backup/util/includes/restore_includes.php"); list($options, $unrecognized) = cli_get_params([ 'file' => '', 'categoryid' => '', 'showdebugging' => false, 'help' => false, ], [ 'f' => 'file', 'c' => 'categoryid', 's' => 'showdebugging', 'h' => 'help', ]); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help'] || !($options['file']) || !($options['categoryid'])) { $help = <<<EOL Restore backup into provided category. Options: -f, --file=STRING Path to the backup file. -c, --categoryid=INT ID of the category to restore too. -s, --showdebugging Show developer level debugging information -h, --help Print out this help. Example: \$sudo -u www-data /usr/bin/php admin/cli/restore_backup.php --file=/path/to/backup/file.mbz --categoryid=1\n EOL; echo $help; exit(0); } if ($options['showdebugging']) { set_debugging(DEBUG_DEVELOPER, true); } if (!$admin = get_admin()) { throw new \moodle_exception('noadmins'); } if (!file_exists($options['file'])) { throw new \moodle_exception('filenotfound'); } if (!$category = $DB->get_record('course_categories', ['id' => $options['categoryid']], 'id')) { throw new \moodle_exception('invalidcategoryid'); } $backupdir = "restore_" . uniqid(); $path = $CFG->tempdir . DIRECTORY_SEPARATOR . "backup" . DIRECTORY_SEPARATOR . $backupdir; cli_heading(get_string('extractingbackupfileto', 'backup', $path)); $fp = get_file_packer('application/vnd.moodle.backup'); $fp->extract_to_pathname($options['file'], $path); cli_heading(get_string('preprocessingbackupfile')); try { list($fullname, $shortname) = restore_dbops::calculate_course_names(0, get_string('restoringcourse', 'backup'), get_string('restoringcourseshortname', 'backup')); $courseid = restore_dbops::create_new_course($fullname, $shortname, $category->id); $rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO, backup::MODE_GENERAL, $admin->id, backup::TARGET_NEW_COURSE); $rc->execute_precheck(); $rc->execute_plan(); $rc->destroy(); } catch (Exception $e) { cli_heading(get_string('cleaningtempdata')); fulldelete($path); throw new \moodle_exception('generalexceptionmessage', 'error', '', $e->getMessage()); } cli_heading(get_string('restoredcourseid', 'backup', $courseid)); exit(0);
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | ���֧ߧ֧�ѧ�ڧ� ����ѧߧڧ��: 0 |
proxy
|
phpinfo
|
���ѧ����ۧܧ�