public function usherServerControl($request, $match) { $server = $match[1]; if (!in_array($server, IDF_Scm_Monotone_Usher::getServerList())) { throw new Pluf_HTTP_Error404(); } $action = $match[2]; if (!in_array($action, array('start', 'stop', 'kill'))) { throw new Pluf_HTTP_Error404(); } $msg = null; if ($action == 'start') { IDF_Scm_Monotone_Usher::startServer($server); $msg = sprintf(__('The server "%s" has been started'), $server); } else { if ($action == 'stop') { IDF_Scm_Monotone_Usher::stopServer($server); $msg = sprintf(__('The server "%s" has been stopped'), $server); } else { IDF_Scm_Monotone_Usher::killServer($server); $msg = sprintf(__('The server "%s" has been killed'), $server); } } $request->user->setMessage($msg); $url = Pluf_HTTP_URL_urlForView('IDF_Views_Admin::usher'); return new Pluf_HTTP_Response_Redirect($url); }
/** * Updates the read / write permissions for the monotone database * * @param IDF_Project */ public function processMembershipsUpdated($project) { if ($project->getConf()->getVal('scm') != 'mtn') { return; } if (Pluf::f('mtn_db_access', 'local') == 'local') { return; } $mtn = IDF_Scm_Monotone::factory($project); $stdio = $mtn->getStdio(); $projectpath = self::_get_project_path($project); $auth_ids = self::_get_authorized_user_ids($project); $key_ids = array(); foreach ($auth_ids as $auth_id) { $sql = new Pluf_SQL('user=%s', array($auth_id)); $keys = Pluf::factory('IDF_Key')->getList(array('filter' => $sql->gen())); foreach ($keys as $key) { if ($key->getType() != 'mtn') { continue; } $stdio->exec(array('put_public_key', $key->content)); $key_ids[] = $key->getMtnId(); } } $write_permissions = implode("\n", $key_ids); $rcfile = $projectpath . '/write-permissions'; if (file_put_contents($rcfile, $write_permissions, LOCK_EX) === false) { throw new IDF_Scm_Exception(sprintf(__('Could not write write-permissions file "%s"'), $rcfile)); } if ($project->private) { $stanza = array(array('key' => 'pattern', 'values' => array('*'))); foreach ($key_ids as $key_id) { $stanza[] = array('key' => 'allow', 'values' => array($key_id)); } } else { $stanza = array(array('key' => 'pattern', 'values' => array('*')), array('key' => 'allow', 'values' => array('*'))); } $read_permissions = IDF_Scm_Monotone_BasicIO::compile(array($stanza)); $rcfile = $projectpath . '/read-permissions'; if (file_put_contents($rcfile, $read_permissions, LOCK_EX) === false) { throw new IDF_Scm_Exception(sprintf(__('Could not write read-permissions file "%s"'), $rcfile)); } // link / unlink the read-only automate permissions for the project $confdir = Pluf::f('mtn_confdir', false); if ($confdir === false) { $confdir = dirname(__FILE__) . '/SyncMonotone/'; } $file = 'hooks.d/indefero_authorize_remote_automate.conf'; $projectfile = $projectpath . '/' . $file; $templatefile = $confdir . '/' . $file; $serverRestartRequired = false; if ($project->private && file_exists($projectfile) && is_link($projectfile)) { if (!unlink($projectfile)) { IDF_Scm_Exception(sprintf(__('Could not remove symlink "%s"'), $projectfile)); } $serverRestartRequired = true; } else { if (!$project->private && !file_exists($projectfile)) { if (!symlink($templatefile, $projectfile)) { throw new IDF_Scm_Exception(sprintf(__('Could not create symlink "%s"'), $projectfile)); } $serverRestartRequired = true; } } if ($serverRestartRequired) { // FIXME: we should actually use stopServer() here, but this // seems to be ignored when the server should be started // again immediately afterwards IDF_Scm_Monotone_Usher::killServer($project->shortname); IDF_Scm_Monotone_Usher::startServer($project->shortname); } }