loadAllWhere( '1 = 1 ORDER BY id DESC LIMIT 15'); $rows = array(); foreach ($logs as $log) { $epoch = $log->getDateCreated(); $rows[] = array( phutil_escape_html($log->getDaemon()), phutil_escape_html($log->getHost()), $log->getPID(), date('M j, Y', $epoch), date('g:i A', $epoch), phutil_render_tag( 'a', array( 'href' => '/daemon/log/'.$log->getID().'/', 'class' => 'button small grey', ), 'View Log'), ); } $daemon_table = new AphrontTableView($rows); $daemon_table->setHeaders( array( 'Daemon', 'Host', 'PID', 'Date', 'Time', 'View', )); $daemon_table->setColumnClasses( array( 'wide wrap', '', '', '', 'right', 'action', )); $daemon_panel = new AphrontPanelView(); $daemon_panel->setHeader('Recently Launched Daemons'); $daemon_panel->appendChild($daemon_table); $tasks = id(new PhabricatorWorkerTask())->loadAllWhere( 'leaseOwner IS NOT NULL'); $rows = array(); foreach ($tasks as $task) { $rows[] = array( $task->getID(), $task->getTaskClass(), $task->getLeaseOwner(), $task->getLeaseExpires() - time(), $task->getFailureCount(), phutil_render_tag( 'a', array( 'href' => '/daemon/task/'.$task->getID().'/', 'class' => 'button small grey', ), 'View Task'), ); } $leased_table = new AphrontTableView($rows); $leased_table->setHeaders( array( 'ID', 'Class', 'Owner', 'Expries', 'Failures', '', )); $leased_table->setColumnClasses( array( 'n', 'wide', '', '', 'n', 'action', )); $leased_table->setNoDataString('No tasks are leased by workers.'); $leased_panel = new AphrontPanelView(); $leased_panel->setHeader('Leased Tasks'); $leased_panel->appendChild($leased_table); $task_table = new PhabricatorWorkerTask(); $queued = queryfx_all( $task_table->establishConnection('r'), 'SELECT taskClass, count(*) N FROM %T GROUP BY taskClass ORDER BY N DESC', $task_table->getTableName()); $rows = array(); foreach ($queued as $row) { $rows[] = array( phutil_escape_html($row['taskClass']), number_format($row['N']), ); } $queued_table = new AphrontTableView($rows); $queued_table->setHeaders( array( 'Class', 'Count', )); $queued_table->setColumnClasses( array( 'wide', 'n', )); $queued_table->setNoDataString('Task queue is empty.'); $queued_panel = new AphrontPanelView(); $queued_panel->setHeader('Queued Tasks'); $queued_panel->appendChild($queued_table); $cursors = id(new PhabricatorTimelineCursor()) ->loadAll(); $rows = array(); foreach ($cursors as $cursor) { $rows[] = array( phutil_escape_html($cursor->getName()), number_format($cursor->getPosition()), ); } $cursor_table = new AphrontTableView($rows); $cursor_table->setHeaders( array( 'Name', 'Position', )); $cursor_table->setColumnClasses( array( 'wide', 'n', )); $cursor_table->setNoDataString('No timeline cursors exist.'); $cursor_panel = new AphrontPanelView(); $cursor_panel->setHeader('Timeline Cursors'); $cursor_panel->appendChild($cursor_table); return $this->buildStandardPageResponse( array( $daemon_panel, $leased_panel, $queued_panel, $cursor_panel, ), array( 'title' => 'Console', 'tab' => 'console', )); } }