From 079736ccb33a04687ed524c96e6883382adcf1e3 Mon Sep 17 00:00:00 2001 From: cescobedo Date: Thu, 13 Feb 2020 16:29:47 +0100 Subject: [PATCH] MDL-63580 core_task: Deprecation CLI scripts from admin/tool/task/cli Copy the CLI scripts from admin/tool/task/cli to admin/cli (schedule_task.php and adhoc_task.php) and rename to scheduled_task.php and to improve in order to use cron_run_inner_scheduled_task. --- admin/cli/adhoc_task.php | 122 +++++++++++++++++++++ admin/cli/scheduled_task.php | 151 ++++++++++++++++++++++++++ admin/tool/task/cli/adhoc_task.php | 5 + admin/tool/task/cli/schedule_task.php | 6 + lib/upgrade.txt | 7 ++ 5 files changed, 291 insertions(+) create mode 100644 admin/cli/adhoc_task.php create mode 100644 admin/cli/scheduled_task.php diff --git a/admin/cli/adhoc_task.php b/admin/cli/adhoc_task.php new file mode 100644 index 00000000000..b0ed21d3768 --- /dev/null +++ b/admin/cli/adhoc_task.php @@ -0,0 +1,122 @@ +. + +/** + * Task executor for adhoc tasks. + * + * @package core + * @subpackage cli + * @copyright 2018 Andrew Nicols + * @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, + ], [ + 'h' => 'help', + 'e' => 'execute', + 'k' => 'keep-alive', + 'i' => 'ignorelimits', + ] +); + +if ($unrecognized) { + $unrecognized = implode("\n ", $unrecognized); + cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); +} + +if ($options['help'] or empty($options['execute'])) { + $help = <<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 (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); diff --git a/admin/cli/scheduled_task.php b/admin/cli/scheduled_task.php new file mode 100644 index 00000000000..f825f46da35 --- /dev/null +++ b/admin/cli/scheduled_task.php @@ -0,0 +1,151 @@ +. + +/** + * 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( + array('help' => false, 'list' => false, 'execute' => false, 'showsql' => false, 'showdebugging' => false), + array('h' => 'help') +); + +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 + + 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']) { + set_debugging(DEBUG_DEVELOPER, true); +} + +if ($options['showsql']) { + $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); + } + + // 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); +} diff --git a/admin/tool/task/cli/adhoc_task.php b/admin/tool/task/cli/adhoc_task.php index 1a04ba8bfdf..07cded8889a 100644 --- a/admin/tool/task/cli/adhoc_task.php +++ b/admin/tool/task/cli/adhoc_task.php @@ -17,6 +17,9 @@ /** * Task executor for adhoc tasks. * + * @deprecated since Moodle 3.9 MDL-63580. Please use the admin/cli/adhoc_task.php. + * @todo final deprecation. To be removed in Moodle 4.3 MDL-63594. + * * @package tool_task * @copyright 2018 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later @@ -44,6 +47,8 @@ list($options, $unrecognized) = cli_get_params( ] ); +debugging('admin/tool/task/cli/adhoc_task.php is deprecated. Please use admin/cli/adhoc_task.php instead.', DEBUG_DEVELOPER); + if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); diff --git a/admin/tool/task/cli/schedule_task.php b/admin/tool/task/cli/schedule_task.php index 85d7a4fd6ce..073075e99fc 100644 --- a/admin/tool/task/cli/schedule_task.php +++ b/admin/tool/task/cli/schedule_task.php @@ -17,6 +17,9 @@ /** * CLI task execution. * + * @deprecated since Moodle 3.9 MDL-63580. Please use the admin/cli/schedule_task.php. + * @todo final deprecation. To be removed in Moodle 4.3 MDL-63594. + * * @package tool_task * @copyright 2014 Petr Skoda * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later @@ -33,6 +36,8 @@ list($options, $unrecognized) = cli_get_params( array('h' => 'help') ); +debugging('admin/tool/task/cli/schedule_task.php is deprecated. Please use admin/cli/scheduled_task.php instead.', DEBUG_DEVELOPER); + if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); @@ -65,6 +70,7 @@ if ($options['showdebugging']) { if ($options['showsql']) { $DB->set_debug(true); } + if ($options['list']) { cli_heading("List of scheduled tasks ($CFG->wwwroot)"); diff --git a/lib/upgrade.txt b/lib/upgrade.txt index d8ab4bc5ba5..68379ea327a 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -2,6 +2,13 @@ This files describes API changes in core libraries and APIs, information provided here is intended especially for developers. === 3.9 === +* Following function has been deprecated, please use \core\task\manager::run_from_cli(). + - cron_run_single_task() +* Following class has been deprecated, please use \core\task\manager. + - \tool_task\run_from_cli +* Following CLI scripts has been deprecated: + - admin/tool/task/cli/schedule_task.php please use admin/cli/scheduled_task.php + - admin/tool/task/cli/adhoc_task.php please use admin/cli/adhoc_task.php * Old Safe Exam Browser quiz access rule (quizaccess_safebrowser) replaced by new Safe Exam Browser access rule (quizaccess_seb). Experimental setting enablesafebrowserintegration was deleted. * New CFPropertyList library has been added to Moodle core in /lib/plist.