protected function loadPage()
 {
     $table = new PhabricatorDaemonLog();
     $conn_r = $table->establishConnection('r');
     $data = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r));
     return $table->loadAllFromArray($data);
 }
 protected function collectGarbage()
 {
     $table = new PhabricatorDaemonLog();
     $conn_w = $table->establishConnection('w');
     queryfx($conn_w, 'DELETE FROM %T WHERE dateCreated < %d AND status != %s LIMIT 100', $table->getTableName(), $this->getGarbageEpoch(), PhabricatorDaemonLog::STATUS_RUNNING);
     return $conn_w->getAffectedRows() == 100;
 }
 public function collectGarbage()
 {
     $ttl = PhabricatorEnv::getEnvConfig('gcdaemon.ttl.daemon-logs');
     if ($ttl <= 0) {
         return false;
     }
     $table = new PhabricatorDaemonLog();
     $conn_w = $table->establishConnection('w');
     queryfx($conn_w, 'DELETE FROM %T WHERE dateCreated < %d AND status != %s LIMIT 100', $table->getTableName(), time() - $ttl, PhabricatorDaemonLog::STATUS_RUNNING);
     return $conn_w->getAffectedRows() == 100;
 }
 private function buildPropertyListView(PhabricatorDaemonLog $daemon)
 {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $view = id(new PHUIPropertyListView())->setUser($viewer);
     $id = $daemon->getID();
     $c_epoch = $daemon->getDateCreated();
     $u_epoch = $daemon->getDateModified();
     $unknown_time = PhabricatorDaemonLogQuery::getTimeUntilUnknown();
     $dead_time = PhabricatorDaemonLogQuery::getTimeUntilDead();
     $wait_time = PhutilDaemonHandle::getWaitBeforeRestart();
     $details = null;
     $status = $daemon->getStatus();
     switch ($status) {
         case PhabricatorDaemonLog::STATUS_RUNNING:
             $details = pht('This daemon is running normally and reported a status update ' . 'recently (within %s).', phutil_format_relative_time($unknown_time));
             break;
         case PhabricatorDaemonLog::STATUS_UNKNOWN:
             $details = pht('This daemon has not reported a status update recently (within %s). ' . 'It may have exited abruptly. After %s, it will be presumed dead.', phutil_format_relative_time($unknown_time), phutil_format_relative_time($dead_time));
             break;
         case PhabricatorDaemonLog::STATUS_DEAD:
             $details = pht('This daemon did not report a status update for %s. It is ' . 'presumed dead. Usually, this indicates that the daemon was ' . 'killed or otherwise exited abruptly with an error. You may ' . 'need to restart it.', phutil_format_relative_time($dead_time));
             break;
         case PhabricatorDaemonLog::STATUS_WAIT:
             $details = pht('This daemon is running normally and reported a status update ' . 'recently (within %s). However, it encountered an error while ' . 'doing work and is waiting a little while (%s) to resume ' . 'processing. After encountering an error, daemons wait before ' . 'resuming work to avoid overloading services.', phutil_format_relative_time($unknown_time), phutil_format_relative_time($wait_time));
             break;
         case PhabricatorDaemonLog::STATUS_EXITING:
             $details = pht('This daemon is shutting down gracefully.');
             break;
         case PhabricatorDaemonLog::STATUS_EXITED:
             $details = pht('This daemon exited normally and is no longer running.');
             break;
     }
     $view->addProperty(pht('Status Details'), $details);
     $view->addProperty(pht('Daemon Class'), $daemon->getDaemon());
     $view->addProperty(pht('Host'), $daemon->getHost());
     $view->addProperty(pht('PID'), $daemon->getPID());
     $view->addProperty(pht('Running as'), $daemon->getRunningAsUser());
     $view->addProperty(pht('Started'), phabricator_datetime($c_epoch, $viewer));
     $view->addProperty(pht('Seen'), pht('%s ago (%s)', phutil_format_relative_time(time() - $u_epoch), phabricator_datetime($u_epoch, $viewer)));
     $argv = $daemon->getArgv();
     if (is_array($argv)) {
         $argv = implode("\n", $argv);
     }
     $view->addProperty(pht('Argv'), phutil_tag('textarea', array('style' => 'width: 100%; height: 12em;'), $argv));
     $view->addProperty(pht('View Full Logs'), phutil_tag('tt', array(), "phabricator/ \$ ./bin/phd log --id {$id}"));
     return $view;
 }
 protected function execute(ConduitAPIRequest $request)
 {
     $daemon_log = new PhabricatorDaemonLog();
     $daemon_log->setDaemon($request->getValue('daemon'));
     $daemon_log->setHost($request->getValue('host'));
     $daemon_log->setPID($request->getValue('pid'));
     $daemon_log->setStatus(PhabricatorDaemonLog::STATUS_RUNNING);
     $daemon_log->setArgv(json_decode($request->getValue('argv')));
     $daemon_log->save();
     return $daemon_log->getID();
 }