@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at upstream/main 178 lines 5.6 kB view raw
1<?php 2 3final class PhabricatorDaemonLogViewController 4 extends PhabricatorDaemonController { 5 6 public function handleRequest(AphrontRequest $request) { 7 $viewer = $request->getViewer(); 8 $id = $request->getURIData('id'); 9 10 $log = id(new PhabricatorDaemonLogQuery()) 11 ->setViewer($viewer) 12 ->withIDs(array($id)) 13 ->setAllowStatusWrites(true) 14 ->executeOne(); 15 if (!$log) { 16 return new Aphront404Response(); 17 } 18 19 $crumbs = $this->buildApplicationCrumbs(); 20 $crumbs->addTextCrumb(pht('Daemon %s', $log->getID())); 21 $crumbs->setBorder(true); 22 23 $header = id(new PHUIHeaderView()) 24 ->setHeader($log->getDaemon()) 25 ->setHeaderIcon('fa-pied-piper-alt'); 26 27 $status = $log->getStatus(); 28 switch ($status) { 29 case PhabricatorDaemonLog::STATUS_UNKNOWN: 30 $color = 'orange'; 31 $name = pht('Unknown'); 32 $icon = 'fa-warning'; 33 break; 34 case PhabricatorDaemonLog::STATUS_RUNNING: 35 $color = 'green'; 36 $name = pht('Running'); 37 $icon = 'fa-rocket'; 38 break; 39 case PhabricatorDaemonLog::STATUS_DEAD: 40 $color = 'red'; 41 $name = pht('Dead'); 42 $icon = 'fa-times'; 43 break; 44 case PhabricatorDaemonLog::STATUS_WAIT: 45 $color = 'blue'; 46 $name = pht('Waiting'); 47 $icon = 'fa-clock-o'; 48 break; 49 case PhabricatorDaemonLog::STATUS_EXITING: 50 $color = 'yellow'; 51 $name = pht('Exiting'); 52 $icon = 'fa-check'; 53 break; 54 case PhabricatorDaemonLog::STATUS_EXITED: 55 $color = 'bluegrey'; 56 $name = pht('Exited'); 57 $icon = 'fa-check'; 58 break; 59 } 60 61 $header->setStatus($icon, $color, $name); 62 63 $properties = $this->buildPropertyListView($log); 64 65 $object_box = id(new PHUIObjectBoxView()) 66 ->setHeaderText(pht('Daemon Details')) 67 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 68 ->addPropertyList($properties); 69 70 $view = id(new PHUITwoColumnView()) 71 ->setHeader($header) 72 ->setFooter(array( 73 $object_box, 74 )); 75 76 return $this->newPage() 77 ->setTitle(pht('Daemon Log')) 78 ->setCrumbs($crumbs) 79 ->appendChild($view); 80 81 } 82 83 private function buildPropertyListView(PhabricatorDaemonLog $daemon) { 84 $request = $this->getRequest(); 85 $viewer = $request->getUser(); 86 87 $view = id(new PHUIPropertyListView()) 88 ->setUser($viewer); 89 90 $id = $daemon->getID(); 91 $c_epoch = $daemon->getDateCreated(); 92 $u_epoch = $daemon->getDateModified(); 93 94 $unknown_time = PhabricatorDaemonLogQuery::getTimeUntilUnknown(); 95 $dead_time = PhabricatorDaemonLogQuery::getTimeUntilDead(); 96 $wait_time = PhutilDaemonHandle::getWaitBeforeRestart(); 97 98 $details = null; 99 $status = $daemon->getStatus(); 100 switch ($status) { 101 case PhabricatorDaemonLog::STATUS_RUNNING: 102 $details = pht( 103 'This daemon is running normally and reported a status update '. 104 'recently (within %s).', 105 phutil_format_relative_time($unknown_time)); 106 break; 107 case PhabricatorDaemonLog::STATUS_UNKNOWN: 108 $details = pht( 109 'This daemon has not reported a status update recently (within %s). '. 110 'It may have exited abruptly. After %s, it will be presumed dead.', 111 phutil_format_relative_time($unknown_time), 112 phutil_format_relative_time($dead_time)); 113 break; 114 case PhabricatorDaemonLog::STATUS_DEAD: 115 $details = pht( 116 'This daemon did not report a status update for %s. It is '. 117 'presumed dead. Usually, this indicates that the daemon was '. 118 'killed or otherwise exited abruptly with an error. You may '. 119 'need to restart it.', 120 phutil_format_relative_time($dead_time)); 121 break; 122 case PhabricatorDaemonLog::STATUS_WAIT: 123 $details = pht( 124 'This daemon is running normally and reported a status update '. 125 'recently (within %s). The process is currently waiting to '. 126 'restart, either because it is hibernating or because it '. 127 'encountered an error.', 128 phutil_format_relative_time($unknown_time)); 129 break; 130 case PhabricatorDaemonLog::STATUS_EXITING: 131 $details = pht('This daemon is shutting down gracefully.'); 132 break; 133 case PhabricatorDaemonLog::STATUS_EXITED: 134 $details = pht('This daemon exited normally and is no longer running.'); 135 break; 136 } 137 138 $view->addProperty(pht('Status Details'), $details); 139 140 $view->addProperty(pht('Daemon Class'), $daemon->getDaemon()); 141 $view->addProperty(pht('Host'), $daemon->getHost()); 142 $view->addProperty(pht('PID'), $daemon->getPID()); 143 $view->addProperty(pht('Running as'), $daemon->getRunningAsUser()); 144 $view->addProperty(pht('Started'), phabricator_datetime($c_epoch, $viewer)); 145 $view->addProperty( 146 pht('Seen'), 147 pht( 148 '%s ago (%s)', 149 phutil_format_relative_time(time() - $u_epoch), 150 phabricator_datetime($u_epoch, $viewer))); 151 152 $argv = $daemon->getArgv(); 153 if (is_array($argv)) { 154 $argv = implode("\n", $argv); 155 } 156 157 $view->addProperty( 158 pht('Argv'), 159 phutil_tag( 160 'textarea', 161 array( 162 'style' => 'width: 100%; height: 12em;', 163 ), 164 $argv)); 165 166 $view->addProperty( 167 pht('View Full Logs'), 168 phutil_tag( 169 'tt', 170 array(), 171 PlatformSymbols::getPlatformServerPath(). 172 " $ ./bin/phd log --id {$id}")); 173 174 175 return $view; 176 } 177 178}