summaryrefslogtreecommitdiff
path: root/build-nagios
diff options
context:
space:
mode:
Diffstat (limited to 'build-nagios')
-rwxr-xr-xbuild-nagios227
1 files changed, 227 insertions, 0 deletions
diff --git a/build-nagios b/build-nagios
new file mode 100755
index 0000000..2d2c74b
--- /dev/null
+++ b/build-nagios
@@ -0,0 +1,227 @@
+#!/usr/bin/ruby
+
+# Copyright (c) 2004, 2005 Peter Palfrader <peter@palfrader.org>
+
+require "yaml"
+
+ORG="came"
+CONTACTGROUP="cameadmins"
+
+class Nrpe
+ def initialize
+ @checks = {}
+ end
+
+ def make_name( name, check )
+ name = name.tr_s("^a-zA-Z", "_").gsub("process", "ps")
+
+ result = "#{ ORG }_" + name[0,19]
+
+ hash = ''
+ skew = ''
+ while (@checks.has_key?(result + hash))
+ # hash it, so that we don't lose uniqeness by cutting it off
+ hash = (check+skew).crypt("$1$")
+ hash = hash[-5,5] # 5 chars are enough
+ hash.tr!("/", "_")
+ skew += ' ' # change it a bit so the hash changes
+ end
+ result += hash
+ return result # max of 32 or so chars
+ end
+
+ def add( name, check )
+ if @checks.has_value? check
+ @checks.each_pair{ |key, value|
+ return key if value == check
+ }
+ end
+ key = make_name(name, check)
+ @checks[ key ] = check
+ return key
+ end
+
+ def checks
+ return @checks
+ end
+end
+
+$nrpe = Nrpe.new()
+
+
+def warn (msg)
+ STDERR.puts msg
+end
+
+
+config = YAML::load( File.open( 'nagios-master.cfg' ) )
+
+%w{auto-hosts.cfg auto-hostgroups.cfg auto-services.cfg auto-dependencies.cfg}.each{ |file|
+ File.delete("#{file}") if FileTest.file?("#{file}")
+}
+
+#################################
+# create a few hostgroups
+#################################
+
+config['hostgroups'].each_value{ |hg|
+ hg['members'] = []
+}
+
+config['servers'].each_pair{ |name, server|
+ server['hostgroups'].split(/,/).each{ |hg|
+ hg.strip!
+ config['hostgroups'][hg]['members'] << name
+ };
+}
+
+# create all
+config['hostgroups']['all'] = {}
+config['hostgroups']['all']['alias'] = "all servers"
+config['hostgroups']['all']['members'] = []
+config['servers'].each_key{ |name|
+ config['hostgroups']['all']['members'] << name
+}
+
+
+
+#######
+# Hosts and Hostgroups
+f = File.new("auto-hosts.cfg", "w")
+config['servers'].each_pair{ |name, server|
+ f.puts "define host{"
+ f.puts " use generic-host"
+ f.puts " host_name #{ name }"
+ f.puts " alias #{ name }"
+ f.puts " address #{ server['ip'] }"
+ f.puts " check_command check-host-alive"
+ f.puts " parents #{ server['parents'] }" if server.has_key?('parents')
+ f.puts "}"
+ f.puts
+}
+
+f = File.new("auto-hostgroups.cfg", "w")
+config['hostgroups'].each_pair{ |name, hg|
+ next if hg['private']
+ f.puts "define hostgroup{"
+ f.puts " hostgroup_name #{ name }"
+ f.puts " alias #{ hg['alias'] }"
+ f.puts " contact_groups #{ CONTACTGROUP }"
+ f.puts " members "+hg['members'].join(",")
+ f.puts "}"
+}
+
+
+#######
+# Services and Dependencies
+def addService(hosts, service, f, deps)
+ hosts_comma = hosts.join(',')
+
+ f.puts "define service{"
+ f.puts " use generic-service"
+ f.puts " host_name #{ hosts_comma }"
+ f.puts " service_description #{ service['name'] }"
+ f.puts " check_command #{ service['check'] }" if service['check']
+ if service['nrpe']
+ check = $nrpe.add(service['name'], service['nrpe'])
+ f.puts " check_command #{ ORG }_check_nrpe!#{ check }"
+
+ service['depends'] = 'process - nrpe' unless service['depends'] or service['name'] == 'process - nrpe'
+ end
+ # put additional keys into services
+ service.each_pair{ |key, value|
+ # known keys:
+ next if %w(name check hosts nrpe remotecheck hostgroups excludehosts depends runfrom).include? key
+ f.puts " #{key} #{value}"
+
+ }
+ f.puts "}"
+
+ if service['depends']
+ service['depends'].each{ |prerequisite|
+ hosts.each{ |host|
+ prerequisite_host = host
+ pre = prerequisite
+ # split off a hostname if there's one
+ bananasplit = prerequisite.split(':')
+ if bananasplit.size == 2
+ prerequisite_host = bananasplit[0]
+ pre = bananasplit[1]
+ elsif bananasplit.size > 2
+ throw "Cannot prase prerequisite #{prerequisite} for service #{service['name']} into host:service"
+ end
+ deps.puts "define servicedependency{"
+ deps.puts " host_name #{ prerequisite_host }"
+ deps.puts " service_description #{ pre }"
+ deps.puts " dependent_host_name #{ host }"
+ deps.puts " dependent_service_description #{ service['name'] }"
+ deps.puts " execution_failure_criteria n"
+ deps.puts " notification_failure_criteria w,u,c"
+ deps.puts "}"
+ }
+ }
+ end
+end
+
+
+f = File.new("auto-services.cfg", "w")
+deps = File.new("auto-dependencies.cfg", "w")
+config['services'].each{ |service|
+ throw "Empty service or service not a hash" unless service.kind_of?(Hash)
+ throw "nrpe, check, and remotecheck are mutually exclusive in service #{service['name']}" if
+ (service['nrpe'] ? 1 : 0) +
+ (service['check'] ? 1 : 0) +
+ (service['remotecheck'] ? 1 : 0) >= 2
+ # Figure out the hosts this service applies to
+ service['hosts'] = "" unless service['hosts']
+ service['hosts'].delete!(" \t")
+ hosts = service['hosts'].split(/,/)
+ if service['hostgroups'] then
+ service['hostgroups'].delete(" \t").split(/,/).each{ |hg|
+ unless config['hostgroups'][hg]
+ throw "hostgroup #{hg} does not exist- used in service #{service['name']}"
+ end
+ hosts = hosts.concat config['hostgroups'][hg]['members']
+ }
+ end
+ if service['excludehosts'] then
+ service['excludehosts'].delete(" \t").split(/,/).each{ |host|
+ if hosts.delete(host) == nil
+ throw "Cannot remove host #{host} from service #{service['name']}: it's not included anyway"
+ end
+ }
+ end
+
+ throw "no hosts for service #{service['name']}" if hosts.empty?
+
+ if service['runfrom']
+ throw "need remotecheck with runfrom" unless service['remotecheck']
+ relay = service['runfrom']
+
+ hosts.each{ |host|
+ host_ip = (config['servers'][host] ? config['servers'][host]['ip'] : gateway_name_to_ip[host] )
+ check = $nrpe.add("#{host}_#{service['name']}", service['remotecheck'].gsub(/\$HOSTADDRESS\$/, host_ip))
+ service['check'] = "#{ ORG }_check_nrpe_host!#{ config['servers'][ relay ]['ip'] }!#{ check }"
+
+ if (service['depends'] == nil)
+ service['depends'] = []
+ elsif service['depends'].kind_of?(String)
+ d = [ service['depends'] ];
+ service['depends'] = d
+ end
+ service['depends'] << "#{ relay }:process - nrpe";
+
+ addService( [ host ], service, f, deps)
+ }
+ else
+ throw "must not remotecheck without runfrom" if service['remotecheck']
+ addService(hosts, service, f, deps)
+ end
+}
+
+f = File.new("nrpe_#{ ORG }.cfg", "w")
+$nrpe.checks.each_pair{ |name, check|
+ f.puts "command[#{ name }]=#{ check }"
+}
+
+