#!/usr/bin/perl
#
# make-config - Part of check_traffic plugin.
#
# Copyright (c) 2003 Adrian Wieczorek, <ads (at) irc.pila.pl>
#
# See README file for more details.

$VERSION	     = "0.91b";

$HOSTNAME            = "ENTER YOUR HOSTNAME";	     	    # Hostname of monitoring host. ( The same like in Nagios(r) config.)  

# SNMP stuff:
$SNMPWALK             = "/usr/bin/snmpwalk";
$SNMPGET              = "/usr/bin/snmpget";
$HOST                 = "ENTER YOUR HOST IP ADDRESS";
$COMMUNITY            = "ENTER YOUR COMMUNITY STRING";

$OUTPUT_SERVICE_FILE  = "services.cfg";
$OUTPUT_COMMANDS_FILE = "checkcommands.cfg";
$OUTPUT_EXTINFO_FILE  = "serviceextinfo.cfg";
$CHECK_INTERVAL       = 3;	            # This value is important for RRD too.

# RRD support:
$WITH_RRD     	      = 1;                  # Set to 0 if You don't want RRD graphs.
$RRDTOOL      	      = "/usr/bin/rrdtool";
$RRDCGI	      	      = "/usr/bin/rrdcgi";
$DB_PATH       	      = "/usr/local/nagios/check_traffic-$VERSION/db";
$GIFS_PATH            = "/usr/local/nagios/share";
$GIFS_URL             = "http://YOUR.DOMAIN.COM/nagios/";
$CGI_URL	      = "nagios/cgi-bin";

# ------ !!! You probably no need to change nothing below this line !!! ------

@walk = `$SNMPWALK -v 1 $HOST -c $COMMUNITY interfaces.ifTable.ifEntry.ifDescr`;

%interfaces = ();

my $count = 0;

foreach $interface (@walk)
{
 @ifDescr = split("=",$interface);
 if($ifDescr[0] =~ m/.(\d*)\s$/) { $ifNumber = $1; }
 
 $_ = $ifDescr[1]; 
 if($ifDescr[1] =~ m/STRING:/)		# Some SNMP Agents add field type identifier before
 { 					# value, so we omitting it.
  m/STRING:\s(\S*)/;
  $interfaces{$ifNumber} = $1;
 } else 
   {
    m/\s(\S*)/;
    $interfaces{$ifNumber} = $1;
   }
 $count++;
}

print "Number of Interfaces found: $count\n\n";

if($WITH_RRD)
{
 $samples_4hrs = (60 * 4) / $CHECK_INTERVAL;
 $average_1day = 30 / $CHECK_INTERVAL;
 $average_1mon = $average_1day * 4;
 
 if ((30%$CHECK_INTERVAL) or ((60*4)%$CHECK_INTERVAL)) 
 { 
  die "\nERROR: Value \$CHECK_INTERVAL is illegal. Enter another and try again.\n"; 
 }
}

# - Writing service definitions fo file.
open (CONFIG, ">>$OUTPUT_SERVICE_FILE");
print CONFIG "# - Service definitions for 'check_traffic' plugin\n\n";
foreach $ifNumber (keys %interfaces) 
{ 
 $_ = $interfaces{$ifNumber};
 s/\//-/g;
 $interfaces{$ifNumber} = $_; # Remove forward slashes from the interface description
 $_ = `$SNMPGET -v 1 $HOST -c $COMMUNITY interfaces.ifTable.ifEntry.ifSpeed.$ifNumber`;
 m/\s(\d*)\s$/;
 $max_speed =  $1 / 8;
 if(!$max_speed)
 {
  print "Can't determine maximum speed for interface $interfaces{$ifNumber}.\n";
  print "Enter it manually [bps]: ";
  chop($max_speed = <STDIN>);
 }

 if($WITH_RRD) 
 { 
  $start_time = time;
  $db_file = $HOST."_".$interfaces{$ifNumber}.".rrd";
  `$RRDTOOL create $DB_PATH/$db_file --start $start_time DS:input:COUNTER:600:U:U DS:output:COUNTER:600:U:U RRA:AVERAGE:0.5:1:$samples_4hrs RRA:AVERAGE:0.5:$average_1day:48 RRA:AVERAGE:0.5:$average_1mon:372 RRA:MAX:0.5:1:48 RRA:MAX:0.5:$average_1day:48 RRA:MAX:0.5:$average_1mon:372`;
  create_rrd_cgi($HOSTNAME,$interfaces{$ifNumber},$db_file);
 }

 print CONFIG "define service{\n";
 print CONFIG "	use 				generic-service\n";
 print CONFIG "	host_name			$HOSTNAME\n";
 print CONFIG "	service_description		$interfaces{$ifNumber} Traffic\n";
 print CONFIG "	check_period			24x7\n";
 print CONFIG "	max_check_attempts		3\n";
 print CONFIG "	normal_check_interval   	$CHECK_INTERVAL\n";
 print CONFIG "	retry_check_interval            1\n";
 print CONFIG "	notification_interval           120\n";
 print CONFIG "	notification_period             24x7\n";
 print CONFIG "	notification_options            w,u,c,r\n";
 print CONFIG "	check_command			check_traffic!$ifNumber!$max_speed!$interfaces{$ifNumber}!85!95\n";
 print CONFIG "	}\n\n";
}
close(CONFIG);

