diff options
Diffstat (limited to '')
-rw-r--r-- | configuration.php | 573 |
1 files changed, 573 insertions, 0 deletions
diff --git a/configuration.php b/configuration.php new file mode 100644 index 0000000..4104d8a --- /dev/null +++ b/configuration.php @@ -0,0 +1,573 @@ +<?php + +/* Icinga DB Web | (c) 2020 Icinga GmbH | GPLv2 */ + +namespace Icinga\Module\Icingadb { + + use Icinga\Application\Icinga; + use Icinga\Authentication\Auth; + use Icinga\Module\Icingadb\Web\Navigation\Renderer\HostProblemsBadge; + use Icinga\Module\Icingadb\Web\Navigation\Renderer\ServiceProblemsBadge; + use Icinga\Util\StringHelper; + use RecursiveDirectoryIterator; + use RecursiveIteratorIterator; + + /** @var \Icinga\Application\Modules\Module $this */ + + $this->provideSetupWizard('Icinga\Module\Icingadb\Setup\IcingaDbWizard'); + + $this->providePermission( + 'icingadb/command/*', + $this->translate('Allow all commands') + ); + $this->providePermission( + 'icingadb/command/schedule-check', + $this->translate('Allow to schedule host and service checks') + ); + $this->providePermission( + 'icingadb/command/schedule-check/active-only', + $this->translate('Allow to schedule host and service checks (Only on objects with active checks enabled)') + ); + $this->providePermission( + 'icingadb/command/acknowledge-problem', + $this->translate('Allow to acknowledge host and service problems') + ); + $this->providePermission( + 'icingadb/command/remove-acknowledgement', + $this->translate('Allow to remove problem acknowledgements') + ); + $this->providePermission( + 'icingadb/command/comment/*', + $this->translate('Allow to add and delete host and service comments') + ); + $this->providePermission( + 'icingadb/command/comment/add', + $this->translate('Allow to add host and service comments') + ); + $this->providePermission( + 'icingadb/command/comment/delete', + $this->translate('Allow to delete host and service comments') + ); + $this->providePermission( + 'icingadb/command/downtime/*', + $this->translate('Allow to schedule and delete host and service downtimes') + ); + $this->providePermission( + 'icingadb/command/downtime/schedule', + $this->translate('Allow to schedule host and service downtimes') + ); + $this->providePermission( + 'icingadb/command/downtime/delete', + $this->translate('Allow to delete host and service downtimes') + ); + $this->providePermission( + 'icingadb/command/process-check-result', + $this->translate('Allow to process host and service check results') + ); + $this->providePermission( + 'icingadb/command/feature/instance', + $this->translate('Allow to toggle instance-wide features') + ); + $this->providePermission( + 'icingadb/command/feature/object/*', + $this->translate('Allow to toggle all features on host and service objects') + ); + $this->providePermission( + 'icingadb/command/feature/object/active-checks', + $this->translate('Allow to toggle active checks on host and service objects') + ); + $this->providePermission( + 'icingadb/command/feature/object/passive-checks', + $this->translate('Allow to toggle passive checks on host and service objects') + ); + $this->providePermission( + 'icingadb/command/feature/object/notifications', + $this->translate('Allow to toggle notifications on host and service objects') + ); + $this->providePermission( + 'icingadb/command/feature/object/event-handler', + $this->translate('Allow to toggle event handlers on host and service objects') + ); + $this->providePermission( + 'icingadb/command/feature/object/flap-detection', + $this->translate('Allow to toggle flap detection on host and service objects') + ); + $this->providePermission( + 'icingadb/command/send-custom-notification', + $this->translate('Allow to send custom notifications for hosts and services') + ); + + $this->providePermission( + 'icingadb/object/show-source', + $this->translate('Allow to view an object\'s source data. (May contain sensitive data!)') + ); + + $this->provideRestriction( + 'icingadb/filter/objects', + $this->translate('Restrict access to the Icinga objects that match the filter') + ); + + $this->provideRestriction( + 'icingadb/filter/hosts', + $this->translate('Restrict access to the Icinga hosts and services that match the filter') + ); + + $this->provideRestriction( + 'icingadb/filter/services', + $this->translate('Restrict access to the Icinga services that match the filter') + ); + + $this->provideRestriction( + 'icingadb/denylist/routes', + $this->translate('Prevent access to routes that are part of the list') + ); + + $this->provideRestriction( + 'icingadb/denylist/variables', + $this->translate('Hide custom variables of Icinga objects that are part of the list') + ); + + $this->provideRestriction( + 'icingadb/protect/variables', + $this->translate('Obfuscate custom variable values of Icinga objects that are part of the list') + ); + + if (! $this::exists('monitoring')) { + /* + * Available navigation items + */ + $this->provideNavigationItem('icingadb-host-action', $this->translate('Host Action')); + $this->provideNavigationItem('icingadb-service-action', $this->translate('Service Action')); + + /** + * Search urls + */ + $this->provideSearchUrl( + $this->translate('Tactical Overview'), + 'icingadb/tactical', + 100 + ); + $this->provideSearchUrl( + $this->translate('Hosts'), + 'icingadb/hosts?sort=host.state.severity&limit=10', + 99 + ); + $this->provideSearchUrl( + $this->translate('Services on Hosts'), + 'icingadb/services?sort=service.state.severity&limit=10&_hostFilterOnly', + 98 + ); + $this->provideSearchUrl( + $this->translate('Services'), + 'icingadb/services?sort=service.state.severity&limit=10', + 97 + ); + $this->provideSearchUrl( + $this->translate('Hostgroups'), + 'icingadb/hostgroups?limit=10', + 96 + ); + $this->provideSearchUrl( + $this->translate('Servicegroups'), + 'icingadb/servicegroups?limit=10', + 95 + ); + + /** + * Current Incidents + */ + $dashboard = $this->dashboard(N_('Current Incidents'), ['priority' => 50]); + $dashboard->add( + N_('Service Problems'), + 'icingadb/services?service.state.is_problem=y' + . '&view=minimal&limit=32&sort=service.state.severity desc', + 100 + ); + $dashboard->add( + N_('Recently Recovered Services'), + 'icingadb/services?service.state.soft_state=0' + . '&view=minimal&limit=32&sort=service.state.last_state_change desc', + 110 + ); + $dashboard->add( + N_('Host Problems'), + 'icingadb/hosts?host.state.is_problem=y' + . '&view=minimal&limit=32&sort=host.state.severity desc', + 120 + ); + + /** + * Overdue + */ + $dashboard = $this->dashboard(N_('Overdue'), ['priority' => 70]); + $dashboard->add( + N_('Late Host Check Results'), + 'icingadb/hosts?host.state.is_overdue=y' + . '&view=minimal&limit=15&sort=host.state.severity desc', + 100 + ); + $dashboard->add( + N_('Late Service Check Results'), + 'icingadb/services?service.state.is_overdue=y' + . '&view=minimal&limit=15&sort=service.state.severity desc', + 110 + ); + $dashboard->add( + N_('Acknowledgements Active For At Least Three Days'), + 'icingadb/comments?comment.entry_type=ack&comment.entry_time<-3 days' + . '&view=minimal&limit=15&sort=comment.entry_time', + 120 + ); + $dashboard->add( + N_('Downtimes Active For At Least Three Days'), + 'icingadb/downtimes?downtime.is_in_effect=y&downtime.scheduled_start_time<-3 days' + . '&view=minimal&limit=15&sort=downtime.start_time', + 130 + ); + + /** + * Muted + */ + $dashboard = $this->dashboard(N_('Muted'), ['priority' => 80]); + $dashboard->add( + N_('Disabled Service Notifications'), + 'icingadb/services?service.notifications_enabled=n' + . '&view=minimal&limit=15&sort=service.state.severity desc', + 100 + ); + $dashboard->add( + N_('Disabled Host Notifications'), + 'icingadb/hosts?host.notifications_enabled=n' + . '&view=minimal&limit=15&sort=host.state.severity desc', + 110 + ); + $dashboard->add( + N_('Disabled Service Checks'), + 'icingadb/services?service.active_checks_enabled=n' + . '&view=minimal&limit=15&sort=service.state.last_state_change', + 120 + ); + $dashboard->add( + N_('Disabled Host Checks'), + 'icingadb/hosts?host.active_checks_enabled=n' + . '&view=minimal&limit=15&sort=host.state.last_state_change', + 130 + ); + $dashboard->add( + N_('Acknowledged Problem Services'), + 'icingadb/services?service.state.is_acknowledged!=n&service.state.is_problem=y' + . '&view=minimal&limit=15&sort=service.state.severity desc', + 140 + ); + $dashboard->add( + N_('Acknowledged Problem Hosts'), + 'icingadb/hosts?host.state.is_acknowledged!=n&host.state.is_problem=y' + . '&view=minimal&limit=15&sort=host.state.severity desc', + 150 + ); + + /** + * @var \Icinga\Application\Modules\Module $this + * + * Problems section in case monitoring is disabled + */ + $problemSection = $this->menuSection(N_('Problems'), [ + 'renderer' => array( + 'TotalProblemsBadge', + 'state' => 'critical' + ), + 'icon' => 'attention-circled', + 'priority' => 20 + ]); + $problemSection->add(N_('Host Problems'), [ + 'renderer' => (new HostProblemsBadge())->disableLink(), + 'icon' => 'server', + 'description' => $this->translate('List current host problems'), + 'url' => 'icingadb/hosts?host.state.is_problem=y' + . '&sort=host.state.severity desc', + 'priority' => 50 + ]); + $problemSection->add(N_('Service Problems'), [ + 'renderer' => (new ServiceProblemsBadge())->disableLink(), + 'icon' => 'cog', + 'description' => $this->translate('List current service problems'), + 'url' => 'icingadb/services?service.state.is_problem=y' + . '&sort=service.state.severity desc', + 'priority' => 60 + ]); + $problemSection->add(N_('Service Grid'), [ + 'icon' => 'cogs', + 'description' => $this->translate('Display service problems as grid'), + 'url' => 'icingadb/services/grid?problems', + 'priority' => 70 + ]); + + $problemSection->add(N_('Current Downtimes'), [ + 'description' => $this->translate('List current downtimes'), + 'url' => 'icingadb/downtimes?downtime.is_in_effect=y', + 'priority' => 80, + 'icon' => 'plug' + ]); + + /** + * @var \Icinga\Application\Modules\Module $this + * + * Overview section in case monitoring is disabled + */ + $overviewSection = $this->menuSection('Overview', [ + 'icon' => 'binoculars', + 'priority' => 30 + ]); + + $overviewSection->add(N_('Tactical Overview'), [ + 'url' => 'icingadb/tactical', + 'description' => $this->translate('Open tactical overview'), + 'priority' => 40, + 'icon' => 'chart-pie' + ]); + $overviewSection->add(N_('Hosts'), [ + 'priority' => 50, + 'description' => $this->translate('List hosts'), + 'url' => 'icingadb/hosts', + 'icon' => 'server' + ]); + $overviewSection->add(N_('Services'), [ + 'priority' => 60, + 'description' => $this->translate('List services'), + 'url' => 'icingadb/services', + 'icon' => 'cog' + ]); + $auth = Auth::getInstance(); + $routeDenylist = []; + if ($auth->isAuthenticated() && ! $auth->getUser()->isUnrestricted()) { + // The empty array is for PHP pre 7.4, older versions require at least a single param for array_merge + $routeDenylist = array_flip(array_merge([], ...array_map(function ($restriction) { + return StringHelper::trimSplit($restriction); + }, $auth->getRestrictions('icingadb/denylist/routes')))); + } + + if (! array_key_exists('hostgroups', $routeDenylist)) { + $overviewSection->add(N_('Host Groups'), [ + 'description' => $this->translate('List host groups'), + 'url' => 'icingadb/hostgroups', + 'priority' => 70, + 'icon' => 'network-wired' + ]); + } + + if (! array_key_exists('servicegroups', $routeDenylist)) { + $overviewSection->add(N_('Service Groups'), [ + 'description' => $this->translate('List service groups'), + 'url' => 'icingadb/servicegroups', + 'priority' => 80, + 'icon' => 'cogs' + ]); + } + + if (! array_key_exists('usergroups', $routeDenylist)) { + $overviewSection->add(N_('User Groups'), [ + 'description' => $this->translate('List user groups'), + 'url' => 'icingadb/usergroups', + 'priority' => 90, + 'icon' => 'users' + ]); + } + + if (! array_key_exists('users', $routeDenylist)) { + $overviewSection->add(N_('Users'), [ + 'description' => $this->translate('List users'), + 'url' => 'icingadb/users', + 'priority' => 100, + 'icon' => 'user-friends' + ]); + } + + + + $overviewSection->add(N_('Comments'), [ + 'url' => 'icingadb/comments', + 'description' => $this->translate('List comments'), + 'priority' => 110, + 'icon' => 'comments' + ]); + $overviewSection->add(N_('Downtimes'), [ + 'url' => 'icingadb/downtimes', + 'description' => $this->translate('List downtimes'), + 'priority' => 120, + 'icon' => 'plug' + ]); + + /** + * @var \Icinga\Application\Modules\Module $this + * + * History section in case monitoring is disabled + */ + + $section = $this->menuSection(N_('History'), array( + 'icon' => 'history', + 'priority' => 90 + )); + $section->add(N_('Notifications'), array( + 'icon' => 'bell', + 'description' => $this->translate('List notifications'), + 'priority' => 20, + 'url' => 'icingadb/notifications', + )); + $section->add(N_('Event Overview'), array( + 'icon' => 'history', + 'description' => $this->translate('Open event overview'), + 'priority' => 30, + 'url' => 'icingadb/history' + )); + } else { + /* + * Available navigation items + */ + $this->provideNavigationItem( + 'icingadb-host-action', + $this->translate('Host Action') . ' (Icinga DB)' + ); + $this->provideNavigationItem( + 'icingadb-service-action', + $this->translate('Service Action') . ' (Icinga DB)' + ); + + /** @var \Icinga\Application\Modules\Module $this */ + $section = $this->menuSection('Icinga DB', [ + 'icon' => 'database', + 'priority' => 30 + ]); + + $section->add(N_('Tactical Overview'), [ + 'url' => 'icingadb/tactical', + 'priority' => 10, + 'description' => $this->translate('Open tactical overview'), + 'icon' => 'chart-pie' + ]); + + $section->add(N_('Hosts'), [ + 'priority' => 20, + 'description' => $this->translate('List hosts'), + 'renderer' => 'HostProblemsBadge', + 'url' => 'icingadb/hosts', + 'icon' => 'server' + ]); + $section->add(N_('Services'), [ + 'priority' => 30, + 'description' => $this->translate('List services'), + 'renderer' => 'ServiceProblemsBadge', + 'url' => 'icingadb/services', + 'icon' => 'cog' + ]); + $section->add(N_('Service Grid'), [ + 'icon' => 'cog', + 'description' => $this->translate('Display service problems as grid'), + 'url' => 'icingadb/services/grid?problems', + 'priority' => 40 + ]); + + + $auth = Auth::getInstance(); + $routeDenylist = []; + if ($auth->isAuthenticated() && ! $auth->getUser()->isUnrestricted()) { + // The empty array is for PHP pre 7.4, older versions require at least a single param for array_merge + $routeDenylist = array_flip(array_merge([], ...array_map(function ($restriction) { + return StringHelper::trimSplit($restriction); + }, $auth->getRestrictions('icingadb/denylist/routes')))); + } + + if (! array_key_exists('hostgroups', $routeDenylist)) { + $section->add(N_('Host Groups'), [ + 'url' => 'icingadb/hostgroups', + 'priority' => 50, + 'description' => $this->translate('List host groups'), + 'icon' => 'network-wired' + ]); + } + + if (! array_key_exists('servicegroups', $routeDenylist)) { + $section->add(N_('Service Groups'), [ + 'url' => 'icingadb/servicegroups', + 'priority' => 60, + 'description' => $this->translate('List service groups'), + 'icon' => 'cogs' + ]); + } + + if (! array_key_exists('usergroups', $routeDenylist)) { + $section->add(N_('User Groups'), [ + 'url' => 'icingadb/usergroups', + 'priority' => 70, + 'description' => $this->translate('List user groups'), + 'icon' => 'users' + ]); + } + + if (! array_key_exists('users', $routeDenylist)) { + $section->add(N_('Users'), [ + 'url' => 'icingadb/users', + 'priority' => 80, + 'description' => $this->translate('List users'), + 'icon' => 'user-friends' + ]); + } + + $section->add(N_('Comments'), [ + 'url' => 'icingadb/comments', + 'priority' => 90, + 'description' => $this->translate('List comments'), + 'icon' => 'comments' + ]); + $section->add(N_('Downtimes'), [ + 'url' => 'icingadb/downtimes', + 'priority' => 100, + 'description' => $this->translate('List downtimes'), + 'icon' => 'plug' + ]); + $section->add(N_('Notifications'), [ + 'url' => 'icingadb/notifications', + 'priority' => 110, + 'description' => $this->translate('List notifications'), + 'icon' => 'bell' + ]); + $section->add(N_('History'), [ + 'url' => 'icingadb/history', + 'priority' => 120, + 'description' => $this->translate('List history'), + 'icon' => 'history' + ]); + } + + $this->provideConfigTab('database', [ + 'label' => t('Database'), + 'title' => t('Configure the database backend'), + 'url' => 'config/database' + ]); + $this->provideConfigTab('redis', [ + 'label' => t('Redis'), + 'title' => t('Configure the Redis connections'), + 'url' => 'config/redis' + ]); + $this->provideConfigTab('command-transports', [ + 'label' => t('Command Transports'), + 'title' => t('Configure command transports'), + 'url' => 'command-transport' + ]); + + $cssDirectory = $this->getCssDir(); + $cssFiles = new RecursiveIteratorIterator(new RecursiveDirectoryIterator( + $cssDirectory, + RecursiveDirectoryIterator::CURRENT_AS_PATHNAME | RecursiveDirectoryIterator::SKIP_DOTS + )); + foreach ($cssFiles as $path) { + $this->provideCssFile(ltrim(substr($path, strlen($cssDirectory)), DIRECTORY_SEPARATOR)); + } + + $this->provideJsFile('action-list.js'); + $this->provideJsFile('loadmore.js'); + + $mg = Icinga::app()->getModuleManager(); + if ($mg->hasEnabled('monitoring')) { + $this->provideJsFile('migrate.js'); + } +} |