Example #1
0
 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);
 }
Example #2
0
 /**
  * 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);
     }
 }