diff --git a/application/controllers/ConfigController.php b/application/controllers/ConfigController.php index ab3e714a..2b7695da 100644 --- a/application/controllers/ConfigController.php +++ b/application/controllers/ConfigController.php @@ -7,11 +7,44 @@ use Icinga\Module\Director\Util; use Icinga\Module\Director\Web\Controller\ActionController; use Icinga\Web\Notification; use Icinga\Web\Url; +use Exception; class ConfigController extends ActionController { protected $isApified = true; + public function deploymentsAction() + { + $this->setAutorefreshInterval(5); + try { + if ($this->getRequest()->getUrl()->shift('checkforchanges')) { + $this->fetchLogs(); + } + } catch (Exception $e) { + // No problem, Icinga might be reloading + } + $this->view->addLink = $this->view->qlink( + $this->translate('Render config'), + 'director/config/store', + null, + array('class' => 'icon-wrench') + ); + + $this->overviewTabs()->activate('deploymentlog'); + $this->view->title = $this->translate('Deployments'); + $this->prepareTable('deploymentLog'); + try { + // Move elsewhere + $this->view->table->setActiveStageName( + $this->api()->getActiveStageName() + ); + } catch (Exception $e) { + // Don't care + } + + $this->render('objects/table', null, 'objects'); + } + public function deployAction() { // TODO: require POST @@ -28,7 +61,7 @@ class ConfigController extends ActionController if ($isApiRequest) { return $this->sendJson((object) array('checksum' => $checksum)); } else { - $url = Url::fromPath('director/list/deploymentlog'); + $url = Url::fromPath('director/config/deployments?checkforchanges'); Notification::success( $this->translate('Config has been submitted, validation is going on') ); @@ -47,6 +80,50 @@ class ConfigController extends ActionController } } + public function activitiesAction() + { + $this->setAutorefreshInterval(10); + $this->overviewTabs()->activate('activitylog'); + $this->view->title = $this->translate('Activity Log'); + $this->prepareAndRenderTable('activityLog'); + } + + protected function fetchLogs() + { + $api = $this->api(); + $collected = false; + foreach ($this->db()->getUncollectedDeployments() as $deployment) { + $stage = $deployment->stage_name; + try { + $availableFiles = $api->listStageFiles($stage); + } catch (Exception $e) { + // This is not correct. We might miss logs as af an ongoing reload + $deployment->stage_collected = 'y'; + $deployment->store(); + continue; + } + + if (in_array('startup.log', $availableFiles) + && in_array('status', $availableFiles) + ) { + if ($api->getStagedFile($stage, 'status') === '0') { + $deployment->startup_succeeded = 'y'; + } else { + $deployment->startup_succeeded = 'n'; + } + $deployment->startup_log = $this->api()->getStagedFile($stage, 'startup.log'); + } + $collected = true; + + $deployment->store(); + } + + // TODO: Not correct, we might clear logs we formerly skipped + if ($collected) { + // $api->wipeInactiveStages(); + } + } + // Show all files for a given config public function filesAction() { @@ -126,4 +203,22 @@ class ConfigController extends ActionController ) ); } + + protected function overviewTabs() + { + $this->view->tabs = $this->getTabs()->add( + 'deploymentlog', + array( + 'label' => $this->translate('Deployments'), + 'url' => 'director/config/deployments' + ) + )->add( + 'activitylog', + array( + 'label' => $this->translate('Activity Log'), + 'url' => 'director/config/activities' + ) + ); + return $this->view->tabs; + } } diff --git a/application/controllers/ListController.php b/application/controllers/ListController.php index d29b908d..5ea03f60 100644 --- a/application/controllers/ListController.php +++ b/application/controllers/ListController.php @@ -7,54 +7,6 @@ use Exception; class ListController extends ActionController { - public function deploymentlogAction() - { - $this->setAutorefreshInterval(5); - try { - $this->fetchLogs(); - } catch (Exception $e) { - // No problem, Icinga might be reloading - } - - $this->view->NOaddLink = $this->view->qlink( - $this->translate('Deploy'), - 'director/config/deploy' - ); - - $this->setConfigTabs()->activate('deploymentlog'); - $this->view->title = $this->translate('Deployments'); - $this->prepareTable('deploymentLog'); - try { - // Move elsewhere - $this->view->table->setActiveStageName( - $this->api()->getActiveStageName() - ); - } catch (Exception $e) { - // Don't care - } - $this->render('table'); - } - - public function generatedconfigAction() - { - $this->view->addLink = $this->view->qlink( - $this->translate('Generate'), - 'director/config/store' - ); - - $this->setConfigTabs()->activate('generatedconfig'); - $this->view->title = $this->translate('Generated Configs'); - $this->prepareAndRenderTable('generatedConfig'); - } - - public function activitylogAction() - { - $this->setAutorefreshInterval(10); - $this->setConfigTabs()->activate('activitylog'); - $this->view->title = $this->translate('Activity Log'); - $this->prepareAndRenderTable('activityLog'); - } - public function datalistAction() { $this->view->addLink = $this->view->icon('plus') @@ -143,40 +95,4 @@ class ListController extends ActionController $this->view->table = $this->loadTable('syncrule')->setConnection($this->db()); $this->render('table'); } - - protected function fetchLogs() - { - $api = $this->api(); - $collected = false; - foreach ($this->db()->getUncollectedDeployments() as $deployment) { - $stage = $deployment->stage_name; - try { - $availableFiles = $api->listStageFiles($stage); - } catch (Exception $e) { - // This is not correct. We might miss logs as af an ongoing reload - $deployment->stage_collected = 'y'; - $deployment->store(); - continue; - } - - if (in_array('startup.log', $availableFiles) - && in_array('status', $availableFiles) - ) { - if ($api->getStagedFile($stage, 'status') === '0') { - $deployment->startup_succeeded = 'y'; - } else { - $deployment->startup_succeeded = 'n'; - } - $deployment->startup_log = $this->api()->getStagedFile($stage, 'startup.log'); - } - $collected = true; - - $deployment->store(); - } - - // TODO: Not correct, we might clear logs we formerly skipped - if ($collected) { - // $api->wipeInactiveStages(); - } - } } diff --git a/application/views/scripts/index/index.phtml b/application/views/scripts/index/index.phtml index dbe6f9c7..168a4b62 100644 --- a/application/views/scripts/index/index.phtml +++ b/application/views/scripts/index/index.phtml @@ -97,9 +97,7 @@ $all = array( array('book', $this->translate('Audit log'), 'director/config/activities', $this->translate('Wondering about what changed why? Track you changes!'), 'ok'), ), $this->translate('Deploy configuration to your Icinga nodes') => array( - array('wrench', $this->translate('Deployment'), 'director/list/deploymentlog', $this->translate('Manage deployments, access audit log and history') . pendingDeployments($this)), - array('globe', $this->translate('Zones'), 'director/zones', statSummary($this, 'zone')), - array('cloud', $this->translate('Endpoints'), 'director/endpoints', statSummary($this, 'endpoint')), + array('wrench', $this->translate('Deployment'), 'director/config/deployments', $this->translate('Manage deployments, access audit log and history') . pendingDeployments($this), $this->undeployedActivities ? 'warning' : 'ok'), array('lock-open-alt', $this->translate('Api users'), 'director/apiusers', statSummary($this, 'apiuser')), array('cloud', $this->translate('Endpoints'), 'director/endpoints', statSummary($this, 'endpoint')), array('globe', $this->translate('Zones'), 'director/zones', statSummary($this, 'zone')), diff --git a/configuration.php b/configuration.php index df2c500a..685dcb23 100644 --- a/configuration.php +++ b/configuration.php @@ -37,7 +37,7 @@ $section->add($this->translate('Users'))->setUrl('director/users')->setPriority( $section->add($this->translate('Import / Sync')) ->setUrl('director/list/importsource') ->setPriority(901); -$section->add($this->translate('Config')) - ->setUrl('director/list/deploymentlog') +$section->add($this->translate('Deployments / History')) + ->setUrl('director/config/deployments') ->setPriority(902) ->setRenderer('ConfigHealthItemRenderer');