#!/usr/bin/php $usergroups_lastsync) { cron_reload_nscd(); cron_reload_apache(); $hook_params = array(); plugin_hook("usergroups_sync", $hook_params); $usergroups_lastsync = time(); } } function systask_get_script($plugin_id, $systask_type) { global $cron_arr; if ($plugin_id == null) { if (isset($cron_arr[$systask_type])) return forge_get_config('source_path') .'/cronjobs/'.$cron_arr[$systask_type]; } else { global $pm; $plugins = $pm->GetPlugins(); // reload in case a new plugin was installed if (isset($plugins[$plugin_id])) { $plugin = $pm->GetPluginObject($plugins[$plugin_id]); if ($plugin == null) { $pm->LoadPlugin($plugins[$plugin_id]); $plugin = $pm->GetPluginObject($plugins[$plugin_id]); } if (isset($plugin->systask_types[$systask_type])) return forge_get_config('plugins_path')."/".$plugin->GetName() ."/cronjobs/".$plugin->systask_types[$systask_type]; } } return null; } $shortopts = 'v'; // enable verbose mode $longopts = array('verbose'); $options = getopt($shortopts, $longopts); if (count($options) != (count($argv)-1)) { // PHP just strips invalid options print "Usage: {$argv[0]} [-v|--verbose]\n"; exit(1); } $verbose = false; if (isset($options['v']) or isset($options['verbose'])) { print "verbose mode ON\n"; $verbose = true; } // Proper daemon posix_setsid(); chdir('/'); umask(0); if (!$verbose) { // Hack to reopen stdin/stdout/stderr, order is important // https://andytson.com/blog/2010/05/daemonising-a-php-cli-script-on-a-posix-system/ // (prevents PHP from exiting when printing anything) fclose(STDIN); fclose(STDOUT); fclose(STDERR); $ff_stdin = fopen('/dev/null', 'r'); $ff_stdout = fopen('/dev/null', 'w'); $ff_stderr = fopen('php://stdout', 'w'); } // We could fork & continue in the background too, but then we'd have // to manage the PID file as well - best leave this to the init script $pm = plugin_manager_get_object(); usergroups_sync(); while (true) { // Deal with pending requests $res = db_query_params("SELECT * FROM systasks WHERE status=$1" . " ORDER BY systask_id", array('TODO')); if (!$res && !db_connection_status()) db_reconnect(); while ($arr = db_fetch_array($res)) { usergroups_sync(); $script = systask_get_script($arr['plugin_id'], $arr['systask_type']); if (!file_exists($script)) // Not installed on this node, skipping continue; if (!is_executable($script)) { db_query_params("UPDATE systasks SET status=$1, error_message=$2" . " WHERE systask_id=$3", array('ERROR', "Cron job {$arr['plugin_id']}/{$arr['systask_type']}" . " '$script' not executable.\n", $arr['systask_id'])); continue; } db_query_params("UPDATE systasks SET status=$1, started=now() WHERE systask_id=$2", array('WIP', $arr['systask_id'])); cron_acquire_lock($script); $ret = null; if ($verbose) print "Running: $script... "; system("$script\n", $ret); if ($ret == 0) { if ($verbose) print "DONE\n"; db_query_params("UPDATE systasks SET status=$1, stopped=now() WHERE systask_id=$2", array('DONE', $arr['systask_id'])); } else { if ($verbose) print "ERROR\n"; db_query_params("UPDATE systasks SET status=$1, stopped=now() WHERE systask_id=$2", array('ERROR', $arr['systask_id'])); } } usergroups_sync(); sleep(1); } // Local Variables: // mode: php // c-file-style: "bsd" // End: