* @author Icinga Development Team */ // {{{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 *
     * array(
     *  self::CMD_CONSTANT_* => array(
     *   '',
     *   '',
     *   '[ICON CSS CLASS]',
     *   '[BUTTON CSS CLASS]',
     *
     *    // Maybe any other options later on
     *  )
     * )
     * 
* * @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; } }