#!/usr/bin/ruby
-# Copyright (c) 2004, 2005, 2006, 2007, 2008 Peter Palfrader <peter@palfrader.org>
+# build nagios and nrpe config from a single master config file
+
+# Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 Peter Palfrader <peter@palfrader.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
require "yaml"
-ORG="debianorg"
-SHORTORG="do"
-CONTACTGROUP="debianadmin"
-GENERATED_PREFIX="/etc/NOREPLY/generated/nagios/"
+ORG="dsa"
+SHORTORG="dsa"
+GENERATED_PREFIX="./generated/"
nagios_filename = {};
-%w(hosts hostgroups services dependencies hostextinfo serviceextinfo).each{
+%w(hosts hostgroups services dependencies hostextinfo serviceextinfo servicegroups).each{
|x| nagios_filename[x] = GENERATED_PREFIX+"auto-#{x}.cfg"
}
nagios_filename['nrpe'] = GENERATED_PREFIX+"nrpe_#{ ORG }.cfg"
fd.puts
end
+def merge_contacts(host, service)
+ %w{contacts contact_groups}.each{ |k|
+ contacts = []
+ [host, service].each{ |source|
+ contacts.push source[k] if source.has_key?(k)
+ }
+ service[k] = contacts.join(",") unless contacts.empty?
+ }
+end
# Add the service definition service to hosts
# f is the file for service definitions, deps the file for dependencies
-def addService(hosts, service, files)
+def addService(hosts, service, files, servers)
set_if_unset service, 'use' , SERVICE_TEMPLATE_NAME
- set_complain_if_set service, 'host_name' , hosts.join(',') , 'Service', service['service_description']
set_if_unset service, 'max_check_attempts', MAX_CHECK_ATTEMPTS_DEFAULT
service['max_check_attempts'] = MAX_CHECK_ATTEMPTS_DEFAULT + service['max_check_attempts'] if service['max_check_attempts'] < 0
service['depends'] << NRPE_PROCESS_SERVICE unless service['service_description'] == NRPE_PROCESS_SERVICE # Depend on NRPE unless we are it
end
- print_block files['services'], 'service', service, %w(nrpe runfrom remotecheck
- depends
- hosts hostgroups excludehosts excludehostgroups)
+ hosts.each{ |host|
+ s = service.clone
+ set_complain_if_set s, 'host_name', host, 'Service', s['service_description']
+ merge_contacts(servers[host], s)
+
+ print_block files['services'], 'service', s, %w(nrpe runfrom remotecheck
+ depends
+ hosts hostgroups excludehosts excludehostgroups)
+ }
if service['depends']
service['depends'].each{ |prerequisite|
# create the "all" and "pingable" hostgroups
config['hostgroups']['all'] = {}
config['hostgroups']['all']['alias'] = "all servers"
+config['hostgroups']['all']['private'] = true
config['hostgroups']['pingable'] = {}
config['hostgroups']['pingable']['alias'] = "pingable servers"
+config['hostgroups']['pingable']['private'] = true
config['hostgroups'].each_pair{ |name, hg|
throw "Empty hostgroup or hostgroup #{name} not a hash" unless hg.kind_of?(Hash)
};
}
+config['servicegroups'] = {} unless config.has_key? 'servicegroups'
+
##############
# HOSTS
##############
# Handle hostextinfo
- config['hostgroups'][ server['_hostgroups'].first ]['_extinfo'].each_pair{ |k, v|
- # substitute hostname into the notes_url
- v = sprintf(v,name) if k == 'notes_url'
-
- set_if_unset server['_extinfo'], k ,v
- }
+ #config['hostgroups'][ server['_hostgroups'].first ]['_extinfo'].each_pair{ |k, v|
+ # find the first hostgroup that has extinfo
+ extinfo = server['_hostgroups'].collect{ |hgname | config['hostgroups'][hgname]['_extinfo'] }.delete_if{ |ei| ei.size == 0 }.first
+ if extinfo then
+ extinfo.each_pair do |k, v|
+ # substitute hostname into the notes_url
+ v = sprintf(v,name) if k == 'notes_url'
+
+ set_if_unset server['_extinfo'], k ,v
+ end
+ end
set_complain_if_set server['_extinfo'], 'host_name' , name, 'hostextinfo', name
set_if_unset server['_extinfo'], 'vrml_image' , server['_extinfo']['icon_image'] if server['_extinfo'].has_key?('icon_image')
set_complain_if_set hg, 'hostgroup_name', name , 'Hostgroup', name
set_complain_if_set hg, 'members' , hg['_memberlist'].join(","), 'Hostgroup', name
- set_if_unset hg, 'contact_groups', CONTACTGROUP
print_block files['hostgroups'], 'hostgroup', hg, %w()
}
# And append this new dependency
hostservice['depends'] << "#{ relay }:#{ NRPE_PROCESS_SERVICE }";
- addService( [ host ], hostservice, files)
+ addService( [ host ], hostservice, files, config['servers'])
}
elsif service['runfrom'] || service['remotecheck']
throw "runfrom and remotecheck must either appear both or not at all in service #{service['service_description']}"
throw "must not remotecheck without runfrom" if service['remotecheck']
else
- addService(hosts, service, files)
+ addService(hosts, service, files, config['servers'])
end
}
+
+##############
+# SERVICEGROUPS
+##############
+config['servicegroups'].each_pair{ |name, sg|
+ set_complain_if_set sg, 'servicegroup_name', name , 'Servicegroup', name
+
+ print_block files['servicegroups'], 'servicegroup', sg, %w()
+}
+
+
##############
# NRPE config file
##############