# - Writing command definition to file.
open(CONFIG, ">>$OUTPUT_COMMANDS_FILE");

print CONFIG "# 'check_traffic' command definition\n";
print CONFIG "define command{\n";
print CONFIG "	       command_name	check_traffic\n";
print CONFIG "	       command_line	\$USER1\$/check_traffic -H \$HOSTADDRESS\$ -i \$ARG1\$ -b \$ARG2\$ -r \$ARG3\$ -w \$ARG4\$ -c \$ARG5\$\n";
print CONFIG "	       }\n";

close(CONFIG);

# - Writing serviceextinfo definitions
open(CONFIG, ">>$OUTPUT_EXTINFO_FILE");

foreach $ifNumber (keys %interfaces) 
{
 print CONFIG "# '$interfaces{$ifNumber}' hostextinfo  definition\n";
 print CONFIG "define serviceextinfo{\n";
 print CONFIG "		host_name               $HOSTNAME\n";
 print CONFIG "		service_description     $interfaces{$ifNumber} Traffic\n";
 print CONFIG "		notes_url               $CGI_URL/".$HOSTNAME."_".$interfaces{$ifNumber}.".cgi\n";
 print CONFIG "		icon_image              traffic-icon.jpg\n";
 print CONFIG "		icon_image_alt          View graphs\n";
 print CONFIG "	       }\n\n";
} 
close(CONFIG);


