#!/usr/bin/perl
#
# Script to automatically generate service dependencies for Nagios.
#
# USAGE: Reads config information from STDIN (cat /etc/nagios/hosts/* | ./servicedeps.pl)
# and spits out a configuration file on STDOUT
#
# Licensed under LGPL version 2
# Copyright 2006 Broadwick Corporation
#
# By: Ian Kilgore


while (<>) {
  %services;
  if ($_ =~ /define\s+service/) {  # "define" (one or more space characters) "service"
    while (<>) {
      if ($_ =~ /host_name\s+([A-Za-z0-9\-\.]+)/) {  # "host_name" (one or more space characters) (hostname)
        $hostname = $1;
      }
      elsif ($_ =~ /service_description\s+([A-Za-z0-9_]+)/) {
        $service = $1;
      }
      elsif ($_ =~ /\}/) {
	push(@{$services{$hostname}}, $service);
	last;
      }
    }
  }
}

open(FILE, "< /etc/nagios/conf.d/dependencies.cfg");

while (<FILE>) {
  if ($_ =~ /define\s+hostdependency/) {
    while (<FILE>) {
      if ($_ =~ /\shost_name\s+([A-Za-z0-9\-\.]+)/) {
        $hostname = $1;
      }
      elsif ($_ =~ /dependent_host_name\s+([A-Za-z0-9\-\.]+)/) {
        $dephost = $1;
      }
      elsif ($_ =~ /\}/) {
        foreach $service (@{$services{$dephost}}) {
	  print "
define servicedependency{
        host_name                       $hostname
        service_description             PING
        dependent_host_name             $dephost
        dependent_service_description   $service
        execution_failure_criteria      w,u,c
        }";
        }
        last;
      }
    }
  }
}


foreach my $host (keys %services){
  foreach my $service (@{$services{$host}}) {
    if ($service ne "PING") {
      print "
define servicedependency{
	host_name			$host
	service_description		PING
	dependent_host_name		$host
	dependent_service_description	$service
	execution_failure_criteria	w,u,c
	}";
    }
  }
}



