=pod /****************************************************************************** * Icinga 2 * * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * * * * 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 St, Fifth Floor, Boston, MA 02110-1301, USA. * ******************************************************************************/ =cut package Icinga2::ExportIcinga2Cfg; use strict; use Data::Dumper; use File::Find; use Storable qw(dclone); use POSIX qw/strftime/; use feature 'say'; #use Icinga2; use Icinga2::Utils; #our $dbg_lvl = 1; # XXX figure a better way for \t count printing, making dumps more modular # XXX sort macros and linked hostservices by name ################################################################################ # Helpers ################################################################################ sub open_cfg_file { my $file = shift; my $FH; say "writing file '$file'...\n"; open($FH, ">".$file); if (!-w $FH) { print "ERROR: cannot write file '$file'. Check permissions!\n"; } return $FH; } sub close_cfg_file { my $FH = shift; close($FH); } sub add_header { my $icinga2_cfg = shift; dump_config_line($icinga2_cfg, "/******************************************************************************"); dump_config_line($icinga2_cfg, " * GENERATED BY ICINGA2 CONVERSION SCRIPT"); dump_config_line($icinga2_cfg, " * " . strftime('%Y-%m-%d %H:%M:%S',localtime)); dump_config_line($icinga2_cfg, " ******************************************************************************/"); } sub dump_config_line { my $icinga2_cfg = shift; my $line = shift; my $dbg_lvl = $icinga2_cfg->{'__I2EXPORT_DEBUG'}; if ($dbg_lvl) { print $line. "\n"; } print { $icinga2_cfg->{'__I2EXPORT_FH'} } "$line\n"; } sub start_object_type_config_dump { my $icinga2_cfg = shift; my $cfg_type = shift; $icinga2_cfg->{'__I2EXPORT_FH'} = open_cfg_file($icinga2_cfg->{$cfg_type}); add_header($icinga2_cfg); } sub end_object_type_config_dump { my $icinga2_cfg = shift; close_cfg_file($icinga2_cfg->{'__I2EXPORT_FH'}); } ################################################################################ # DUMP ALL OBJECTS 2.x ################################################################################ sub dump_cfg_resource_2x { my $icinga2_cfg = shift; my $icinga2_global_macros = shift; start_object_type_config_dump($icinga2_cfg, 'resource'); dump_config_line($icinga2_cfg, "set IcingaMacros = {"); foreach my $global_macro_2x_key (sort keys %{$icinga2_global_macros}) { dump_config_line($icinga2_cfg, "\t\"$global_macro_2x_key\" = \"$icinga2_global_macros->{$global_macro_2x_key}\","); } dump_config_line($icinga2_cfg, "}"); end_object_type_config_dump($icinga2_cfg); } sub dump_cfg_obj_2x { my $icinga2_cfg = shift; my $cfg_obj_2x = shift; dump_hosts_2x($icinga2_cfg, $cfg_obj_2x); dump_services_2x($icinga2_cfg, $cfg_obj_2x); dump_users_2x($icinga2_cfg, $cfg_obj_2x); dump_notifications_2x($icinga2_cfg, $cfg_obj_2x); dump_timeperiods_2x($icinga2_cfg, $cfg_obj_2x); dump_groups_2x($icinga2_cfg, $cfg_obj_2x); dump_commands_2x($icinga2_cfg, $cfg_obj_2x); } sub dump_hosts_2x { my $icinga2_cfg = shift; my $cfg_obj_2x = shift; start_object_type_config_dump($icinga2_cfg, 'hosts'); #say Dumper($icinga2_cfg); foreach my $host_2x_key (keys %{@$cfg_obj_2x{'host'}}) { my $host_2x = @$cfg_obj_2x{'host'}->{$host_2x_key}; #say Dumper($host_2x); #say "==============\n"; # function decides itsself if object or template Icinga2::ExportIcinga2Cfg::dump_host_2x($icinga2_cfg, $host_2x); } end_object_type_config_dump($icinga2_cfg); } sub dump_services_2x { my $icinga2_cfg = shift; my $cfg_obj_2x = shift; start_object_type_config_dump($icinga2_cfg, 'services'); foreach my $service_2x_key (keys %{@$cfg_obj_2x{'service'}}) { my $service_2x = @$cfg_obj_2x{'service'}->{$service_2x_key}; Icinga2::ExportIcinga2Cfg::dump_service_2x($icinga2_cfg, $service_2x); } end_object_type_config_dump($icinga2_cfg); } sub dump_users_2x { my $icinga2_cfg = shift; my $cfg_obj_2x = shift; start_object_type_config_dump($icinga2_cfg, 'users'); foreach my $user_2x_key (keys %{@$cfg_obj_2x{'user'}}) { my $user_2x = @$cfg_obj_2x{'user'}->{$user_2x_key}; Icinga2::ExportIcinga2Cfg::dump_user_2x($icinga2_cfg, $user_2x); } end_object_type_config_dump($icinga2_cfg); } sub dump_notifications_2x { my $icinga2_cfg = shift; my $cfg_obj_2x = shift; start_object_type_config_dump($icinga2_cfg, 'notifications'); foreach my $notification_2x_key (keys %{@$cfg_obj_2x{'notification'}}) { my $notification_2x = @$cfg_obj_2x{'notification'}->{$notification_2x_key}; Icinga2::ExportIcinga2Cfg::dump_notification_2x($icinga2_cfg, $notification_2x); } end_object_type_config_dump($icinga2_cfg); } sub dump_timeperiods_2x { my $icinga2_cfg = shift; my $cfg_obj_2x = shift; start_object_type_config_dump($icinga2_cfg, 'timeperiods'); foreach my $timeperiod_2x_key (keys %{@$cfg_obj_2x{'timeperiod'}}) { my $timeperiod_2x = @$cfg_obj_2x{'timeperiod'}->{$timeperiod_2x_key}; Icinga2::ExportIcinga2Cfg::dump_timeperiod_2x($icinga2_cfg, $timeperiod_2x); } end_object_type_config_dump($icinga2_cfg); } # XXX maybe split later sub dump_groups_2x { my $icinga2_cfg = shift; my $cfg_obj_2x = shift; start_object_type_config_dump($icinga2_cfg, 'groups'); if (!@$cfg_obj_2x{'hostgroup'}) { goto SKIP_HOSTGROUPS; } foreach my $hostgroup_2x_key (keys %{@$cfg_obj_2x{'hostgroup'}}) { my $hostgroup_2x = @$cfg_obj_2x{'hostgroup'}->{$hostgroup_2x_key}; Icinga2::ExportIcinga2Cfg::dump_group_2x($icinga2_cfg, $hostgroup_2x); } SKIP_HOSTGROUPS: if (!@$cfg_obj_2x{'servicegroup'}) { goto SKIP_SERVICEGROUPS; } foreach my $servicegroup_2x_key (keys %{@$cfg_obj_2x{'servicegroup'}}) { my $servicegroup_2x = @$cfg_obj_2x{'servicegroup'}->{$servicegroup_2x_key}; Icinga2::ExportIcinga2Cfg::dump_group_2x($icinga2_cfg, $servicegroup_2x); } SKIP_SERVICEGROUPS: if (!@$cfg_obj_2x{'usergroup'}) { goto SKIP_USERGROUPS; } foreach my $usergroup_2x_key (keys %{@$cfg_obj_2x{'usergroup'}}) { my $usergroup_2x = @$cfg_obj_2x{'usergroup'}->{$usergroup_2x_key}; Icinga2::ExportIcinga2Cfg::dump_group_2x($icinga2_cfg, $usergroup_2x); } SKIP_USERGROUPS: end_object_type_config_dump($icinga2_cfg); } sub dump_commands_2x { my $icinga2_cfg = shift; my $cfg_obj_2x = shift; start_object_type_config_dump($icinga2_cfg, 'commands'); foreach my $command_2x_key (keys %{@$cfg_obj_2x{'command'}}) { my $command_2x = @$cfg_obj_2x{'command'}->{$command_2x_key}; Icinga2::ExportIcinga2Cfg::dump_command_2x($icinga2_cfg, $command_2x); } end_object_type_config_dump($icinga2_cfg); } ################################################################################ # DUMP OBJECT 2.x ################################################################################ sub dump_service_2x { my $icinga2_cfg = shift; my $service_2x = shift; my $object_type = "object"; # object or template my $service_description = $service_2x->{__I2CONVERT_SERVICEDESCRIPTION}; # only dump templates, the objects will be directly created in host objects if ($service_2x->{__I2CONVERT_IS_TEMPLATE} == 0) { return; } #say Dumper($host_2x); if ($service_2x->{__I2CONVERT_IS_TEMPLATE} == 1) { $object_type = "template"; $service_description = $service_2x->{'__I2CONVERT_TEMPLATE_NAME'}; } #################################################### # start, inherit from template? #################################################### if (defined($service_2x->{'__I2CONVERT_USES_TEMPLATE'}) && $service_2x->{'__I2CONVERT_USES_TEMPLATE'} == 1) { my $service_2x_templates = join '", "', @{$service_2x->{'__I2CONVERT_TEMPLATE_NAMES'}}; dump_config_line($icinga2_cfg, "$object_type Service \"$service_description\" inherits \"$service_2x_templates\" {"); } else { dump_config_line($icinga2_cfg, "$object_type Service \"$service_description\" {"); } #################################################### # display_name #################################################### if(defined($service_2x->{'display_name'})) { dump_config_line($icinga2_cfg, "\tdisplay_name = \"$service_2x->{'display_name'}\","); } #################################################### # macros #################################################### if(defined($service_2x->{'__I2CONVERT_MACROS'}) && $service_2x->{'__I2CONVERT_MACROS'} != 0) { dump_config_line($icinga2_cfg, "\tmacros = {"); foreach my $macro_key (keys %{$service_2x->{'__I2CONVERT_MACROS'}}) { next if $macro_key =~ /USER/; dump_config_line($icinga2_cfg, "\t\t$macro_key = \"$service_2x->{'__I2CONVERT_MACROS'}->{$macro_key}\","); } dump_config_line($icinga2_cfg, "\t},"); } dump_config_line($icinga2_cfg, ""); #################################################### # check command #################################################### if(defined($service_2x->{'__I2_CONVERT_CHECKCOMMAND_NAME'})) { dump_config_line($icinga2_cfg, "\tcheck_command = \"$service_2x->{'__I2_CONVERT_CHECKCOMMAND_NAME'}\","); } #################################################### # event command #################################################### if(defined($service_2x->{'__I2_CONVERT_EVENTCOMMAND_NAME'})) { dump_config_line($icinga2_cfg, "\tevent_command = \"$service_2x->{'__I2_CONVERT_EVENTCOMMAND_NAME'}\","); } #################################################### # servicegroups #################################################### if(defined($service_2x->{'servicegroups'}) && scalar(@{$service_2x->{'servicegroups'}}) > 0) { #say Dumper($service_2x->{'servicegroups'}); my $servicegroups = join '", "', @{$service_2x->{'servicegroups'}}; if ($service_2x->{'__I2_CONVERT_SG_ADD'} == 1) { dump_config_line($icinga2_cfg, "\tservicegroups += [ \"$servicegroups\" ],"); } else { dump_config_line($icinga2_cfg, "\tservicegroups = [ \"$servicegroups\" ],"); } #say Dumper($service_description); #say Dumper($service_2x->{'servicegroups'}); } #################################################### # servicedependencies (1.x deps) #################################################### if(defined($service_2x->{'__I2CONVERT_PARENT_SERVICES'})) { dump_config_line($icinga2_cfg, "\tservicedependencies = ["); #say Dumper($service_2x); # this is a hash with keys foreach my $servicedep_key (keys %{$service_2x->{'__I2CONVERT_PARENT_SERVICES'}}) { my $servicedep = $service_2x->{'__I2CONVERT_PARENT_SERVICES'}->{$servicedep_key}; dump_config_line($icinga2_cfg, "\t\t{ host = \"$servicedep->{'host'}\", service = \"$servicedep->{'service'}\" },"); } dump_config_line($icinga2_cfg, "\t],"); } #################################################### # notifications #################################################### if(defined($service_2x->{'__I2CONVERT_NOTIFICATIONS'})) { #say Dumper ($service_2x->{'__I2CONVERT_NOTIFICATIONS'}); # this is an array of notification objects foreach my $service_notification_hash (@{$service_2x->{'__I2CONVERT_NOTIFICATIONS'}}) { #say Dumper($service_notification_hash); # this is a hash by unique key of the notification template, but all further attributes are seperatedly available too foreach my $service_notification_key (keys %{$service_notification_hash}) { my $service_notification = $service_notification_hash->{$service_notification_key}; #say Dumper($service_notification); # skip everything not related to service notifications next if ($service_notification->{'type'} ne 'service'); dump_config_line($icinga2_cfg, "\tnotifications[\"$service_notification->{'name'}\"] = {"); if (defined ($service_notification->{'templates'}) && @{$service_notification->{'templates'}} > 0) { my $service_notification_templates = join '", "', @{$service_notification->{'templates'}}; dump_config_line($icinga2_cfg, "\t\ttemplates = [ \"$service_notification_templates\" ],"); } if(defined($service_notification->{'users'}) && @{$service_notification->{'users'}} > 0) { my $service_users = join '", "', @{$service_notification->{'users'}}; dump_config_line($icinga2_cfg, "\t\tusers = [ \"$service_users\" ],"); } # this is set for escalations if(defined($service_notification->{'__I2CONVERT_NOTIFICATION_TIMES'}) && $service_notification->{'__I2CONVERT_NOTIFICATION_TIMES'} != 0) { dump_config_line($icinga2_cfg, "\t\ttimes = {"); dump_config_line($icinga2_cfg, "\t\t\tbegin = $service_notification->{'__I2CONVERT_NOTIFICATION_TIMES'}->{'begin'},"); dump_config_line($icinga2_cfg, "\t\t\tend = $service_notification->{'__I2CONVERT_NOTIFICATION_TIMES'}->{'end'}"); dump_config_line($icinga2_cfg, "\t\t},"); } dump_config_line($icinga2_cfg, "\t},"); } } } if(defined($service_2x->{'notification_period'})) { dump_config_line($icinga2_cfg, "\tnotification_period = \"$service_2x->{'notification_period'}\","); } if(defined($service_2x->{'notification_interval'})) { dump_config_line($icinga2_cfg, "\tnotification_interval = $service_2x->{'notification_interval'},"); } if(defined($service_2x->{'notifications_enabled'})) { dump_config_line($icinga2_cfg, "\tenable_notifications = $service_2x->{'notifications_enabled'},"); } if(defined($service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'})) { #say Dumper($service_2x); foreach my $by (keys %{$service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}}) { next if !@{$service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}; my $notification_filter; if (grep /0/, @{$service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}) { $notification_filter = 0; } else { $notification_filter = "(". (join ' | ', @{$service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}) .")"; } dump_config_line($icinga2_cfg, "\tnotification_".$by."_filter = $notification_filter,"); } } #################################################### # other service attributes, if set #################################################### if(defined($service_2x->{'check_interval'})) { dump_config_line($icinga2_cfg, "\tcheck_interval = $service_2x->{'check_interval'},"); } if(defined($service_2x->{'retry_interval'})) { dump_config_line($icinga2_cfg, "\tretry_interval = $service_2x->{'retry_interval'},"); } if(defined($service_2x->{'max_check_attempts'})) { dump_config_line($icinga2_cfg, "\tmax_check_attempts = $service_2x->{'max_check_attempts'},"); } if(defined($service_2x->{'check_period'})) { dump_config_line($icinga2_cfg, "\tcheck_period = \"$service_2x->{'check_period'}\","); } if(defined($service_2x->{'volatile'})) { dump_config_line($icinga2_cfg, "\tvolatile = $service_2x->{'volatile'},"); } if(defined($service_2x->{'active_checks_enabled'})) { dump_config_line($icinga2_cfg, "\tenable_active_checks = $service_2x->{'active_checks_enabled'},"); } if(defined($service_2x->{'passive_checks_enabled'})) { dump_config_line($icinga2_cfg, "\tenable_passive_checks = $service_2x->{'passive_checks_enabled'},"); } if(defined($service_2x->{'flap_detection_enabled'})) { dump_config_line($icinga2_cfg, "\tenable_flapping = $service_2x->{'flap_detection_enabled'},"); } #################################################### # custom attr #################################################### if(defined($service_2x->{'__I2CONVERT_CUSTOM_ATTR'}) && $service_2x->{'__I2CONVERT_CUSTOM_ATTR'} != 0) { dump_config_line($icinga2_cfg, "\tcustom = {"); foreach my $custom_key (keys %{$service_2x->{'__I2CONVERT_CUSTOM_ATTR'}}) { dump_config_line($icinga2_cfg, "\t\t$custom_key = \"$service_2x->{'__I2CONVERT_CUSTOM_ATTR'}->{$custom_key}\","); } dump_config_line($icinga2_cfg, "\t},"); } dump_config_line($icinga2_cfg, ""); dump_config_line($icinga2_cfg, "}"); dump_config_line($icinga2_cfg, "\n"); } sub dump_host_2x { my $icinga2_cfg = shift; my $host_2x = shift; my $object_type = "object"; # object or template my $host_name = $host_2x->{'host_name'}; # default, may be changed for templates #say Dumper($host_2x); if ($host_2x->{__I2CONVERT_IS_TEMPLATE} == 1) { $object_type = "template"; $host_name = $host_2x->{'__I2CONVERT_TEMPLATE_NAME'}; } #################################################### # start, inherit from template? #################################################### if (defined($host_2x->{'__I2CONVERT_USES_TEMPLATE'}) && $host_2x->{'__I2CONVERT_USES_TEMPLATE'} == 1) { my $host_2x_templates = join '", "', @{$host_2x->{'__I2CONVERT_TEMPLATE_NAMES'}}; dump_config_line($icinga2_cfg, "$object_type Host \"$host_name\" inherits \"$host_2x_templates\" {"); } else { dump_config_line($icinga2_cfg, "$object_type Host \"$host_name\" {"); } #################################################### # display_name #################################################### if(defined($host_2x->{'display_name'})) { dump_config_line($icinga2_cfg, "\tdisplay_name = \"$host_2x->{'display_name'}\","); } #################################################### # macros #################################################### dump_config_line($icinga2_cfg, ""); if(defined($host_2x->{'__I2CONVERT_MACROS'}) && $host_2x->{'__I2CONVERT_MACROS'} != 0) { dump_config_line($icinga2_cfg, "\tmacros = {"); foreach my $macro_key (keys %{$host_2x->{'__I2CONVERT_MACROS'}}) { next if $macro_key =~ /USER/; dump_config_line($icinga2_cfg, "\t\t$macro_key = \"$host_2x->{'__I2CONVERT_MACROS'}->{$macro_key}\","); } dump_config_line($icinga2_cfg, "\t},"); } dump_config_line($icinga2_cfg, ""); #################################################### # hostgroups #################################################### if(defined($host_2x->{'hostgroups'})) { my $hostgroups = join '", "', @{$host_2x->{'hostgroups'}}; if ($host_2x->{'__I2_CONVERT_HG_ADD'} == 1) { dump_config_line($icinga2_cfg, "\thostgroups += [ \"$hostgroups\" ],"); } else { dump_config_line($icinga2_cfg, "\thostgroups = [ \"$hostgroups\" ],"); } } #################################################### # hostdependencies (1.x deps and parents combined) #################################################### if(defined($host_2x->{'__I2CONVERT_PARENT_HOSTNAMES'})) { my $hostdependency_hosts = join '", "', @{$host_2x->{'__I2CONVERT_PARENT_HOSTNAMES'}}; dump_config_line($icinga2_cfg, "\thostdependencies = [ \"$hostdependency_hosts\" ],"); } #################################################### # notifications #################################################### if(defined($host_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'})) { foreach my $by (keys %{$host_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}}) { next if !@{$host_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}; my $notification_filter; if (grep /0/, @{$host_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}) { $notification_filter = 0; } else { $notification_filter = "(". (join ' | ', @{$host_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}) .")"; } dump_config_line($icinga2_cfg, "\tnotification_".$by."_filter = $notification_filter,"); } } if(defined($host_2x->{'notification_period'})) { dump_config_line($icinga2_cfg, "\tnotification_period = \"$host_2x->{'notification_period'}\","); } if(defined($host_2x->{'notification_interval'})) { dump_config_line($icinga2_cfg, "\tnotification_interval = $host_2x->{'notification_interval'},"); } if(defined($host_2x->{'notifications_enabled'})) { dump_config_line($icinga2_cfg, "\tenable_notifications = $host_2x->{'notifications_enabled'},"); } #################################################### # other host attributes, if set #################################################### if(defined($host_2x->{'check_interval'})) { dump_config_line($icinga2_cfg, "\tcheck_interval = $host_2x->{'check_interval'},"); } if(defined($host_2x->{'retry_interval'})) { dump_config_line($icinga2_cfg, "\tretry_interval = $host_2x->{'retry_interval'},"); } if(defined($host_2x->{'max_check_attempts'})) { dump_config_line($icinga2_cfg, "\tmax_check_attempts = $host_2x->{'max_check_attempts'},"); } if(defined($host_2x->{'check_period'})) { dump_config_line($icinga2_cfg, "\tcheck_period = \"$host_2x->{'check_period'}\","); } if(defined($host_2x->{'active_checks_enabled'})) { dump_config_line($icinga2_cfg, "\tenable_active_checks = $host_2x->{'active_checks_enabled'},"); } if(defined($host_2x->{'passive_checks_enabled'})) { dump_config_line($icinga2_cfg, "\tenable_passive_checks = $host_2x->{'passive_checks_enabled'},"); } if(defined($host_2x->{'flap_detection_enabled'})) { dump_config_line($icinga2_cfg, "\tenable_flapping = $host_2x->{'flap_detection_enabled'},"); } #################################################### # custom attr #################################################### if(defined($host_2x->{'__I2CONVERT_CUSTOM_ATTR'}) && $host_2x->{'__I2CONVERT_CUSTOM_ATTR'} != 0) { dump_config_line($icinga2_cfg, "\tcustom = {"); foreach my $custom_key (keys %{$host_2x->{'__I2CONVERT_CUSTOM_ATTR'}}) { dump_config_line($icinga2_cfg, "\t\t$custom_key = \"$host_2x->{'__I2CONVERT_CUSTOM_ATTR'}->{$custom_key}\","); } dump_config_line($icinga2_cfg, "\t},"); } #################################################### # hostcheck #################################################### # this is magic, and must be set during conversion if(defined($host_2x->{'__I2CONVERT_HOSTCHECK'})) { dump_config_line($icinga2_cfg, "\thostcheck = \"$host_2x->{'__I2CONVERT_HOSTCHECK'}\","); } #################################################### # host with no services - valid configuration #################################################### if (!defined($host_2x->{'SERVICE'})) { dump_config_line($icinga2_cfg, "}"); dump_config_line($icinga2_cfg, "\n"); return; } #say Dumper($host_2x->{'SERVICE'}); #################################################### # now all services with templates #################################################### foreach my $service_2x_key (keys %{$host_2x->{'SERVICE'}}) { my $service_2x = $host_2x->{'SERVICE'}->{$service_2x_key}; dump_config_line($icinga2_cfg, "\tservices[\"$service_2x->{__I2CONVERT_SERVICEDESCRIPTION}\"] = {"); #################################################### # templates #################################################### if (defined($service_2x->{'__I2CONVERT_USES_TEMPLATE'}) && $service_2x->{'__I2CONVERT_USES_TEMPLATE'} == 1) { my $service_2x_templates = join '", "', @{$service_2x->{'__I2CONVERT_TEMPLATE_NAMES'}}; dump_config_line($icinga2_cfg, "\t\ttemplates = [ \"$service_2x_templates\" ],") } #################################################### # display_name #################################################### if(defined($service_2x->{'display_name'})) { dump_config_line($icinga2_cfg, "\t\tdisplay_name = \"$service_2x->{'display_name'}\","); } dump_config_line($icinga2_cfg, ""); #################################################### # macros #################################################### if(defined($service_2x->{'__I2CONVERT_MACROS'}) && $service_2x->{'__I2CONVERT_MACROS'} != 0) { dump_config_line($icinga2_cfg, "\t\tmacros = {"); foreach my $macro_key (keys %{$service_2x->{'__I2CONVERT_MACROS'}}) { next if $macro_key =~ /USER/; dump_config_line($icinga2_cfg, "\t\t\t$macro_key = \"$service_2x->{'__I2CONVERT_MACROS'}->{$macro_key}\","); } dump_config_line($icinga2_cfg, "\t\t},"); } #################################################### # check_command #################################################### if(defined($service_2x->{'__I2_CONVERT_CHECKCOMMAND_NAME'})) { dump_config_line($icinga2_cfg, "\t\tcheck_command = \"$service_2x->{'__I2_CONVERT_CHECKCOMMAND_NAME'}\","); } #################################################### # servicegroups #################################################### if(defined($service_2x->{'servicegroups'}) && scalar(@{$service_2x->{'servicegroups'}}) > 0) { #say Dumper($service_2x->{'servicegroups'}); my $servicegroups = join '", "', @{$service_2x->{'servicegroups'}}; if ($service_2x->{'__I2_CONVERT_SG_ADD'} == 1) { dump_config_line($icinga2_cfg, "\t\tservicegroups += [ \"$servicegroups\" ],"); } else { dump_config_line($icinga2_cfg, "\t\tservicegroups = [ \"$servicegroups\" ],"); } } #################################################### # notifications #################################################### if(defined($service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'})) { foreach my $by (keys %{$service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}}) { next if !@{$service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}; my $notification_filter; if (grep /0/, @{$service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}) { $notification_filter = 0; } else { $notification_filter = "(". (join ' | ', @{$service_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}) .")"; } dump_config_line($icinga2_cfg, "\tnotification_".$by."_filter = $notification_filter,"); } } if(defined($service_2x->{'__I2CONVERT_NOTIFICATIONS'})) { #say Dumper ($service_2x->{'__I2CONVERT_NOTIFICATIONS'}); # this is an array of notification objects foreach my $service_notification_hash (@{$service_2x->{'__I2CONVERT_NOTIFICATIONS'}}) { #say Dumper($service_notification_hash); # this is a hash by unique key of the notification template, but all further attributes are seperatedly available too foreach my $service_notification_key (keys %{$service_notification_hash}) { my $service_notification = $service_notification_hash->{$service_notification_key}; #say Dumper($service_notification); # skip everything not related to service notifications next if ($service_notification->{'type'} ne 'service'); dump_config_line($icinga2_cfg, "\t\tnotifications[\"$service_notification->{'name'}\"] = {"); if (defined ($service_notification->{'templates'}) && @{$service_notification->{'templates'}} > 0) { my $service_notification_templates = join '", "', @{$service_notification->{'templates'}}; dump_config_line($icinga2_cfg, "\t\t\ttemplates = [ \"$service_notification_templates\" ],"); } if(defined($service_notification->{'users'}) && @{$service_notification->{'users'}} > 0) { my $service_users = join '", "', @{$service_notification->{'users'}}; dump_config_line($icinga2_cfg, "\t\t\tusers = [ \"$service_users\" ],"); } # this is set for escalations if(defined($service_notification->{'__I2CONVERT_NOTIFICATION_TIMES'}) && $service_notification->{'__I2CONVERT_NOTIFICATION_TIMES'} != 0) { dump_config_line($icinga2_cfg, "\t\t\ttimes = {"); dump_config_line($icinga2_cfg, "\t\t\t\tbegin = $service_notification->{'__I2CONVERT_NOTIFICATION_TIMES'}->{'begin'},"); dump_config_line($icinga2_cfg, "\t\t\t\tend = $service_notification->{'__I2CONVERT_NOTIFICATION_TIMES'}->{'end'}"); dump_config_line($icinga2_cfg, "\t\t\t},"); } dump_config_line($icinga2_cfg, "\t\t},"); } } } if(defined($host_2x->{'__I2CONVERT_NOTIFICATIONS'}) && $host_2x->{'__I2CONVERT_HOSTCHECK'} eq $service_2x->{__I2CONVERT_SERVICEDESCRIPTION}) { #say Dumper ($host_2x->{'__I2CONVERT_NOTIFICATIONS'}); # this is an array of notification objects foreach my $host_notification_hash (@{$host_2x->{'__I2CONVERT_NOTIFICATIONS'}}) { #say Dumper($host_notification_hash); # this is a hash by unique key of the notification template, but all further attributes are seperatedly available too foreach my $host_notification_key (keys %{$host_notification_hash}) { my $host_notification = $host_notification_hash->{$host_notification_key}; #say Dumper($host_notification); # skip everything not related to host notifications next if ($host_notification->{'type'} ne 'host'); dump_config_line($icinga2_cfg, "\t\tnotifications[\"$host_notification->{'name'}\"] = {"); if (defined ($host_notification->{'templates'}) && @{$host_notification->{'templates'}} > 0) { my $host_notification_templates = join '", "', @{$host_notification->{'templates'}}; dump_config_line($icinga2_cfg, "\t\t\ttemplates = [ \"$host_notification_templates\" ],"); } if(defined($host_notification->{'users'}) && @{$host_notification->{'users'}} > 0) { my $host_users = join '", "', @{$host_notification->{'users'}}; dump_config_line($icinga2_cfg, "\t\t\tusers = [ \"$host_users\" ],"); } dump_config_line($icinga2_cfg, "\t\t},"); } } } if(defined($service_2x->{'notification_period'})) { dump_config_line($icinga2_cfg, "\t\tnotification_period = \"$service_2x->{'notification_period'}\","); } if(defined($service_2x->{'notification_interval'})) { dump_config_line($icinga2_cfg, "\t\tnotification_interval = $service_2x->{'notification_interval'},"); } if(defined($service_2x->{'notifications_enabled'})) { dump_config_line($icinga2_cfg, "\tenable_notifications = $service_2x->{'notifications_enabled'},"); } #################################################### # other service attributes, if set #################################################### if(defined($service_2x->{'check_interval'})) { dump_config_line($icinga2_cfg, "\t\tcheck_interval = $service_2x->{'check_interval'},"); } if(defined($service_2x->{'retry_interval'})) { dump_config_line($icinga2_cfg, "\t\tretry_interval = $service_2x->{'retry_interval'},"); } if(defined($service_2x->{'max_check_attempts'})) { dump_config_line($icinga2_cfg, "\t\tmax_check_attempts = $service_2x->{'max_check_attempts'},"); } if(defined($service_2x->{'check_period'})) { dump_config_line($icinga2_cfg, "\tcheck_period = \"$service_2x->{'check_period'}\","); } if(defined($service_2x->{'active_checks_enabled'})) { dump_config_line($icinga2_cfg, "\t\tenable_active_checks = $service_2x->{'active_checks_enabled'},"); } if(defined($service_2x->{'passive_checks_enabled'})) { dump_config_line($icinga2_cfg, "\t\tenable_passive_checks = $service_2x->{'passive_checks_enabled'},"); } if(defined($service_2x->{'flap_detection_enabled'})) { dump_config_line($icinga2_cfg, "\t\tenable_flapping = $service_2x->{'flap_detection_enabled'},"); } #################################################### # custom attr #################################################### if(defined($service_2x->{'__I2CONVERT_CUSTOM_ATTR'}) && $service_2x->{'__I2CONVERT_CUSTOM_ATTR'} != 0) { dump_config_line($icinga2_cfg, "\t\tcustom = {"); foreach my $custom_key (keys %{$service_2x->{'__I2CONVERT_CUSTOM_ATTR'}}) { dump_config_line($icinga2_cfg, "\t\t\t$custom_key = \"$service_2x->{'__I2CONVERT_CUSTOM_ATTR'}->{$custom_key}\","); } dump_config_line($icinga2_cfg, "\t\t},"); } dump_config_line($icinga2_cfg, "\t},"); dump_config_line($icinga2_cfg, ""); } dump_config_line($icinga2_cfg, "}"); dump_config_line($icinga2_cfg, "\n"); } sub dump_user_2x { my $icinga2_cfg = shift; my $user_2x = shift; my $object_type = "object"; # object or template my $user_name = $user_2x->{'contact_name'}; # default, may be changed for templates #say Dumper($user_2x); if ($user_2x->{__I2CONVERT_IS_TEMPLATE} == 1) { $object_type = "template"; $user_name = $user_2x->{'__I2CONVERT_TEMPLATE_NAME'}; } #################################################### # start, inherit from template? #################################################### if (defined($user_2x->{'__I2CONVERT_USES_TEMPLATE'}) && $user_2x->{'__I2CONVERT_USES_TEMPLATE'} == 1) { my $user_2x_templates = join '", "', @{$user_2x->{'__I2CONVERT_TEMPLATE_NAMES'}}; dump_config_line($icinga2_cfg, "$object_type User \"$user_name\" inherits \"$user_2x_templates\" {"); } else { dump_config_line($icinga2_cfg, "$object_type User \"$user_name\" {"); } if(defined($user_2x->{'display_name'})) { dump_config_line($icinga2_cfg, "\tdisplay_name = \"$user_2x->{'display_name'}\","); } #################################################### # macros #################################################### if(defined($user_2x->{'__I2CONVERT_MACROS'}) && $user_2x->{'__I2CONVERT_MACROS'} != 0) { dump_config_line($icinga2_cfg, "\tmacros = {"); foreach my $macro_key (keys %{$user_2x->{'__I2CONVERT_MACROS'}}) { next if $macro_key =~ /USER/; dump_config_line($icinga2_cfg, "\t\t$macro_key = \"$user_2x->{'__I2CONVERT_MACROS'}->{$macro_key}\","); } dump_config_line($icinga2_cfg, "\t},"); } dump_config_line($icinga2_cfg, ""); #################################################### # notifications #################################################### if(defined($user_2x->{'notification_period'})) { dump_config_line($icinga2_cfg, "\tnotification_period = \"$user_2x->{'notification_period'}\","); } if(defined($user_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'})) { foreach my $by (keys %{$user_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}}) { next if !@{$user_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}; my $notification_filter; if (grep /0/, @{$user_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}) { $notification_filter = 0; } else { $notification_filter = "(". (join ' | ', @{$user_2x->{'__I2CONVERT_NOTIFICATION_FILTERS'}->{$by}}) .")"; } dump_config_line($icinga2_cfg, "\tnotification_".$by."_filter = $notification_filter,"); } } #################################################### # usergroups #################################################### if(defined($user_2x->{'usergroups'})) { #say Dumper($user_2x->{'usergroups'}); my $usergroups = join '", "', @{$user_2x->{'usergroups'}}; if ($user_2x->{'__I2_CONVERT_UG_ADD'} == 1) { dump_config_line($icinga2_cfg, "\tgroups += [ \"$usergroups\" ],"); } else { dump_config_line($icinga2_cfg, "\tgroups = [ \"$usergroups\" ],"); } } #################################################### # custom attr #################################################### if(defined($user_2x->{'__I2CONVERT_CUSTOM_ATTR'}) && $user_2x->{'__I2CONVERT_CUSTOM_ATTR'} != 0) { dump_config_line($icinga2_cfg, "\tcustom = {"); foreach my $custom_key (keys %{$user_2x->{'__I2CONVERT_CUSTOM_ATTR'}}) { dump_config_line($icinga2_cfg, "\t\t$custom_key = \"$user_2x->{'__I2CONVERT_CUSTOM_ATTR'}->{$custom_key}\","); } dump_config_line($icinga2_cfg, "\t},"); } dump_config_line($icinga2_cfg, ""); dump_config_line($icinga2_cfg, "}"); dump_config_line($icinga2_cfg, "\n"); } sub dump_notification_2x { my $icinga2_cfg = shift; my $notification_2x = shift; my $object_type = "object"; # object or template my $notification_name = $notification_2x->{'__I2CONVERT_NOTIFICATION_NAME'}; # default, may be changed for templates #say Dumper($notification_2x); if ($notification_2x->{__I2CONVERT_IS_TEMPLATE} == 1) { $object_type = "template"; $notification_name = $notification_2x->{'__I2CONVERT_NOTIFICATION_TEMPLATE_NAME'}; } return if (!defined($notification_name)); #################################################### # start, inherit from template? #################################################### if (defined($notification_2x->{'__I2CONVERT_USES_TEMPLATE'}) && $notification_2x->{'__I2CONVERT_USES_TEMPLATE'} == 1) { my $notification_2x_templates = join '", "', @{$notification_2x->{'__I2CONVERT_TEMPLATE_NAMES'}}; dump_config_line($icinga2_cfg, "$object_type Notification \"$notification_name\" inherits \"$notification_2x_templates\" {"); } else { dump_config_line($icinga2_cfg, "$object_type Notification \"$notification_name\" {"); } if(defined($notification_2x->{'display_name'})) { dump_config_line($icinga2_cfg, "\tdisplay_name = \"$notification_2x->{'display_name'}\","); } if(defined($notification_2x->{'__I2CONVERT_NOTIFICATION_COMMAND'})) { #say Dumper($notifications_2x->{'notification_command'}); dump_config_line($icinga2_cfg, "\tnotification_command = \"$notification_2x->{'__I2CONVERT_NOTIFICATION_COMMAND'}\","); } if(defined($notification_2x->{'export_macros'})) { #say Dumper($notification_2x->{'export_macros'}); my $export_macros = join '",\n"', @{$notification_2x->{'export_macros'}}; dump_config_line($icinga2_cfg, "\texport_macros = [ \"$export_macros\" ],"); } if(defined($notification_2x->{'users'}) && @{$notification_2x->{'users'}} > 0) { my $service_users = join '", "', @{$notification_2x->{'users'}}; dump_config_line($icinga2_cfg, "\tusers = [ \"$service_users\" ],"); } # this is set for escalations if(defined($notification_2x->{'__I2CONVERT_NOTIFICATION_TIMES'}) && $notification_2x->{'__I2CONVERT_NOTIFICATION_TIMES'} != 0) { dump_config_line($icinga2_cfg, "\ttimes = {"); dump_config_line($icinga2_cfg, "\t\tbegin = $notification_2x->{'__I2CONVERT_NOTIFICATION_TIMES'}->{'begin'},"); dump_config_line($icinga2_cfg, "\t\tend = $notification_2x->{'__I2CONVERT_NOTIFICATION_TIMES'}->{'end'}"); dump_config_line($icinga2_cfg, "\t},"); } dump_config_line($icinga2_cfg, ""); dump_config_line($icinga2_cfg, "}"); dump_config_line($icinga2_cfg, "\n"); } sub dump_timeperiod_2x { my $icinga2_cfg = shift; my $object_type = "object"; # object or template my $timeperiod_2x = shift; my $timeperiod_name = $timeperiod_2x->{'timeperiod_name'}; #say Dumper($timeperiod_2x); if ($timeperiod_2x->{__I2CONVERT_IS_TEMPLATE} == 1) { $object_type = "template"; $timeperiod_name = $timeperiod_2x->{'__I2CONVERT_TEMPLATE_NAME'}; } #################################################### # start, inherit from template? #################################################### if (defined($timeperiod_2x->{'__I2CONVERT_USES_TEMPLATE'}) && $timeperiod_2x->{'__I2CONVERT_USES_TEMPLATE'} == 1) { my $timeperiod_2x_templates = join '", "', @{$timeperiod_2x->{'__I2CONVERT_TEMPLATE_NAMES'}}; dump_config_line($icinga2_cfg, "$object_type TimePeriod \"$timeperiod_name\" inherits \"$timeperiod_2x_templates\" {"); } else { dump_config_line($icinga2_cfg, "$object_type TimePeriod \"$timeperiod_name\" {"); } # display_name is seperated at first position if(defined($timeperiod_2x->{'display_name'})) { dump_config_line($icinga2_cfg, "\tdisplay_name = \"$timeperiod_2x->{'display_name'}\","); } dump_config_line($icinga2_cfg, "\tranges = {"); # dump all possible keys (there's no fixed string attr here) foreach my $key (sort (keys %{$timeperiod_2x})) { if ($key !~ /__I2CONVERT/ && $key ne 'alias' && $key ne 'name' && $key ne 'timeperiod_name' && $key ne 'display_name' && $key ne 'use' ) { dump_config_line($icinga2_cfg, "\t\t\"$key\" \t= \"$timeperiod_2x->{$key}\","); } } dump_config_line($icinga2_cfg, "\t},"); dump_config_line($icinga2_cfg, ""); dump_config_line($icinga2_cfg, "}"); dump_config_line($icinga2_cfg, "\n"); } sub dump_group_2x { my $icinga2_cfg = shift; my $group_2x = shift; my $group_name_attr = $group_2x->{__I2CONVERT_TYPE} . "_name"; my $group_name = $group_2x->{$group_name_attr}; my $group_type = ucfirst("$group_2x->{__I2CONVERT_TYPE}"); $group_type =~ s/group/Group/; #say Dumper($group_2x); dump_config_line($icinga2_cfg, "object $group_type \"$group_name\" {"); if(defined($group_2x->{'display_name'})) { dump_config_line($icinga2_cfg, "\tdisplay_name = \"$group_2x->{'display_name'}\","); } #################################################### # custom attr #################################################### if(defined($group_2x->{'__I2CONVERT_CUSTOM_ATTR'}) && $group_2x->{'__I2CONVERT_CUSTOM_ATTR'} != 0) { dump_config_line($icinga2_cfg, "\tcustom = {"); foreach my $custom_key (keys %{$group_2x->{'__I2CONVERT_CUSTOM_ATTR'}}) { dump_config_line($icinga2_cfg, "\t\t$custom_key = \"$group_2x->{'__I2CONVERT_CUSTOM_ATTR'}->{$custom_key}\","); } dump_config_line($icinga2_cfg, "\t},"); } dump_config_line($icinga2_cfg, ""); dump_config_line($icinga2_cfg, "}"); dump_config_line($icinga2_cfg, "\n"); } sub dump_command_2x { my $icinga2_cfg = shift; my $command_2x = shift; my $command_name = $command_2x->{'__I2CONVERT_COMMAND_NAME'}; my $command_line = $command_2x->{'__I2CONVERT_COMMAND_LINE'}; my $command_type = ucfirst("$command_2x->{__I2CONVERT_COMMAND_TYPE}Command"); my $object_type = "object"; #say Dumper($command_2x); # skip used commands if ($command_2x->{'__I2_CONVERT_NOTIFICATION_COMMAND_USED'} == 1) { say "Skipping already processed notification command" . Dumper($command_2x); return; } if ($command_2x->{__I2CONVERT_IS_TEMPLATE} == 1) { $object_type = "template"; $command_name = $command_2x->{'__I2CONVERT_TEMPLATE_NAME'}; } #################################################### # start, inherit from template? #################################################### if (defined($command_2x->{'__I2CONVERT_USES_TEMPLATE'}) && $command_2x->{'__I2CONVERT_USES_TEMPLATE'} == 1) { my $command_2x_templates = join '", "', @{$command_2x->{'__I2CONVERT_TEMPLATE_NAMES'}}; dump_config_line($icinga2_cfg, "$object_type $command_type \"$command_name\" inherits \"$command_2x_templates\" {"); } else { dump_config_line($icinga2_cfg, "$object_type $command_type \"$command_name\" {"); } #################################################### # attributes #################################################### if(defined($command_2x->{'display_name'})) { dump_config_line($icinga2_cfg, "\tdisplay_name = \"$command_2x->{'display_name'}\","); } if(defined($command_line)) { dump_config_line($icinga2_cfg, "\tcommand = \"$command_line\","); } #################################################### # macros #################################################### if(defined($command_2x->{'__I2CONVERT_COMMAND_MACROS'}) && $command_2x->{'__I2CONVERT_COMMAND_MACROS'} != 0) { dump_config_line($icinga2_cfg, "\tmacros = {"); foreach my $cmd_arg (keys %{$command_2x->{'__I2CONVERT_COMMAND_MACROS'}}) { next if $cmd_arg =~ /ARG\d+/; dump_config_line($icinga2_cfg, "\t\t$cmd_arg = \"$command_2x->{'__I2CONVERT_COMMAND_MACROS'}->{$cmd_arg}\","); } dump_config_line($icinga2_cfg, "\t},"); } dump_config_line($icinga2_cfg, ""); dump_config_line($icinga2_cfg, "}"); dump_config_line($icinga2_cfg, "\n"); } 1; __END__ # vi: sw=4 ts=4 expandtab :