sub create_rrd_cgi
{
 my ($host,$iface_descr, $db_file) = @_;
 open(CGIFILE, ">".$host."_".$iface_descr.".cgi");
 
 print CGIFILE "#!$RRDCGI\n";
 print CGIFILE "<HTML>\n<HEAD>\n";
 print CGIFILE "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"".($CHECK_INTERVAL * 60)."\">\n";
 print CGIFILE "<?-- This script was automagically generated by check_traffic config maker utility do not edit! --?>\n";
 print CGIFILE "<TITLE>$host - $iface_descr Interface Graphs</TITLE>\n";
 print CGIFILE "</HEAD>\n<PRE>\n";
 print CGIFILE "<H4><B>$host - $iface_descr Interface Graphs</B></H4>\n";
 print CGIFILE "last 4 hours ($CHECK_INTERVAL minutes averages)\n";
 print CGIFILE "<RRD::GRAPH $GIFS_PATH/".$host."_".$iface_descr."-4hrs.gif\n";
 print CGIFILE " --imginfo \"<IMG SRC=\"$GIFS_URL%s\" WIDTH=\"%lu\" HEIGHT=\"%lu\">\"\n";
 print CGIFILE " --start -4hours\n";
 print CGIFILE " --interlaced\n";
 print CGIFILE " --lazy\n";
 print CGIFILE " --vertical-label \"bytes/sec\"\n";
 print CGIFILE " --lower-limit 0.0\n";
 print CGIFILE " --upper-limit 1.0\n";
 print CGIFILE " DEF:inoctets=$DB_PATH/$db_file:input:AVERAGE\n";
 print CGIFILE " DEF:outoctets=$DB_PATH/$db_file:output:AVERAGE\n";
 print CGIFILE " LINE1:inoctets#0000FF:\"input \"\n";
 print CGIFILE " GPRINT:inoctets:LAST:\"%6.2lf %sB/s last\"\n";
 print CGIFILE " GPRINT:inoctets:AVERAGE:\"%6.2lf %sB/s avg\"\n";
 print CGIFILE " GPRINT:inoctets:MAX:\"%6.2lf %sB/s max\\n\"\n";
 print CGIFILE " AREA:outoctets#00FF00:\"output\"\n";
 print CGIFILE " GPRINT:outoctets:LAST:\"%6.2lf %sB/s last\"\n";
 print CGIFILE " GPRINT:outoctets:AVERAGE:\"%6.2lf %sB/s avg\"\n";
 print CGIFILE " GPRINT:outoctets:MAX:\"%6.2lf %sB/s max\\n\"\n";
 print CGIFILE ">\n<BR>\n";
 print CGIFILE "last 24 hours (30 minutes averages)\n";
 print CGIFILE "<RRD::GRAPH $GIFS_PATH/".$host."_".$iface_descr."-1day.gif\n";
 print CGIFILE " --imginfo \"<IMG SRC=\"$GIFS_URL%s\" WIDTH=\"%lu\" HEIGHT=\"%lu\">\"\n";
 print CGIFILE " --start -1day\n";
 print CGIFILE " --interlaced\n";
 print CGIFILE " --lazy\n";
 print CGIFILE " --vertical-label \"bytes/sec\"\n";
 print CGIFILE " --lower-limit 0.0\n";
 print CGIFILE " --upper-limit 1.0\n";
 print CGIFILE " DEF:inoctets=$DB_PATH/$db_file:input:AVERAGE\n";
 print CGIFILE " DEF:outoctets=$DB_PATH/$db_file:output:AVERAGE\n";
 print CGIFILE " LINE1:inoctets#0000FF:\"input \"\n";
 print CGIFILE " GPRINT:inoctets:LAST:\"%6.2lf %sB/s last\"\n";
 print CGIFILE " GPRINT:inoctets:AVERAGE:\"%6.2lf %sB/s avg\"\n";
 print CGIFILE " GPRINT:inoctets:MAX:\"%6.2lf %sB/s max\\n\"\n";
 print CGIFILE " AREA:outoctets#00FF00:\"output\"\n";
 print CGIFILE " GPRINT:outoctets:LAST:\"%6.2lf %sB/s last\"\n";
 print CGIFILE " GPRINT:outoctets:AVERAGE:\"%6.2lf %sB/s avg\"\n";
 print CGIFILE " GPRINT:outoctets:MAX:\"%6.2lf %sB/s max\\n\"\n";
 print CGIFILE ">\n<BR>\n";
 print CGIFILE "last month (2 hour averages)\n";
 print CGIFILE "<RRD::GRAPH $GIFS_PATH/".$host."_".$iface_descr."-1mon.gif\n";
 print CGIFILE " --imginfo \"<IMG SRC=\"$GIFS_URL%s\" WIDTH=\"%lu\" HEIGHT=\"%lu\">\"\n";
 print CGIFILE " --start -1month\n";
 print CGIFILE " --interlaced\n";
 print CGIFILE " --lazy\n";
 print CGIFILE " --vertical-label \"bytes/sec\"\n";
 print CGIFILE " --lower-limit 0.0\n";
 print CGIFILE " --upper-limit 1.0\n";
 print CGIFILE " DEF:inoctets=$DB_PATH/$db_file:input:AVERAGE\n";
 print CGIFILE " DEF:outoctets=$DB_PATH/$db_file:output:AVERAGE\n";
 print CGIFILE " LINE1:inoctets#0000FF:\"input \"\n";
 print CGIFILE " GPRINT:inoctets:LAST:\"%6.2lf %sB/s last\"\n";
 print CGIFILE " GPRINT:inoctets:AVERAGE:\"%6.2lf %sB/s avg\"\n";
 print CGIFILE " GPRINT:inoctets:MAX:\"%6.2lf %sB/s max\\n\"\n";
 print CGIFILE " AREA:outoctets#00FF00:\"output\"\n";
 print CGIFILE " GPRINT:outoctets:LAST:\"%6.2lf %sB/s last\"\n";
 print CGIFILE " GPRINT:outoctets:AVERAGE:\"%6.2lf %sB/s avg\"\n";
 print CGIFILE " GPRINT:outoctets:MAX:\"%6.2lf %sB/s max\\n\"\n";
 print CGIFILE ">\n<BR><BR>\n";
 print CGIFILE "<B>check_traffic plugin\n&copy;&nbsp;2003 by ADi\n</B>\n";
 print CGIFILE "</PRE>\n";
 
 close(CGIFILE);
}
