nagios/mergecfg

237 lines
5.2 KiB
Text
Raw Normal View History

2012-02-01 20:57:29 +04:00
#!/usr/bin/perl -w
#
# mergecfg v0.11 --
# Merge Nagios object definitions into templates
#
# Copyright (C) 2003,2004 by Kenytt Avery, Willing Minds LLC
# (kavery@willingminds.com)
#
# Willing Minds LLC
# System and Network Infrastructure Experts
# 4095 E. La Palma Ave, Ste J
# Anaheim, CA 92807-1704
#
# +1 949 623 9854
#
# http://www.willingminds.com/
#
# Nagios is a registered trademark of Ethan Galstad.
#
# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
# Merges object definitions with duplicate attributes such as
#
# define host {
# host_name web1
# alias Web1 External Web Server
# address 192.168.1.1
# max_check_attempts 10
# notification_interval 120
# notification_options d,u,r
# notification_period 24x7
# notifications_enabled 1
# event_handler_enabled 1
# flap_detection_enabled 1
# process_perf_data 1
# retain_status_information 1
# retain_nonstatus_information 1
# }
#
# define host {
# host_name web2
# alias Web2 External Web Server
# address 192.168.1.2
# max_check_attempts 10
# notification_interval 120
# notification_options d,u,r
# notification_period 24x7
# notifications_enabled 1
# event_handler_enabled 1
# flap_detection_enabled 1
# process_perf_data 1
# retain_status_information 1
# retain_nonstatus_information 1
# }
#
# into templates and abbreviated object definitions such as
#
# define host {
# name template.host.1
# register 0
#
# max_check_attempts 10
# notification_interval 120
# notification_options d,u,r
# notification_period 24x7
# notifications_enabled 1
# event_handler_enabled 1
# flap_detection_enabled 1
# process_perf_data 1
# retain_status_information 1
# retain_nonstatus_information 1
# }
#
# define host {
# use template.host.1
#
# host_name web1
# alias Web1 External Web Server
# address 192.168.1.1
# }
#
# define host {
# use template.host.1
#
# host_name web2
# alias Web2 External Web Server
# address 192.168.1.2
# }
#
# The program currently merges services.cfg, hosts.cfg, and contacts.cfg.
#
# Add list-valued attributes to LISTVALS to merge other object definitions.
#
use strict;
use File::Basename;
use constant LISTVALS => qw( contact_name host_name alias address email pager );
sub listval { return grep { $_ eq $_[0] } LISTVALS; }
sub similar_objects {
my $o1 = shift;
my $o2 = shift;
my $match = 1;
for my $var (keys %{$o1}) {
next if listval $var;
if (not exists $o2->{$var} or $o1->{$var} ne $o2->{$var}) {
$match = 0;
last;
}
}
return $match;
}
if (@ARGV == 0 or @ARGV > 1) {
print STDERR <<EOF;
Nagios Config File Merger
Written by Kenytt Avery (kavery\@willingminds.com)
Last Modified: 01-15-2004
Usage: @{[basename $0]} <config file>
Object definitions currently supported are hosts, services, and contacts.
EOF
exit 0;
}
my $objects;
my $buffer;
while (<>) {
s/#.*//;
s/;.*//;
s/^\s+//;
s/\s+$//;
next unless length;
$buffer .= "$_\n";
}
my $type;
while ($buffer =~ /define\s+(\w+)\s*{(.*?)}/gs) {
$type = $1;
my $definition = $2;
my $object;
while ($definition =~ /\s*(\w+)\s+(.*)/g) {
my $var = $1;
my $value = $2;
if (listval $var) {
push(@{$object->{$var}}, $value);
} else {
$object->{$var} = $value;
}
}
push(@{$objects}, $object);
}
my $n = 1;
while (my $a = shift @{$objects}) {
next if exists $a->{MERGED};
for my $b (@{$objects}) {
next if exists $b->{MERGED};
if (similar_objects($a, $b)) {
for my $var (LISTVALS) {
push(@{$a->{$var}}, @{$b->{$var}}) if exists $a->{$var};
}
$b->{MERGED} = 1;
}
}
my $templatize = 0;
for my $var (keys %{$a}) {
if (ref $a->{$var} eq 'ARRAY') {
$templatize = (@{$a->{$var}} > 1);
last;
}
}
if ($templatize) {
my $template = (exists $a->{name})? $a->{name} : "template.$type." . $n++;
print "define $type {\n";
print "\tname\t$template\n";
print "\tregister\t0\n\n";
for my $var (sort keys %{$a}) {
unless (listval $var) {
print "\t$var\t$a->{$var}\n" unless $var eq 'name' or $var eq 'register';
delete $a->{$var};
}
}
print "}\n\n";
my $obj;
LOOP: for (;;) {
keys %{$a} or last LOOP;
for my $var (keys %{$a}) {
my $value = shift @{$a->{$var}} or last LOOP;
$obj->{$var} = $value;
}
print "define $type {\n";
print "\tuse\t$template\n\n";
for my $var (sort keys %{$obj}) {
print "\t$var\t$obj->{$var}\n";
}
print "}\n\n";
}
} else {
print "define $type {\n";
for my $var (sort keys %{$a}) {
if (ref $a->{$var} eq 'ARRAY') {
print "\t$var\t", join(', ', @{$a->{$var}}), "\n";
} else {
print "\t$var\t$a->{$var}\n";
}
}
print "}\n\n";
}
}