icinga2/tools/configconvert/Icinga2/ExportIcinga2Cfg.pm

1129 lines
47 KiB
Perl

=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 :