icingaweb2/modules/monitoring/library/Monitoring/Command/Meta.php

847 lines
29 KiB
PHP

<?php
// {{{ICINGA_LICENSE_HEADER}}}
/**
* Icinga 2 Web - Head for multiple monitoring frontends
* Copyright (C) 2013 Icinga Development Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* @copyright 2013 Icinga Development Team <info@icinga.org>
* @author Icinga Development Team <info@icinga.org>
*/
// {{{ICINGA_LICENSE_HEADER}}}
namespace Monitoring\Command;
use Icinga\Authentication\User;
use Icinga\Exception\ProgrammingError;
/**
* Class Meta
*
* Deals with objects and available commands which can be used on the object
*/
class Meta
{
/**
* Category name which is useless
*/
const DROP_CATEGORY = 'none';
/**
* Interface type for small interfaces
*
* Only important commands
*/
const TYPE_SMALL = 'small';
/**
* Interface type for full featured interface
*
* All commands are shown
*/
const TYPE_FULL = 'full';
const CMD_DISABLE_ACTIVE_CHECKS = 1;
const CMD_ENABLE_ACTIVE_CHECKS = 2;
const CMD_RESCHEDULE_NEXT_CHECK = 3;
const CMD_SUBMIT_PASSIVE_CHECK_RESULT = 4;
const CMD_STOP_OBSESSING = 5;
const CMD_START_OBSESSING = 6;
const CMD_STOP_ACCEPTING_PASSIVE_CHECKS = 7;
const CMD_START_ACCEPTING_PASSIVE_CHECKS = 8;
const CMD_DISABLE_NOTIFICATIONS = 9;
const CMD_ENABLE_NOTIFICATIONS = 10;
const CMD_SEND_CUSTOM_NOTIFICATION = 11;
const CMD_SCHEDULE_DOWNTIME = 12;
const CMD_SCHEDULE_DOWNTIMES_TO_ALL = 13;
const CMD_REMOVE_DOWNTIMES_FROM_ALL = 14;
const CMD_DISABLE_NOTIFICATIONS_FOR_ALL = 15;
const CMD_ENABLE_NOTIFICATIONS_FOR_ALL = 16;
const CMD_RESCHEDULE_NEXT_CHECK_TO_ALL = 17;
const CMD_DISABLE_ACTIVE_CHECKS_FOR_ALL = 18;
const CMD_ENABLE_ACTIVE_CHECKS_FOR_ALL = 19;
const CMD_DISABLE_EVENT_HANDLER = 20;
const CMD_ENABLE_EVENT_HANDLER = 21;
const CMD_DISABLE_FLAP_DETECTION = 22;
const CMD_ENABLE_FLAP_DETECTION = 23;
const CMD_ADD_COMMENT = 24;
const CMD_RESET_ATTRIBUTES = 25;
const CMD_ACKNOWLEDGE_PROBLEM = 26;
const CMD_REMOVE_ACKNOWLEDGEMENT = 27;
const CMD_DELAY_NOTIFICATION = 28;
const CMD_REMOVE_DOWNTIME = 29;
/**
* Filter array for array displayed in small interfaces
* @var int[]
*/
private static $commandSmallFilter = array(
self::CMD_RESCHEDULE_NEXT_CHECK,
self::CMD_ACKNOWLEDGE_PROBLEM,
self::CMD_REMOVE_ACKNOWLEDGEMENT
);
/**
* Information about interface commands
*
* With following structure
* <pre>
* array(
* self::CMD_CONSTANT_* => array(
* '<LONG DESCRIPTION WHERE %s is the type, e.g. host or service>',
* '<SHORT DESCRIPTION WHERE %s is the type, e.g. host or service>',
* '[ICON CSS CLASS]',
* '[BUTTON CSS CLASS]',
*
* // Maybe any other options later on
* )
* )
* </pre>
*
* @var array
*/
private static $commandInformation = array(
self::CMD_DISABLE_ACTIVE_CHECKS => array(
'Disable active checks for this %s', // Long description (mandatory)
'Disable active checks', // Short description (mandatory)
'', // Icon anything (optional)
'' // Button css cls (optional)
),
self::CMD_ENABLE_ACTIVE_CHECKS => array(
'Enable active checks for this %s',
'Enable active checks',
''
),
self::CMD_RESCHEDULE_NEXT_CHECK => array(
'Reschedule next service check',
'Recheck',
'',
'btn-success'
),
self::CMD_SUBMIT_PASSIVE_CHECK_RESULT => array(
'Submit passive check result',
'Submit check result',
''
),
self::CMD_STOP_OBSESSING => array(
'Stop obsessing over this %s',
'Stop obsessing',
''
),
self::CMD_START_OBSESSING => array(
'Start obsessing over this %s',
'Start obsessing',
''
),
self::CMD_STOP_ACCEPTING_PASSIVE_CHECKS => array(
'Stop accepting passive check for this %s',
'Stop passive checks',
''
),
self::CMD_START_ACCEPTING_PASSIVE_CHECKS => array(
'Start accepting passive check for this %s',
'Start passive checks',
''
),
self::CMD_DISABLE_NOTIFICATIONS => array(
'Disable notifications for this %s',
'Disable notifications',
''
),
self::CMD_ENABLE_NOTIFICATIONS => array(
'Enable notifications for this %s',
'Enable notifications',
''
),
self::CMD_SEND_CUSTOM_NOTIFICATION => array(
'Send custom %s notification',
'Send notification',
''
),
self::CMD_SCHEDULE_DOWNTIME => array(
'Schedule downtime for this %s',
'Schedule downtime',
''
),
self::CMD_SCHEDULE_DOWNTIMES_TO_ALL => array(
'Schedule downtime for this %s and all services',
'Schedule services downtime',
''
),
self::CMD_REMOVE_DOWNTIMES_FROM_ALL => array(
'Remove downtime(s) for this %s and all services',
'Remove downtime(s)',
''
),
self::CMD_DISABLE_NOTIFICATIONS_FOR_ALL => array(
'Disable notification for all service on this %s',
'Disable service notifications',
''
),
self::CMD_ENABLE_NOTIFICATIONS_FOR_ALL => array(
'Enable notification for all service on this %s',
'Enable service notifications',
''
),
self::CMD_RESCHEDULE_NEXT_CHECK_TO_ALL => array(
'Schedule a check of all service on this %s',
'Recheck all services',
'',
'btn-success'
),
self::CMD_DISABLE_ACTIVE_CHECKS_FOR_ALL => array(
'Disable checks for all services on this %s',
'Disable service checks',
''
),
self::CMD_ENABLE_ACTIVE_CHECKS_FOR_ALL => array(
'Enable checks for all services on this %s',
'Enable service checks',
''
),
self::CMD_DISABLE_EVENT_HANDLER => array(
'Disable event handler for this %s',
'Disable event handler',
''
),
self::CMD_ENABLE_EVENT_HANDLER => array(
'Enable event handler for this %s',
'Enable event handler',
''
),
self::CMD_DISABLE_FLAP_DETECTION => array(
'Disable flap detection for this %s',
'Disable flap detection',
''
),
self::CMD_ENABLE_FLAP_DETECTION => array(
'Enable flap detection for this %s',
'Enable flap detection',
''
),
self::CMD_ADD_COMMENT => array(
'Add new %s comment',
'Add comment',
''
),
self::CMD_RESET_ATTRIBUTES => array(
'Reset modified attributes',
'Reset attributes',
'',
'btn-danger'
),
self::CMD_ACKNOWLEDGE_PROBLEM => array(
'Acknowledge %s problem',
'Acknowledge',
'',
'btn-warning'
),
self::CMD_REMOVE_ACKNOWLEDGEMENT => array(
'Remove %s acknowledgement',
'Remove acknowledgement',
'',
'btn-warning'
),
self::CMD_DELAY_NOTIFICATION => array(
'Delay next %s notification',
'Delay notification',
''
),
);
/**
* An mapping array which is valid for hosts and services
* @var array
*/
private static $defaultObjectCommands = array(
self::CMD_DISABLE_ACTIVE_CHECKS,
self::CMD_ENABLE_ACTIVE_CHECKS,
self::CMD_RESCHEDULE_NEXT_CHECK,
self::CMD_SUBMIT_PASSIVE_CHECK_RESULT,
self::CMD_STOP_OBSESSING,
self::CMD_START_OBSESSING,
self::CMD_ACKNOWLEDGE_PROBLEM,
self::CMD_REMOVE_ACKNOWLEDGEMENT,
self::CMD_STOP_ACCEPTING_PASSIVE_CHECKS,
self::CMD_START_ACCEPTING_PASSIVE_CHECKS,
self::CMD_DISABLE_NOTIFICATIONS,
self::CMD_ENABLE_NOTIFICATIONS,
self::CMD_SEND_CUSTOM_NOTIFICATION,
self::CMD_SCHEDULE_DOWNTIME,
self::CMD_SCHEDULE_DOWNTIMES_TO_ALL,
self::CMD_REMOVE_DOWNTIMES_FROM_ALL,
self::CMD_DISABLE_NOTIFICATIONS_FOR_ALL,
self::CMD_ENABLE_NOTIFICATIONS_FOR_ALL,
self::CMD_RESCHEDULE_NEXT_CHECK_TO_ALL,
self::CMD_DISABLE_ACTIVE_CHECKS_FOR_ALL,
self::CMD_ENABLE_ACTIVE_CHECKS_FOR_ALL,
self::CMD_DISABLE_EVENT_HANDLER,
self::CMD_ENABLE_EVENT_HANDLER,
self::CMD_DISABLE_FLAP_DETECTION,
self::CMD_ENABLE_FLAP_DETECTION,
self::CMD_ADD_COMMENT,
self::CMD_RESET_ATTRIBUTES,
self::CMD_DELAY_NOTIFICATION
);
/**
* Command mapper
*
* Holds information about commands for object types
*
* Please note that host and service are implicit initialized!
* see $defaultObjectCommands for definition
*
* @var array
*/
private static $objectCommands = array(
// 'host' => self::$defaultObjectCommands,
// 'service' => self::$defaultObjectCommands,
// -> this is done in self::initCommandStructure()
//
// Real other commands structures:
// NONE
);
/**
* Array of modifier methods in this class
*
* Maps object type to modifier method which rewrites
* visible commands depending on object states
*
* @var array
*/
private static $commandProcessorMethods = array(
'host' => 'defaultCommandProcessor',
'service' => 'defaultCommandProcessor'
);
/**
* Init flag for lazy, static data preparation
* @var bool
*/
private static $initialized = false;
/**
* Array of available categories
* @var array
*/
private static $rawCategories = array();
/**
* Categories to command names
* @var array
*/
private static $rawCommandCategories = array();
/**
* Command reference list
* @var array
*/
private static $rawCommands = array(
'NONE' => 'none',
'ADD_HOST_COMMENT' => 'host',
'DEL_HOST_COMMENT' => 'host',
'ADD_SVC_COMMENT' => 'service',
'DEL_SVC_COMMENT' => 'service',
'ENABLE_SVC_CHECK' => 'service',
'DISABLE_SVC_CHECK' => 'service',
'SCHEDULE_SVC_CHECK' => 'service',
'DELAY_SVC_NOTIFICATION' => 'service',
'DELAY_HOST_NOTIFICATION' => 'host',
'DISABLE_NOTIFICATIONS' => 'global',
'ENABLE_NOTIFICATIONS' => 'global',
'RESTART_PROCESS' => 'global',
'SHUTDOWN_PROCESS' => 'global',
'ENABLE_HOST_SVC_CHECKS' => 'host',
'DISABLE_HOST_SVC_CHECKS' => 'host',
'SCHEDULE_HOST_SVC_CHECKS' => 'host',
'DELAY_HOST_SVC_NOTIFICATIONS' => 'host',
'DEL_ALL_HOST_COMMENTS' => 'host',
'DEL_ALL_SVC_COMMENTS' => 'service',
'ENABLE_SVC_NOTIFICATIONS' => 'service',
'DISABLE_SVC_NOTIFICATIONS' => 'service',
'ENABLE_HOST_NOTIFICATIONS' => 'host',
'DISABLE_HOST_NOTIFICATIONS' => 'host',
'ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST' => 'host',
'DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST' => 'host',
'ENABLE_HOST_SVC_NOTIFICATIONS' => 'host',
'DISABLE_HOST_SVC_NOTIFICATIONS' => 'host',
'PROCESS_SERVICE_CHECK_RESULT' => 'service',
'SAVE_STATE_INFORMATION' => 'global',
'READ_STATE_INFORMATION' => 'global',
'ACKNOWLEDGE_HOST_PROBLEM' => 'host',
'ACKNOWLEDGE_SVC_PROBLEM' => 'service',
'START_EXECUTING_SVC_CHECKS' => 'service',
'STOP_EXECUTING_SVC_CHECKS' => 'service',
'START_ACCEPTING_PASSIVE_SVC_CHECKS' => 'service',
'STOP_ACCEPTING_PASSIVE_SVC_CHECKS' => 'service',
'ENABLE_PASSIVE_SVC_CHECKS' => 'service',
'DISABLE_PASSIVE_SVC_CHECKS' => 'service',
'ENABLE_EVENT_HANDLERS' => 'global',
'DISABLE_EVENT_HANDLERS' => 'global',
'ENABLE_HOST_EVENT_HANDLER' => 'host',
'DISABLE_HOST_EVENT_HANDLER' => 'host',
'ENABLE_SVC_EVENT_HANDLER' => 'service',
'DISABLE_SVC_EVENT_HANDLER' => 'service',
'ENABLE_HOST_CHECK' => 'host',
'DISABLE_HOST_CHECK' => 'host',
'START_OBSESSING_OVER_SVC_CHECKS' => 'service',
'STOP_OBSESSING_OVER_SVC_CHECKS' => 'service',
'REMOVE_HOST_ACKNOWLEDGEMENT' => 'host',
'REMOVE_SVC_ACKNOWLEDGEMENT' => 'service',
'SCHEDULE_FORCED_HOST_SVC_CHECKS' => 'host',
'SCHEDULE_FORCED_SVC_CHECK' => 'service',
'SCHEDULE_HOST_DOWNTIME' => 'host',
'SCHEDULE_SVC_DOWNTIME' => 'service',
'ENABLE_HOST_FLAP_DETECTION' => 'host',
'DISABLE_HOST_FLAP_DETECTION' => 'host',
'ENABLE_SVC_FLAP_DETECTION' => 'service',
'DISABLE_SVC_FLAP_DETECTION' => 'service',
'ENABLE_FLAP_DETECTION' => 'global',
'DISABLE_FLAP_DETECTION' => 'global',
'ENABLE_HOSTGROUP_SVC_NOTIFICATIONS' => 'hostgroup',
'DISABLE_HOSTGROUP_SVC_NOTIFICATIONS' => 'hostgroup',
'ENABLE_HOSTGROUP_HOST_NOTIFICATIONS' => 'hostgroup',
'DISABLE_HOSTGROUP_HOST_NOTIFICATIONS' => 'hostgroup',
'ENABLE_HOSTGROUP_SVC_CHECKS' => 'hostgroup',
'DISABLE_HOSTGROUP_SVC_CHECKS' => 'hostgroup',
'CANCEL_HOST_DOWNTIME' => 'host',
'CANCEL_SVC_DOWNTIME' => 'service',
'CANCEL_ACTIVE_HOST_DOWNTIME' => 'host',
'CANCEL_PENDING_HOST_DOWNTIME' => 'host',
'CANCEL_ACTIVE_SVC_DOWNTIME' => 'service',
'CANCEL_PENDING_SVC_DOWNTIME' => 'service',
'CANCEL_ACTIVE_HOST_SVC_DOWNTIME' => 'host',
'CANCEL_PENDING_HOST_SVC_DOWNTIME' => 'host',
'FLUSH_PENDING_COMMANDS' => 'global',
'DEL_HOST_DOWNTIME' => 'host',
'DEL_SVC_DOWNTIME' => 'service',
'ENABLE_FAILURE_PREDICTION' => 'global',
'DISABLE_FAILURE_PREDICTION' => 'global',
'ENABLE_PERFORMANCE_DATA' => 'global',
'DISABLE_PERFORMANCE_DATA' => 'global',
'SCHEDULE_HOSTGROUP_HOST_DOWNTIME' => 'hostgroup',
'SCHEDULE_HOSTGROUP_SVC_DOWNTIME' => 'hostgroup',
'SCHEDULE_HOST_SVC_DOWNTIME' => 'host',
'PROCESS_HOST_CHECK_RESULT' => 'host',
'START_EXECUTING_HOST_CHECKS' => 'host',
'STOP_EXECUTING_HOST_CHECKS' => 'host',
'START_ACCEPTING_PASSIVE_HOST_CHECKS' => 'host',
'STOP_ACCEPTING_PASSIVE_HOST_CHECKS' => 'host',
'ENABLE_PASSIVE_HOST_CHECKS' => 'host',
'DISABLE_PASSIVE_HOST_CHECKS' => 'host',
'START_OBSESSING_OVER_HOST_CHECKS' => 'host',
'STOP_OBSESSING_OVER_HOST_CHECKS' => 'host',
'SCHEDULE_HOST_CHECK' => 'host',
'SCHEDULE_FORCED_HOST_CHECK' => 'host',
'START_OBSESSING_OVER_SVC' => 'global',
'STOP_OBSESSING_OVER_SVC' => 'global',
'START_OBSESSING_OVER_HOST' => 'global',
'STOP_OBSESSING_OVER_HOST' => 'global',
'ENABLE_HOSTGROUP_HOST_CHECKS' => 'host',
'DISABLE_HOSTGROUP_HOST_CHECKS' => 'host',
'ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS' => 'host',
'DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS' => 'host',
'ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS' => 'host',
'DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS' => 'host',
'ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS' => 'servicegroup',
'DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS' => 'servicegroup',
'ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS' => 'servicegroup',
'DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS' => 'servicegroup',
'ENABLE_SERVICEGROUP_SVC_CHECKS' => 'servicegroup',
'DISABLE_SERVICEGROUP_SVC_CHECKS' => 'servicegroup',
'ENABLE_SERVICEGROUP_HOST_CHECKS' => 'servicegroup',
'DISABLE_SERVICEGROUP_HOST_CHECKS' => 'servicegroup',
'ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS' => 'servicegroup',
'DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS' => 'servicegroup',
'ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS' => 'servicegroup',
'DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS' => 'servicegroup',
'SCHEDULE_SERVICEGROUP_HOST_DOWNTIME' => 'servicegroup',
'SCHEDULE_SERVICEGROUP_SVC_DOWNTIME' => 'servicegroup',
'CHANGE_GLOBAL_HOST_EVENT_HANDLER' => 'global',
'CHANGE_GLOBAL_SVC_EVENT_HANDLER' => 'global',
'CHANGE_HOST_EVENT_HANDLER' => 'host',
'CHANGE_SVC_EVENT_HANDLER' => 'service',
'CHANGE_HOST_CHECK_COMMAND' => 'host',
'CHANGE_SVC_CHECK_COMMAND' => 'service',
'CHANGE_NORMAL_HOST_CHECK_INTERVAL' => 'host',
'CHANGE_NORMAL_SVC_CHECK_INTERVAL' => 'service',
'CHANGE_RETRY_SVC_CHECK_INTERVAL' => 'service',
'CHANGE_MAX_HOST_CHECK_ATTEMPTS' => 'host',
'CHANGE_MAX_SVC_CHECK_ATTEMPTS' => 'service',
'SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME' => 'host',
'ENABLE_HOST_AND_CHILD_NOTIFICATIONS' => 'host',
'DISABLE_HOST_AND_CHILD_NOTIFICATIONS' => 'host',
'SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME' => 'host',
'ENABLE_SERVICE_FRESHNESS_CHECKS' => 'global',
'DISABLE_SERVICE_FRESHNESS_CHECKS' => 'global',
'ENABLE_HOST_FRESHNESS_CHECKS' => 'host',
'DISABLE_HOST_FRESHNESS_CHECKS' => 'host',
'SET_HOST_NOTIFICATION_NUMBER' => 'host',
'SET_SVC_NOTIFICATION_NUMBER' => 'service',
'CHANGE_HOST_CHECK_TIMEPERIOD' => 'host',
'CHANGE_SVC_CHECK_TIMEPERIOD' => 'service',
'PROCESS_FILE' => 'global',
'CHANGE_CUSTOM_HOST_VAR' => 'host',
'CHANGE_CUSTOM_SVC_VAR' => 'service',
'CHANGE_CUSTOM_CONTACT_VAR' => 'global',
'ENABLE_CONTACT_HOST_NOTIFICATIONS' => 'host',
'DISABLE_CONTACT_HOST_NOTIFICATIONS' => 'host',
'ENABLE_CONTACT_SVC_NOTIFICATIONS' => 'service',
'DISABLE_CONTACT_SVC_NOTIFICATIONS' => 'service',
'ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS' => 'host',
'DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS' => 'host',
'ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS' => 'service',
'DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS' => 'service',
'CHANGE_RETRY_HOST_CHECK_INTERVAL' => 'host',
'SEND_CUSTOM_HOST_NOTIFICATION' => 'host',
'SEND_CUSTOM_SVC_NOTIFICATION' => 'service',
'CHANGE_HOST_NOTIFICATION_TIMEPERIOD' => 'host',
'CHANGE_SVC_NOTIFICATION_TIMEPERIOD' => 'service',
'CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD' => 'host',
'CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD' => 'service',
'CHANGE_HOST_MODATTR' => 'host',
'CHANGE_SVC_MODATTR' => 'service',
'CHANGE_CONTACT_MODATTR' => 'contact',
'CHANGE_CONTACT_MODHATTR' => 'contact',
'CHANGE_CONTACT_MODSATTR' => 'contact',
'SYNC_STATE_INFORMATION' => 'contact',
'DEL_DOWNTIME_BY_HOST_NAME' => 'host',
'DEL_DOWNTIME_BY_HOSTGROUP_NAME' => 'hostgroup',
'DEL_DOWNTIME_BY_START_TIME_COMMENT' => 'comment',
'ACKNOWLEDGE_HOST_PROBLEM_EXPIRE' => 'host',
'ACKNOWLEDGE_SVC_PROBLEM_EXPIRE' => 'service',
'DISABLE_NOTIFICATIONS_EXPIRE_TIME' => 'global',
'CUSTOM_COMMAND' => 'none',
);
/**
* Initialize command structures only once
*/
private static function initCommandStructure()
{
if (self::$initialized === true) {
return;
}
/*
* Build everything for raw commands
*/
$categories = array();
foreach (self::$rawCommands as $commandName => $categoryName) {
// We do not want to see useless commands
if ($categoryName === self::DROP_CATEGORY) {
unset(self::$rawCommands[$commandName]);
continue;
}
$categories[$categoryName] = null;
if (array_key_exists($categoryName, self::$rawCommandCategories) === false) {
self::$rawCommandCategories[$categoryName] = array();
}
self::$rawCommandCategories[$categoryName][] = $commandName;
}
self::$rawCategories = array_keys($categories);
sort(self::$rawCategories);
/*
* Build everything for object commands
*/
self::$objectCommands['host'] = self::$defaultObjectCommands;
self::$objectCommands['service'] = self::$defaultObjectCommands;
self::$initialized = true;
}
/**
* Creates a new object
*/
public function __construct()
{
self::initCommandStructure();
}
/**
* Return a full list of commands
* @return string[]
*/
public function getRawCommands()
{
static $commands = null;
if ($commands === null) {
$commands = array_keys(self::$rawCommands);
}
return $commands;
}
/**
* Return all commands for a category
* @param string $categoryName
* @return string[]
*/
public function getRawCommandsForCategory($categoryName)
{
$this->assertRawCategoryExistence($categoryName);
return array_values(self::$rawCommandCategories[$categoryName]);
}
/**
* Test for category existence
* @param string $categoryName
* @throws \Icinga\Exception\ProgrammingError
*/
private function assertRawCategoryExistence($categoryName)
{
if (array_key_exists($categoryName, self::$rawCommandCategories) === false) {
throw new ProgrammingError('Category does not exists: ' . $categoryName);
}
}
/**
* Return a list of all categories
* @return string[]
*/
public function getRawCategories()
{
return self::$rawCategories;
}
/**
* Returns the type of object
*
* This is made by the first key of property
* e.g.
* $object->host_state
* Type is 'host'
*
* @param \stdClass $object
* @return mixed
*/
private function getObjectType(\stdClass $object)
{
$objectKeys = array_keys(get_object_vars($object));
$firstKeys = explode('_', array_shift($objectKeys), 2);
return array_shift($firstKeys);
}
/**
* Returns method name based on object type
* @param string $type
* @return string
* @throws \Icinga\Exception\ProgrammingError
*/
private function getCommandProcessorMethod($type)
{
if (array_key_exists($type, self::$commandProcessorMethods)) {
$method = self::$commandProcessorMethods[$type];
if (is_callable(array(&$this, $method))) {
return $method;
}
}
throw new ProgrammingError('Type has no command processor: '. $type);
}
/**
* Return interface commands by object type
* @param string $type
* @return array
* @throws \Icinga\Exception\ProgrammingError
*/
private function getCommandsByType($type)
{
if (array_key_exists($type, self::$objectCommands)) {
return self::$objectCommands[$type];
}
throw new ProgrammingError('Type has no commands defined: '. $type);
}
/**
* Modifies data objects to drop their object type
*
* - host_state will be state
* - service_state will be also state
* - And so on
*
* @param \stdClass $object
* @param $type
* @return object
*/
private function dropTypeAttributes(\stdClass $object, $type)
{
$objectData = get_object_vars($object);
foreach ($objectData as $propertyName => $propertyValue) {
$newProperty = str_replace($type. '_', '', $propertyName);
$objectData[$newProperty] = $propertyValue;
unset($objectData[$propertyName]);
}
return (object)$objectData;
}
/**
* Default processor for host and service objects
*
* Drop commands from list based on states and object properties
*
* @param \stdClass $object
* @param array $commands
* @param string $type
* @return array
*/
private function defaultCommandProcessor(\stdClass $object, array $commands, $type)
{
$object = $this->dropTypeAttributes($object, $type);
$commands = array_flip($commands);
if ($object->active_checks_enabled === '1') {
unset($commands[self::CMD_ENABLE_ACTIVE_CHECKS]);
} else {
unset($commands[self::CMD_DISABLE_ACTIVE_CHECKS]);
}
if ($object->passive_checks_enabled !== '1') {
unset($commands[self::CMD_SUBMIT_PASSIVE_CHECK_RESULT]);
}
if ($object->passive_checks_enabled === '1') {
unset($commands[self::CMD_STOP_ACCEPTING_PASSIVE_CHECKS]);
} else {
unset($commands[self::CMD_START_ACCEPTING_PASSIVE_CHECKS]);
}
if ($object->obsess_over_host === '1') {
unset($commands[self::CMD_START_OBSESSING]);
} else {
unset($commands[self::CMD_STOP_OBSESSING]);
}
if ($object->state !== '0') {
if ($object->acknowledged === '1') {
unset($commands[self::CMD_ACKNOWLEDGE_PROBLEM]);
} else {
unset($commands[self::CMD_REMOVE_ACKNOWLEDGEMENT]);
}
} else {
unset($commands[self::CMD_ACKNOWLEDGE_PROBLEM]);
unset($commands[self::CMD_REMOVE_ACKNOWLEDGEMENT]);
}
if ($object->notifications_enabled === '1') {
unset($commands[self::CMD_ENABLE_NOTIFICATIONS]);
} else {
unset($commands[self::CMD_DISABLE_NOTIFICATIONS]);
}
if ($object->event_handler_enabled === '1') {
unset($commands[self::CMD_ENABLE_EVENT_HANDLER]);
} else {
unset($commands[self::CMD_DISABLE_EVENT_HANDLER]);
}
if ($object->flap_detection_enabled === '1') {
unset($commands[self::CMD_ENABLE_FLAP_DETECTION]);
} else {
unset($commands[self::CMD_DISABLE_FLAP_DETECTION]);
}
return array_flip($commands);
}
/**
* Creates structure to work with in interfaces
*
* @param array $commands
* @param string $objectType
* @return array
*/
private function buildInterfaceConfiguration(array $commands, $objectType)
{
$out = array();
foreach ($commands as $index => $commandId) {
$command = new \stdClass();
$command->id = $commandId;
if (array_key_exists($commandId, self::$commandInformation)) {
$command->shortDescription = sprintf(self::$commandInformation[$commandId][1], $objectType);
$command->longDescription = sprintf(self::$commandInformation[$commandId][0], $objectType);
$command->iconCls =
(isset(self::$commandInformation[$commandId][2]))
? self::$commandInformation[$commandId][2]
: '';
$command->btnCls =
(isset(self::$commandInformation[$commandId][3]))
? self::$commandInformation[$commandId][3]
: '';
}
$out[] = $command;
}
return $out;
}
/**
* Drop commands
* For small interfaces or bypass when full interfaces are needed
* @param array $commands
* @param string $type
* @return array
*/
private function filterInterfaceType(array $commands, $type)
{
if ($type === self::TYPE_FULL) {
return $commands;
}
foreach ($commands as $arrayId => $commandId) {
if (in_array($commandId, self::$commandSmallFilter) === false) {
unset($commands[$arrayId]);
}
}
return $commands;
}
/**
* Get commands for an object
*
* Based on objects and interface type
*
* @param \stdClass $object
* @param $interfaceType
* @param User $user
* @return array
*/
public function getCommandForObject(\stdClass $object, $interfaceType, User $user = null)
{
$objectType = $this->getObjectType($object);
$commands = $this->getCommandsByType($objectType);
$method = $this->getCommandProcessorMethod($objectType);
$commands = $this->$method($object, $commands, $objectType);
$commands = $this->filterInterfaceType($commands, $interfaceType);
$commands = $this->buildInterfaceConfiguration($commands, $objectType);
return $commands;
}
}