protected function setAttributesFromIcingaObjectDefinition(IcingaObjectDefinition $object, IcingaConfig $config) { //template, parents and config $this->is_template = $object->isTemplate(); $this->_parents = $object->getParents(); $all_contacts = array(); $all_contactgroups = array(); $all_parents = array(); //---- LOOP ATTRIBUTES BEGIN foreach ($object->getAttributes() as $key => $value) { //rejects if ($key !== null && in_array($key, $this->v1RejectedAttributeMap)) { continue; } //ugly 1.x hacks //these values must be resolved earlier already if ($this->is_template && ($key == "service_description" || $key == "host_name")) { continue; //skip invalid template attributes } if (!$this->is_template && $key == "name") { continue; //skip invalid object attributes } // template imports if ($key == "use") { $this->imports = $this->migrateUseImport($value, $key); //DONE continue; } //check command arguments if ($key == "check_command") { $command_arr = explode("!", $value); $this->properties['check_command'] = "\"" . $command_arr[0] . "\""; //first is always the command name for ($i = 1; $i < count($command_arr); $i++) { $varname = "ARG" . $i; $varvalue = addslashes($command_arr[$i]); //escape the string //check against legacy macros and replace them $varvalue = $this->migrateLegacyMacros($varvalue); $this->vars($varname, $varvalue); } //DONE continue; } //event handler translation if ($key == "event_handler") { $eventcommand_prefix = (string) $object; if ($object instanceof IcingaHost) { $eventcommand_prefix = "host-" . $eventcommand_prefix; } else { if ($object instanceof IcingaService) { $eventcommand_prefix = "service-" . $eventcommand_prefix; } } $eventcommand_obj = $config->getObject($value, 'command'); $eventcommand_name = $eventcommand_prefix . "-" . $value; $eventcommand_line = addslashes($eventcommand_obj->command_line); $eventcommand_line = $this->migrateLegacyMacros($eventcommand_line); $this->eventcommands($eventcommand_name, $eventcommand_line); $this->event_command = "\"" . $eventcommand_name . "\""; //DONE continue; } //parents to dependencies if ($key == "parents") { //skip templates if ($this->isTemplate()) { continue; } $parents = $this->splitComma($value); foreach ($parents as $parent) { $all_parents[] = trim($parent); } continue; } //convert host/service notifications if ($key == "contacts" && ($object instanceof IcingaService || $object instanceof IcingaHost)) { //skip templates if ($this->isTemplate()) { continue; } $contacts = $this->splitComma($value); foreach ($contacts as $contact) { $all_contacts[] = $contact; } //TODO recursive lookup in templates printf("//Found contacts attribute: %s on object %s\n", $value, $object); /* $lookup = $this->collectObjectAttributeRecursive($object, 'contacts'); if (count($lookup) > 0) { foreach($lookup as $l_contact) { preg_replace('/^\+\w+/', '', $l_contact); //drop additive $all_contacts[] = $l_contact; } } */ continue; } if ($key == "contact_groups" && ($object instanceof IcingaService || $object instanceof IcingaHost)) { //skip templates if ($this->isTemplate()) { continue; } $contactgroups = $this->splitComma($value); foreach ($contactgroups as $contactgroup) { $all_contactgroups[] = $contactgroup; } printf("//Found contact_groups attribute: %s on object %s\n", $value, $object); //TODO recursive lookup in templates /* $lookup = $this->collectObjectAttributeRecursive($object, 'contactgroups'); if (count($lookup) > 0) { foreach($lookup as $l_contactgroup) { preg_replace('/^\+\w+/', '', $l_contactgroup); //drop additive $all_contactgroups[] = $l_contactgroup; } } */ continue; } //conversion of different attributes $func = 'convert' . ucfirst($key); if (method_exists($this, $func)) { $this->{$func}($value); continue; } if ($object->getDefinitionType() == "timeperiod") { if (preg_match('/^\\d+/', $key)) { print_r("//ERROR: Timeperiod property invalid. Skipping it.\n"); continue; } $key = "ranges." . $key; $this->{$key} = "\"" . $value . "\""; continue; //allow remaining items } //mapping if (!array_key_exists($key, $this->v1AttributeMap)) { throw new Icinga2ConfigMigrationException(sprintf('Cannot convert the "%s" property of given v1 object: ', $key) . print_r($object, 1)); } //migrate $value = $this->migrateValue($value, $key); if ($value !== null) { $this->{$this->v1AttributeMap[$key]} = $value; } } //---- LOOP ATTRIBUTES END //---- NOTIFICATIONS BEGIN if ($object instanceof IcingaService || $object instanceof IcingaHost) { //var_dump($all_contactgroups); //var_dump($all_contacts); //contacts -> notifications $all_contactgroups = array_unique($all_contactgroups); if (count($all_contactgroups) > 0) { printf("//Found contact_groups: %s\n", $this->arrayToString($all_contactgroups)); } //fetch all contactgroup members as string foreach ($all_contactgroups as $contactgroup) { trim($contactgroup); $contact_objs = $config->getObjectsByAttributeValue('contactgroups', $contactgroup, 'contact'); //gosh i love these attributes. contact->contactgroups, but host->contact_groups - WTF?!? //no contacts with 'contactgroups' attribute, try the group members instead. if (count($contact_objs) == 0) { $contactgroup_obj = $config->getObject($contactgroup, 'contactgroup'); $contact_objs = $this->splitComma($contactgroup_obj->members); } foreach ($contact_objs as $contact_obj) { $all_contacts[] = (string) $contact_obj; } } //make sure that only unique contacts exist, we do not need too much duplicated notifications $all_contacts = array_unique($all_contacts); if (count($all_contacts) > 0) { printf("//Found contacts: %s\n", $this->arrayToString($all_contacts)); } foreach ($all_contacts as $contact) { //strip additive character $name = preg_replace('/^\\+/', '', $contact); trim($name); $contact_obj = $config->GetObject($name, 'contact'); if ($contact_obj == false) { print "//ERROR: Unknown contact '" . $name . "' referenced by object '" . $object . "'."; continue; } //HOST NOTIFICATIONS if ($object instanceof IcingaHost) { $host_notification_commands = $this->splitComma($contact_obj->host_notification_commands); foreach ($host_notification_commands as $host_notification_command) { trim($host_notification_command); //get the command line $host_notification_command_line = $config->getObject($host_notification_command, 'command'); //generate a unique notification command name $host_notification_command_name = "host-" . (string) $object . "-notification-command-" . $host_notification_command; //create a new notification command $this->notificationcommands($host_notification_command_name, $host_notification_command_line); $notification_filter = $this->migrateNotificationOptions($object->notification_options, true); //create a new host notification object $notification_object_name = "notification-" . $host_notification_command_name; $notification_object_attr = array('users' => array($contact), 'import' => 'generic-host-notification', 'period' => $object->notification_period, 'interval' => $object->notification_interval, 'states' => $notification_filter['state'], 'types' => $notification_filter['type'], 'command' => $host_notification_command_name, 'host_name' => (string) $object); $this->notifications($notification_object_name, $notification_object_attr); } } //SERVICE NOTIFICATION if ($object instanceof IcingaService) { $service_notification_commands = $this->splitComma($contact_obj->service_notification_commands); foreach ($service_notification_commands as $service_notification_command) { trim($service_notification_command); if ($object->host_name) { $prefix = "host-" . $object->host_name; } else { //some random madness $prefix = substr(str_shuffle(md5(time())), 0, 10); //length 10 is sufficient } //get the command line $service_notification_command_line = $config->getObject($service_notification_command, 'command'); //generate a unique notification command name //TODO that's not really clear for services only, being non unique by their name - get hostname/group? $service_notification_command_name = $prefix . "-service-" . (string) $object . "-notification-command-" . $service_notification_command; //create a new notification command $this->notificationcommands($service_notification_command_name, $service_notification_command_line); //create a new host notification object $notification_object_name = "notification-" . $service_notification_command_name; $notification_filter = $this->migrateNotificationOptions($object->notification_options, false); $notification_object_attr = array('users' => array($contact), 'import' => 'generic-service-notification', 'period' => $object->notification_period, 'interval' => $object->notification_interval, 'states' => $notification_filter['state'], 'types' => $notification_filter['type'], 'command' => $service_notification_command_name); if ($object->host_name) { $notification_object_attr['host_name'] = $object->host_name; $notification_object_attr['service_name'] = (string) $object; } else { //if there is no direct relation, we need to specify the service.name as additional assign rule $notification_object_attr['service_assign'] = (string) $object; } $this->notifications($notification_object_name, $notification_object_attr); } } } } //make sure we have unique notification commands (and also notifications, even if not that accurate TODO) $this->notificationcommands = array_unique($this->notificationcommands); $this->notifications = array_unique($this->notifications); //---- NOTIFICATIONS END //---- HOST PARENTS BEGIN if ($object instanceof IcingaHost) { $all_parents = array_unique($all_parents); if (count($all_parents) > 0) { printf("//Found parents: %s\n", $this->arrayToString($all_parents)); } foreach ($all_parents as $parent) { trim($parent); $host_obj = $config->GetObject($parent, 'host'); if ($host_obj == false) { print "//ERROR: Unknown parent host '" . $parent . "' referenced by object '" . $object . "'."; continue; } $dep_name = "child-" . $object . "-parent-" . $parent . "-host-dependency"; $dep_attrs = array('child_host_name' => (string) $object, 'parent_host_name' => $parent); $this->dependencies($dep_name, $dep_attrs); } } //---- HOST PARENTS END //itl required imports if ($object->getDefinitionType() == "timeperiod") { $this->imports("legacy-timeperiod"); } if ($object->getDefinitionType() == "command") { $this->imports("plugin-check-command"); } //custom vars foreach ($object->getCustomVars() as $key => $value) { $key = substr($key, 1); //drop _ $this->vars($key, $value); } }
public function v1Action() { $start = microtime(true); printf("//---------------------------------------------------\n"); printf("//Migrate Icinga 1.x configuration to Icinga 2 format\n"); printf("//Start time: " . date("Y-m-d H:i:s") . "\n"); printf("//---------------------------------------------------\n"); //parse 1.x objects $configfile = $this->params->shift(); $config = IcingaConfig::parse($configfile); //dump default templates for new objects Icinga2ObjectDefinition::dumpDefaultTemplates(); //migrate all objects to 2.x printf("//MIGRATE COMMANDS -- BEGIN\n"); foreach ($config->getDefinitions('command') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE COMMANDS -- END\n"); printf("//MIGRATE HOSTS -- BEGIN\n"); foreach ($config->getDefinitions('host') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); //direct host->service relation if (count($object->getServices()) > 0) { printf("//---- MIGRATE HOST SERVICES -- BEGIN\n"); foreach ($object->getServices() as $service) { $service->host_name = $object; //force relation Icinga2ObjectDefinition::fromIcingaObjectDefinition($service, $config)->dump(); } printf("//---- MIGRATE HOST SERVICES -- END\n"); } } printf("//MIGRATE HOSTS -- END\n"); printf("//MIGRATE SERVICE -- BEGIN\n"); //TODO only templates should dumped? foreach ($config->getDefinitions('service') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE SERVICE -- END\n"); printf("//MIGRATE CONTACTS (USERS) -- BEGIN\n"); foreach ($config->getDefinitions('contact') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE CONTACTS (USERS) -- END\n"); printf("//MIGRATE HOSTGROUPS -- BEGIN\n"); foreach ($config->getDefinitions('hostgroup') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); //indirect hostgroup->service relation if (count($object->getServices()) > 0) { printf("//---- MIGRATE HOSTGROUP SERVICES -- BEGIN\n"); foreach ($object->getServices() as $service) { $service->hostgroup_name = $object; //force relation Icinga2ObjectDefinition::fromIcingaObjectDefinition($service, $config)->dump(); } printf("//---- MIGRATE HOSTGROUP SERVICES -- END\n"); } } printf("//MIGRATE HOSTGROUPS -- END\n"); printf("//MIGRATE SERVICEGROUPS -- BEGIN\n"); foreach ($config->getDefinitions('servicegroup') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE SERVICEGROUPS -- END\n"); printf("//MIGRATE CONTACTGROUPS (USERGROUPS) -- BEGIN\n"); foreach ($config->getDefinitions('contactgroup') as $object) { // TODO: Find a better way than hardcoded Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE CONTACTGROUPS (USERGROUPS) -- END\n"); printf("//MIGRATE TIMEPERIODS -- BEGIN\n"); foreach ($config->getDefinitions('timeperiod') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE TIMEPERIODS -- END\n"); printf("//MIGRATE HOST DEPENDENCIES -- BEGIN\n"); foreach ($config->getDefinitions('hostdependency') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE HOST DEPENDENCIES -- END\n"); printf("//MIGRATE SERVICE DEPENDENCIES -- BEGIN\n"); foreach ($config->getDefinitions('servicedependency') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE SERVICE DEPENDENCIES -- END\n"); printf("//MIGRATE HOST ESCALATION -- BEGIN\n"); foreach ($config->getDefinitions('hostescalation') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE HOST ESCALATION -- END\n"); printf("//MIGRATE SERVICE ESCALATION -- BEGIN\n"); foreach ($config->getDefinitions('serviceescalation') as $object) { Icinga2ObjectDefinition::fromIcingaObjectDefinition($object, $config)->dump(); } printf("//MIGRATE SERVICE ESCALATION -- END\n"); $end = microtime(true); $runtime = $end - $start; printf("//---------------------------------------------------\n"); printf("//FINISHED :-)\n"); printf("//End time: " . date("Y-m-d H:i:s") . "\n"); printf("//Runtime: " . (double) $runtime . "\n"); printf("//---------------------------------------------------\n"); }