/** * @covers Cron\CronExpression::isDue */ public function testIsDueHandlesDifferentDates() { $cron = new CronExpression('* * * * *'); $this->assertTrue($cron->isDue()); $this->assertTrue($cron->isDue('now')); $this->assertTrue($cron->isDue(new \DateTime('now'))); $this->assertTrue($cron->isDue(date('Y-m-d H:i'))); }
/** * Check if the job is due to run * * @return bool */ public function isDue() { if ($this->lastExecutionFile && is_readable($this->lastExecutionFile)) { $lastExecution = file_get_contents($this->lastExecutionFile); $lastRunDate = $this->execution->getPreviousRunDate('now', 0, true); $nextRunDate = $this->execution->getNextRunDate(); echo (is_string($this->command) ? $this->command : '[function]') . ': ' . $lastExecution . ' | ' . $lastRunDate->getTimestamp() . ' | ' . $nextRunDate->getTimestamp() . "\n"; return $lastRunDate->getTimestamp() > $lastExecution && $this->truthTest === true; } return $this->execution->isDue() && $this->truthTest === true; }
/** * @param InputInterface $input * @param OutputInterface $output * @return int */ protected function execute(InputInterface $input, OutputInterface $output) { $this->logPath = $input->getOption('log'); $cronInfoUrl = sprintf('http://%s:%d/info/cron/', $input->getOption('host'), $input->getOption('port')); $response = json_decode($this->curlRequest->getCurlResult($cronInfoUrl, [CURLOPT_TIMEOUT_MS => 100000])['body'], true); if (!is_array($response)) { $this->log('Core connection failed, exiting'); throw new \RuntimeException('Error connecting to core server'); } foreach ($response as $cronItem) { $this->cronExpression->setExpression(Ar::get($cronItem, 'time')); if ($this->cronExpression->isDue()) { $this->log('Executing: ' . Ar::get($cronItem, 'type')); switch (Ar::get($cronItem, 'type')) { case 'playbook': $url = sprintf('http://%s:%d/playbook/run/', $input->getOption('host'), $input->getOption('port')); $playbookFile = Ar::get($cronItem, 'playbook'); $playbook = $this->fileLoader->load($playbookFile); $this->curlRequest->getCurlResult($url, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => ['playbook' => urlencode($playbook), 'filename' => $playbookFile], CURLOPT_TIMEOUT_MS => 100000]); $this->log('Executed playbook: ' . $playbookFile); break; case 'command': $url = sprintf('http://%s:%d/command/run/', $input->getOption('host'), $input->getOption('port')); $command = Ar::get($cronItem, 'command'); if (null === $command) { break; } $this->curlRequest->getCurlResult($url, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => ['command' => urlencode($command)], CURLOPT_TIMEOUT_MS => 100000]); $this->log('Executed command: ' . $command); break; case 'curl': break; } } } }
/** * Determine if a task should be run * * @param CronTask $task * @param CronExpression $cron */ public function isTaskDue(CronTask $task, CronExpression $cron) { // Get last run status $status = CronTaskStatus::get_status(get_class($task)); // If the cron is due immediately, then run it $now = new DateTime(SS_Datetime::now()->getValue()); if ($cron->isDue($now)) { if (empty($status->LastRun)) { return true; } // In case this process is invoked twice in one minute, supress subsequent executions $lastRun = new DateTime($status->LastRun); return $lastRun->format('Y-m-d H:i') != $now->format('Y-m-d H:i'); } // If this is the first time this task is ever checked, no way to detect postponed execution if (empty($status->LastChecked)) { return false; } // Determine if we have passed the last expected run time $nextExpectedDate = $cron->getNextRunDate($status->LastChecked); return $nextExpectedDate <= $now; }
/** * Check if the job is due to run * * @return bool */ public function isDue() { return $this->execution->isDue() && $this->truthTest === true; }