directoryIndexCommand = $this->getDirectoryIndexCommand(); $this->processor = Singleton::class('ZN\Prompt\Processor'); if( PROJECT_TYPE === 'EIP' ) { $this->crontabCommands = EXTERNAL_DIR . $this->fileName; $this->user = DEFINED_CURRENT_PROJECT; $this->getProjectCommand($this->projectCommand = $this->directoryIndexCommand); } else { $this->crontabCommands = FILES_DIR . $this->fileName; // @codeCoverageIgnore } $this->createCrontabDirectoryIfNotExists(); $this->path = $getConfig['path']; $this->crontabDir = Filesystem\Info::originpath(STORAGE_DIR.'Crontab'.DS); } /** * Send parameters * * @param mixed ...$arguments */ public function parameters(...$parameters) { $this->parameters = $parameters; return $this; } /** * Get crontab commands. */ public function getCrontabCommands() { return $this->crontabCommands; } /** * Crontab Queue * * @param callable $callable * @param int $decrement = 1 */ public function queue(callable $callable, int $decrement = 1) { new Queue($callable, $decrement, $this); } /** * Crontab limit * * @param int $getLimit = 1 */ public function limit(int $getLimit = 1) { new Limit($getLimit, $this); } /** * Selects project * * @param string $name * * @return Job */ public function project(string $name) { $this->user = $name; $this->crontabDir = str_replace(REQUESTED_CURRENT_PROJECT, $this->user, $this->crontabDir); $this->getProjectCommand($this->projectCommand); return $this; } /** * Select Processor Driver * * @param string $driver * * @return Job */ public function driver(string $driver) : Job { $this->processor->driver($driver); return $this; } /** * Gets crontab list array * * @return array */ public function listArray() : array { if( ! is_file($this->crontabCommands) ) { return []; } return Arrays\RemoveElement::element(explode(EOL, file_get_contents($this->crontabCommands)), ''); } /** * Gets crontab list * * @return string */ public function list() : string { $list = ''; if( is_file($this->crontabCommands) ) { $jobs = $this->listArray(); $list = '
';
$list .= '[ID] CRON JOB
';
foreach( $jobs as $key => $job )
{
$list .= '[' . $key . ']: '. $job . '
';
}
$list .= '';
}
return $list;
}
/**
* Last job
*
* @return string
*/
public function lastJob()
{
return $this->processor->exec('crontab -l');
}
/**
* Remove cron job
*
* @param string $key = NULL
*/
public function remove($key = NULL)
{
$this->executeRemoveCommand();
if( $key === NULL )
{
unlink($this->crontabCommands);
}
else
{
if( is_numeric($key) )
{
$this->removeJobFromExecFile($key);
}
else
{
$this->removeJobFromExecFileWithTerm($key);
}
$this->executeCommand();
}
}
/**
* Debug status
*
* @param bool $status = true
*
* @return Job
*/
public function debug(bool $status = true) : Job
{
$this->debug = $status;
return $this;
}
/**
* Cron Controller
*
* @param string $file
*/
public function controller(string $file)
{
new ControllerCommand($file, $command);
$code = Base::prefix(Base::suffix($command, ';\''), ' -r \'' . $this->directoryIndexCommand);
return $this->run($code);
}
/**
* Cron wget
*
* @param string $url
*/
public function wget(string $url)
{
$this->path('wget');
return $this->run($url);
}
/**
* Cron Command
*
* @param string $file
* @param string $type = 'Project' - options[Project|External]
*/
public function command(string $file, $type = 'Project')
{
$path = $this->convertFileName($file);
$pathEx = explode('-', $path);
$command = $pathEx[0];
$method = $pathEx[1] ?? Config::get('Routing', 'openFunction') ?: 'main';
$code = ' -r \'' . $this->directoryIndexCommand . '(new \\'.$type.'\Commands\\'.$command.')->'.$method.'(' . Parameters::convert($this->parameters) . ');\'';
$this->parameters = [];
return $this->run($code);
}
/**
* Script [6.8.0]
*
* @param string $cmd
*
* @return int
*/
public function script(string $cmd)
{
return $this->path('')->run($cmd);
}
/**
* Path
*
* @param string $path = NULL
*
* @return Job
*/
public function path(?string $path = NULL)
{
$this->path = $path;
return $this;
}
/**
* Run Cron
*
* @param string $cmd = NULL
*
* @return int
*/
public function run(?string $cmd = NULL)
{
$this->createExecFileIfNotExists();
$this->addJobToExecFile($cmd);
return $this->executeCommand();
}
/**
* Get string query
*
* @return string
*/
public function stringQuery()
{
return $this->stringQuery;
}
/**
* Protected create crontab directory if not exists
*/
protected function createCrontabDirectoryIfNotExists()
{
if( ! is_dir($crontabDirectory = pathinfo($this->crontabCommands, PATHINFO_DIRNAME)) )
{
Filesystem::createFolder($crontabDirectory); // @codeCoverageIgnore
}
}
/**
* Protected execute command
*/
protected function executeCommand()
{
$this->defaultCommandVariables();
return $this->processor->exec('crontab ' . $this->crontabCommands);
}
/**
* Protected execute remove command
*/
protected function executeRemoveCommand()
{
$this->processor->exec('crontab -r');
}
/**
* Protected create exec file if not exists
*/
protected function createExecFileIfNotExists()
{
if( ! is_file($this->crontabCommands) )
{
Filesystem\Forge::create($this->crontabCommands);
$this->processor->exec('chmod 0777 ' . $this->crontabCommands);
}
}
/**
* Protected add job to exec file
*/
protected function addJobToExecFile($cmd)
{
$this->stringQuery = $cmd;
$content = file_get_contents($this->crontabCommands);
if( ! stristr($content, $cmd))
{
$this->stringQuery = $stringQuery = $this->getValidCommand() . $cmd;
$content = $content . $stringQuery . EOL;
file_put_contents($this->crontabCommands, $content);
}
}
/**
* Protected remove job from exec file
*/
protected function removeJobFromExecFile($cmd)
{
$jobs = $this->listArray();
unset($jobs[$cmd]);
$this->writeCrontabCommands($jobs);
}
/**
* Get job id from exec file with term
*/
public function getJobIdFromExecFileWithTerm($class, $method)
{
$jobs = [];
foreach( $this->listArray() as $key => $job )
{
if( stristr($job, $class . ')') && stristr($job, $method . '(') )
{
return $key;
}
}
return false; // @codeCoverageIgnore
}
/**
* Protected remove job from exec file with term
*/
protected function removeJobFromExecFileWithTerm($cmd)
{
$jobs = [];
foreach( $this->listArray() as $key => $job )
{
if( ! stristr($job, $cmd) )
{
$jobs[$key] = $job; // @codeCoverageIgnore
}
}
$this->writeCrontabCommands($jobs);
}
/**
* Protected write crontab commands
*/
protected function writeCrontabCommands($jobs)
{
file_put_contents($this->crontabCommands, implode(EOL, $jobs) . ($jobs ? EOL : NULL));
}
/**
* Protected Zerocore
*/
protected function getDirectoryIndexCommand()
{
return 'define("CONSOLE_ENABLED", true); require "'.DIRECTORY_INDEX.'"; ';
}
/**
* Protected get project command
*/
protected function getProjectCommand($value)
{
$this->directoryIndexCommand = 'chdir("'.REAL_BASE_DIR.'"); define("CONSOLE_PROJECT_NAME", "'.$this->user.'"); ' . $value;
}
/**
* Protected convert file name
*/
protected function convertFileName($file)
{
return str_replace(['/', ':'], '-', $file);
}
/**
* Protected datet time format
*/
protected function getDatetimeFormat()
{
if( $this->interval !== '* * * * *' )
{
$interval = $this->interval.' ';
}
else
{
$interval = ( $this->minute ?? '*' ) . ' '.
( $this->hour ?? '*' ) . ' '.
( $this->dayNumber ?? '*' ) . ' '.
( $this->month ?? '*' ) . ' '.
( $this->day ?? '*' ) . ' ';
}
$this->defaultIntervalVariables();
return $interval;
}
/**
* Protected Command
*/
protected function getValidCommand()
{
$datetimeFormat = $this->getDatetimeFormat();
$type = $this->type;
$path = $this->path;
$command = $this->command;
$debug = $this->debug;
$pattern = str_repeat('(\*|[0-9]{1,2}|\*\/[0-9]{1,2}|[0-9]{1,2}\s*\-\s*[0-9]{1,2}|(([0-9]{1,2})*\s*\,\s*[0-9]{1,2})+)\s+', 5);
if( ! preg_match('/^' . $pattern . '$/', $datetimeFormat) )
{
throw new InvalidTimeFormatException('Services', 'crontab:timeFormatError');
}
else
{
return $datetimeFormat.
( ! empty($path) ? $path . ' ' : '' ).
( ! empty($command) ? $command . ' ' : '' ).
( ! empty($type) ? $type . ' ' : '' ).
( $debug === true ? '>> ' . $this->crontabDir . 'debug.log 2>&1' : '' );
}
}
/**
* Protected defaul command variables
*/
protected function defaultCommandVariables()
{
$this->type = NULL;
$this->path = NULL;
$this->command = NULL;
$this->debug = false;
}
/**
* Protected default interval variables
*/
protected function defaultIntervalVariables()
{
$this->interval = '* * * * *';
$this->minute = '*';
$this->hour = '*';
$this->dayNumber = '*';
$this->month = '*';
$this->day = '*';
}
}