/**
* Small and fast system tasks trigger
*
- * Copyright (C) 2014 Inria (Sylvain Beucler)
+ * Copyright (C) 2014, 2015 Inria (Sylvain Beucler)
*
* This file is part of FusionForge. FusionForge is free software;
* you can redistribute it and/or modify it under the terms of the
//putenv('FUSIONFORGE_NO_DB=true');
require (dirname(__FILE__).'/../common/include/env.inc.php');
-require_once $gfcommon.'include/pre.php';
+try {
+ require_once $gfcommon.'include/pre.php';
+} catch (DBException $e) {
+ print "Cannot connect to DB: $e\nWaiting for DB...\n";
+}
require_once $gfcommon.'include/cron_utils.php';
// Invalidate users/groups cache e.g. when a user is added to a group
global $usergroups_lastsync;
$res = db_query_params("SELECT MAX(last_modified_date) AS lastmodified FROM nss_usergroups");
$row = db_fetch_array($res);
- if ($row['lastmodified'] > $usergroups_lastsync) {
+ if ($row['lastmodified'] >= $usergroups_lastsync) {
+ $usergroups_lastsync = time();
cron_reload_nscd();
+ cron_regen_apache_auth();
cron_reload_apache();
$hook_params = array();
plugin_hook("usergroups_sync", $hook_params);
- $usergroups_lastsync = time();
}
}
return null;
}
+function is_group_active_nocache($group_id) {
+ $res = db_query_params("SELECT group_id FROM nss_groups WHERE group_id=$1", array($group_id));
+ return (db_numrows($res) > 0);
+}
$shortopts = 'v'; // enable verbose mode
// Proper daemon
posix_setsid();
chdir('/');
-umask(0);
+//umask(0); // programmers usually expect umask=0022, and this would default mkdir to 0777
+umask(0022);
+$log_path = forge_get_config('log_path');
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/
fclose(STDOUT);
fclose(STDERR);
$ff_stdin = fopen('/dev/null', 'r');
- $ff_stdout = fopen('/dev/null', 'w');
- $ff_stderr = fopen('php://stdout', 'w');
+ //$ff_stdout = fopen('/dev/null', 'w');
+ //$ff_stderr = fopen('php://stdout', 'w');
+ $ff_stdout = fopen("$log_path/systasksd.stdout", 'w');
+ $ff_stderr = fopen("$log_path/systasksd.stderr", '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
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
$arr['systask_id']));
continue;
}
+
+ // Concurrency: ensure groups are activated in the system before starting task
+ if (!empty($arr['group_id']) && !is_group_active_nocache($arr['group_id'])) {
+ continue; // wait until project is approved
+ }
+ usergroups_sync();
+
db_query_params("UPDATE systasks SET status=$1, started=now() WHERE systask_id=$2",
array('WIP', $arr['systask_id']));
cron_acquire_lock($script);