141 lines
4.0 KiB
PHP
141 lines
4.0 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file classes/cliTool/ScheduledTaskTool.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class ScheduledTaskTool
|
|
*
|
|
* @ingroup tools
|
|
*
|
|
* @brief CLI tool to execute a set of scheduled tasks.
|
|
*/
|
|
|
|
namespace PKP\cliTool;
|
|
|
|
use PKP\db\DAORegistry;
|
|
use PKP\config\Config;
|
|
use PKP\scheduledTask\ScheduledTaskDAO;
|
|
use PKP\scheduledTask\ScheduledTaskHelper;
|
|
use PKP\xml\PKPXMLParser;
|
|
|
|
/** Default XML tasks file to parse if none is specified */
|
|
define('TASKS_REGISTRY_FILE', 'registry/scheduledTasks.xml');
|
|
|
|
class ScheduledTaskTool extends \PKP\cliTool\CommandLineTool
|
|
{
|
|
/** @var string the XML file listing the tasks to be executed */
|
|
public $file;
|
|
|
|
/** @var ScheduledTaskDAO the DAO object */
|
|
public $taskDao;
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param array $argv command-line arguments
|
|
* If specified, the first parameter should be the path to
|
|
* a tasks XML descriptor file (other than the default)
|
|
*/
|
|
public function __construct($argv = [])
|
|
{
|
|
parent::__construct($argv);
|
|
|
|
if (isset($this->argv[0])) {
|
|
$this->file = $this->argv[0];
|
|
} else {
|
|
$this->file = TASKS_REGISTRY_FILE;
|
|
}
|
|
|
|
if (!file_exists($this->file) || !is_readable($this->file)) {
|
|
printf("Tasks file \"%s\" does not exist or is not readable!\n", $this->file);
|
|
exit(1);
|
|
}
|
|
|
|
$this->taskDao = DAORegistry::getDAO('ScheduledTaskDAO');
|
|
}
|
|
|
|
/**
|
|
* Print command usage information.
|
|
*/
|
|
public function usage()
|
|
{
|
|
echo "Script to run a set of scheduled tasks\n"
|
|
. "Usage: {$this->scriptName} [tasks_file]\n";
|
|
}
|
|
|
|
/**
|
|
* Parse and execute the scheduled tasks.
|
|
*/
|
|
public function execute()
|
|
{
|
|
// Application is set to sandbox mode and will not run any schedule tasks
|
|
if (Config::getVar('general', 'sandbox', false)) {
|
|
error_log('Application is set to sandbox mode and will not run any schedule tasks');
|
|
return;
|
|
}
|
|
|
|
$this->parseTasks($this->file);
|
|
}
|
|
|
|
/**
|
|
* Parse and execute the scheduled tasks in the specified file.
|
|
*
|
|
* @param string $file
|
|
*/
|
|
public function parseTasks($file)
|
|
{
|
|
$xmlParser = new PKPXMLParser();
|
|
$tree = $xmlParser->parse($file);
|
|
|
|
if (!$tree) {
|
|
printf("Unable to parse file \"%s\"!\n", $file);
|
|
exit(1);
|
|
}
|
|
|
|
foreach ($tree->getChildren() as $task) {
|
|
$className = $task->getAttribute('class');
|
|
|
|
$frequency = $task->getChildByName('frequency');
|
|
if (isset($frequency)) {
|
|
$canExecute = ScheduledTaskHelper::checkFrequency($className, $frequency);
|
|
} else {
|
|
// Always execute if no frequency is specified
|
|
$canExecute = true;
|
|
}
|
|
|
|
if ($canExecute) {
|
|
$this->executeTask($className, ScheduledTaskHelper::getTaskArgs($task));
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Execute the specified task.
|
|
*
|
|
* @param string $className the class name to execute
|
|
* @param array $args the array of arguments to pass to the class constructors
|
|
*/
|
|
public function executeTask($className, $args)
|
|
{
|
|
// Load and execute the task
|
|
if (preg_match('/^[a-zA-Z0-9_.]+$/', $className)) {
|
|
// DEPRECATED as of 3.4.0: Use old class.name.style and import() function (pre-PSR classloading) pkp/pkp-lib#8186
|
|
if (!is_object($task = instantiate($className, null, null, 'execute', $args))) {
|
|
fatalError('Cannot instantiate task class.');
|
|
}
|
|
} else {
|
|
$task = new $className($args);
|
|
}
|
|
$this->taskDao->updateLastRunTime($className);
|
|
$task->execute();
|
|
}
|
|
}
|
|
|
|
if (!PKP_STRICT_MODE) {
|
|
class_alias('\PKP\cliTool\ScheduledTaskTool', '\ScheduledTaskTool');
|
|
}
|