| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 | <?php/** * @file * Drush commands for Ultimate Cron! *//** * Implements hook_drush_command(). */function ultimate_cron_drush_command() {  $items = array();  $items['cron-list'] = array(    'description' => "List cron jobs.",    'arguments' => array(      'type' => 'The type of jobs to list (all, running, enabled, disabled, unsafe)',    ),    'options' => array(      'module' => 'Only show jobs from comma separated list of modules',    ),    'examples' => array(      'drush cron-list running',    ),    'aliases' => array('cl'),  );  $items['cron-run'] = array(    'description' => "Run cron job.",    'arguments' => array(      'function' => 'Function to run',    ),    'options' => array(      'cli' => "Don't spawn a background process through http",      'check-rule' => "Check rule to determine if job should run",      'logfile' => "File to log to when spawning cli processes"    ),    'examples' => array(      'drush cron-run node_cron',    ),    'aliases' => array('cr'),  );  $items['cron-enable'] = array(    'description' => "Enable cron job.",    'arguments' => array(      'function' => 'Function to enable',    ),    'examples' => array(      'drush cron-enable node_cron',    ),    'aliases' => array('ce'),  );  $items['cron-disable'] = array(    'description' => "Disable cron job.",    'arguments' => array(      'function' => 'Function to disable',    ),    'examples' => array(      'drush cron-disable node_cron',    ),    'aliases' => array('cd'),  );  $items['cron-unlock'] = array(    'description' => "Unlock cron job.",    'arguments' => array(      'function' => 'Function to unlock',    ),    'examples' => array(      'drush cron-unlock node_cron',    ),    'aliases' => array('cu'),  );  return $items;}/** * Implements hook_drush_help(). */function ultimate_cron_drush_help($section) {  switch ($section) {    case 'drush:cron-list':      return dt("This command will list cron jobs.");    case 'drush:cron-run':      return dt("This command will run a cron job.");    case 'drush:cron-enable':      return dt("This command will enable a cron job.");    case 'drush:cron-disable':      return dt("This command will disable a cron job.");    case 'drush:cron-unlock':      return dt("This command will unlock a cron job.");  }}/** * List cron jobs. */function drush_ultimate_cron_cron_list($type = 'all') {  $module = drush_get_option('module');  $module = $module ? explode(",", $module) : array();  // Get hooks and their data  $hooks = ultimate_cron_get_hooks();  $data = _ultimate_cron_preload_cron_data();  $jobs = array();  $modules = array();  foreach ($hooks as $function => $hook) {    if (!$module || $module == $hook['module']) {      $modules[$hook['module']][$function] = $hook;    }  }  foreach ($hooks as $function => &$hook) {    if ($module && !in_array($hook['module'], $module)) {      continue;    }    $hook['settings'] = $data[$function]['settings'] + $hook['settings'];    $hook['background_process'] = $data[$function]['background_process'];    $hook['log'] = ultimate_cron_get_log($function);    switch ($type) {      case 'enabled':        if (!empty($hook['settings']['enabled'])) {          $jobs[] = $hook;        }        break;      case 'disabled':        if (empty($hook['settings']['enabled'])) {          $jobs[] = $hook;        }        break;      case 'running':        if (!empty($data[$hook['function']]['background_process'])) {          $jobs[] = $hook;        }        break;      case 'unsafe':        if (!empty($hook['unsafe'])) {          $jobs[] = $hook;        }        break;      case 'failed':        if (isset($hook['log']['status']) && empty($hook['log']['status'])) {          $jobs[] = $hook;        }        break;      case 'all':      default:        $jobs[] = $hook;    }  }  $table = array();  $table[] = array('', dt('Module'), dt('Function'), dt('Rules'), dt('Start'), dt('Duration'));  foreach ($jobs as $hook) {    $legend = '';    if (!empty($hook['background_process'])) {      $legend .= 'R';      $hook['log']['start'] = $hook['background_process']->start;      $hook['log']['end'] = microtime(TRUE);    }    if (empty($hook['settings']['enabled'])) $legend .= 'D';    $start = isset($hook['log']['start']) ? format_date((int)$hook['log']['start'], 'custom', 'Y-m-d H:i:s') : dt('N/A');    $end = isset($hook['log']['end']) ? gmdate('H:i:s', (int)($hook['log']['end'] - $hook['log']['start'])) : dt('N/A');    $rules = $hook['settings']['rules'];    $table[] = array($legend, $hook['module'], $hook['function'], implode("\n", $rules), $start, $end);  }  drush_print_table($table);}/** * Run cron job(s) */function drush_ultimate_cron_cron_run($function = NULL) {  $cli = drush_get_option('cli');  $check_rule = drush_get_option('check-rule');  $logfile = drush_get_option('logfile');  $logfile = is_string($logfile) ? $logfile : '/dev/null';  // Get global options  $options = drush_get_context('cli');  $cmd_options = '';  // Determine new parameter string for sub-requests  $passthru = array('root', 'php', 'uri', 'simulate');  foreach ($options as $key => $option) {    if (in_array($key, $passthru)) {      $cmd_options .= ' --' . $key . '=' . escapeshellarg($option);    }  }  if ($function == 'all') {    if ($cli) {      $hooks = ultimate_cron_get_hooks();      $schedule = ultimate_cron_get_schedule($hooks);      foreach ($schedule as $function => $hook) {        if (!empty($options['simulate'])) {          // Dry-run ...          drush_print(dt('[!function]: Simulated launch @ !ts', array('!ts' => date('Y-m-d H:i:s'), '!function' => $function)));          continue;        }        drush_print(dt('[!function]: Launching @ !ts', array('!ts' => date('Y-m-d H:i:s'), '!function' => $function)));        // Launch the sub-request        $cmd = $_SERVER['SCRIPT_FILENAME'] . " $cmd_options cron-run $function --cli " . ($check_rule ? '--check-rule' : '');        exec("$cmd >> " . escapeshellarg($logfile) . " 2>&1 &");      }      drush_print(dt('[!ts] Launced !jobs jobs', array('!ts' => date('Y-m-d H:i:s'), '!jobs' => count($schedule))));      // Update drupals cron timestamp, but don't clear the cache for all variables!      if (empty($options['simulate'])) {        $name = 'cron_last';        $value = time();        global $conf;        db_merge('variable')->key(array('name' => $name))->fields(array('value' => serialize($value)))->execute();        $conf[$name] = $value;      }      return;    }    else {      if (empty($options['simulate'])) {        ultimate_cron_cron_run(TRUE);      }      $messages = drupal_get_messages();      if (!empty($messages['status'])) {        foreach ($messages['status'] as $message) {          drush_print(strip_tags($message));        }      }      return;    }  }  $hooks = ultimate_cron_get_hooks();  if (!isset($hooks[$function])) {    return drush_set_error(dt('[!function]: not found', array('!function' => $function)));  }  $hook = &$hooks[$function];  // When run manually don't double check the rules  if (drush_get_option('check-rule')) {    $hook['log'] = ultimate_cron_get_log($function);    if (!ultimate_cron_hook_should_run($hook)) {      drush_print(dt("[!function]: not sceduled to run at this time", array('!function' => $function)));      return;    }  }  else {    $hook['skip_catch_up'] = TRUE;  }  if (!empty($options['simulate'])) {    // Dry-run ...    drush_print("[$function]: Simulated run");    return;  }  if (!empty($options['simulate'])) {    // Dry-run ...    drush_print("[$function]: Simulated run");    return;  }  if ($cli) {    $start = microtime(TRUE);    $result = ultimate_cron_run_hook_cli($function, $hook);  }  else {    $result = ultimate_cron_run_hook($function, $hook);  }  if ($result === FALSE) {    return drush_set_error(dt('[!function]: could not start (already running?)', array('!function' => $function)));  }  if ($cli) {    $log = ultimate_cron_get_log($function);    if ($log['start'] >= $start && !empty($log['msg'])) {      drush_print("[$function]: " . $log['msg']);    }    return $result ? NULL : drush_set_error(dt('[!function]: could not start (service unavailable)', array('!function' => $function)));  }  if ($result === NULL) {    return drush_set_error(dt('[!function]: could not start (service unavailable)', array('!function' => $function)));  }  else {    drush_print(dt('!function started', array('!function' => $function)));  }}/** * Enable a cron job */function drush_ultimate_cron_cron_enable($function) {  $hooks = ultimate_cron_get_hooks();  if (!isset($hooks[$function])) {    return drush_set_error(dt('"!function" not found', array('!function' => $function)));  }  $conf = ultimate_cron_get_settings($function);  $conf['enabled'] = TRUE;  ultimate_cron_set_settings($function, $conf);  drush_print(dt('!function enabled', array('!function' => $function)));}/** * Disable a cron job */function drush_ultimate_cron_cron_disable($function) {  $hooks = ultimate_cron_get_hooks();  if (!isset($hooks[$function])) {    return drush_set_error(dt('"!function" not found', array('!function' => $function)));  }  $conf = ultimate_cron_get_settings($function);  $conf['enabled'] = FALSE;  ultimate_cron_set_settings($function, $conf);  drush_print(dt('!function disabled', array('!function' => $function)));}/** * Unlock a cron job */function drush_ultimate_cron_cron_unlock($function) {  $hooks = ultimate_cron_get_hooks();  if (!isset($hooks[$function])) {    return drush_set_error(dt('"!function" not found', array('!function' => $function)));  }  $handle_prefix = variable_get('ultimate_cron_handle_prefix', ULTIMATE_CRON_HANDLE_PREFIX);  $handle = $handle_prefix . $function;  if ($process = background_process_get_process($handle)) {    // Unlock the process    if (background_process_remove_process($process->handle, $process->start)) {      drush_print(dt('Process for !function unlocked (process handle: !handle)', array('!handle' => $handle, '!function' => $function)));      module_invoke_all('background_process_shutdown', $process, FALSE, t('Manually unlocked'));    }  }  else {    drush_set_error(dt('Process for !function not found (process handle: !handle)', array('!handle' => $handle, '!function' => $function)));  }}
 |