Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
5 / 5
CRAP
100.00% covered (success)
100.00%
33 / 33
run
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
5 / 5
13
100.00% covered (success)
100.00%
33 / 33
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 configure
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
5 / 5
 execute
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
8 / 8
 run_all
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
9 / 9
 run_one
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
7 / 7
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\console\command\cron;
use phpbb\exception\runtime_exception;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface;
class run extends \phpbb\console\command\command
{
    /** @var \phpbb\cron\manager */
    protected $cron_manager;
    /** @var \phpbb\lock\db */
    protected $lock_db;
    /**
    * Construct method
    *
    * @param \phpbb\user $user The user object (used to get language information)
    * @param \phpbb\cron\manager $cron_manager The cron manager containing
    *        the cron tasks to be executed.
    * @param \phpbb\lock\db $lock_db The lock for accessing database.
    */
    public function __construct(\phpbb\user $user, \phpbb\cron\manager $cron_manager, \phpbb\lock\db $lock_db)
    {
        $this->cron_manager = $cron_manager;
        $this->lock_db = $lock_db;
        parent::__construct($user);
    }
    /**
    * Sets the command name and description
    *
    * @return null
    */
    protected function configure()
    {
        $this
            ->setName('cron:run')
            ->setDescription($this->user->lang('CLI_DESCRIPTION_CRON_RUN'))
            ->setHelp($this->user->lang('CLI_HELP_CRON_RUN'))
            ->addArgument('name', InputArgument::OPTIONAL, $this->user->lang('CLI_DESCRIPTION_CRON_RUN_ARGUMENT_1'))
        ;
    }
    /**
    * Executes the command cron:run.
    *
    * Tries to acquire the cron lock, then if no argument has been given runs all ready cron tasks.
    * If the cron lock can not be obtained, an error message is printed
    *        and the exit status is set to 1.
    * If the verbose option is specified, each start of a task is printed.
    *        Otherwise there is no output.
    * If an argument is given to the command, only the task whose name matches the
    *        argument will be started. If verbose option is specified,
    *        an info message containing the name of the task is printed.
    * If no task matches the argument given, an error message is printed
    *        and the exit status is set to 2.
    *
    * @param InputInterface $input The input stream used to get the argument and verboe option.
    * @param OutputInterface $output The output stream, used for printing verbose-mode and error information.
    *
    * @return int 0 if all is ok, 1 if a lock error occurred and 2 if no task matching the argument was found.
    */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if ($this->lock_db->acquire())
        {
            $task_name = $input->getArgument('name');
            if ($task_name)
            {
                $exit_status = $this->run_one($input, $output, $task_name);
            }
            else
            {
                $exit_status = $this->run_all($input, $output);
            }
            $this->lock_db->release();
            return $exit_status;
        }
        else
        {
            throw new runtime_exception('CRON_LOCK_ERROR', array(), null, 1);
        }
    }
    /**
    * Executes all ready cron tasks.
    *
    * If verbose mode is set, an info message will be printed if there is no task to
    *        be run, or else for each starting task.
    *
    * @see execute
    * @param InputInterface $input The input stream used to get the argument and verbose option.
    * @param OutputInterface $output The output stream, used for printing verbose-mode and error information.
    * @return int 0
    */
    protected function run_all(InputInterface $input, OutputInterface $output)
    {
        $run_tasks = $this->cron_manager->find_all_ready_tasks();
        if ($run_tasks)
        {
            foreach ($run_tasks as $task)
            {
                if ($input->getOption('verbose'))
                {
                    $output->writeln('<info>' . $this->user->lang('RUNNING_TASK', $task->get_name()) . '</info>');
                }
                $task->run();
            }
        }
        else
        {
            if ($input->getOption('verbose'))
            {
                $output->writeln('<info>' . $this->user->lang('CRON_NO_TASK') . '</info>');
            }
        }
        return 0;
    }
    /**
    * Executes a given cron task, if it is ready.
    *
    * If there is a task whose name matches $task_name, it is run and 0 is returned.
    *        and if verbose mode is set, print an info message with the name of the task.
    * If there is no task matching $task_name, the function prints an error message
    *        and returns with status 2.
    *
    * @see execute
    *
    * @param InputInterface $input The input stream used to get the argument and verbose option.
    * @param OutputInterface $output The output stream, used for printing verbose-mode and error information.
    * @param string $task_name The name of the task that should be run.
    *
    * @return int 0 if all is well, 2 if no task matches $task_name.
    */
    protected function run_one(InputInterface $input, OutputInterface $output, $task_name)
    {
        $task = $this->cron_manager->find_task($task_name);
        if ($task)
        {
            if ($input->getOption('verbose'))
            {
                $output->writeln('<info>' . $this->user->lang('RUNNING_TASK', $task_name) . '</info>');
            }
            $task->run();
            return 0;
        }
        else
        {
            throw new runtime_exception('CRON_NO_SUCH_TASK', array( $task_name), null, 2);
        }
    }
}