#!/usr/bin/perl
#
# gen_check_snmp_if_services
#
# genereates a services file for a host
# for use w/ check_snmp_serviecs
#

## libraries
use strict;

use Net::SNMP;
use Getopt::Long;
&Getopt::Long::config('auto_abbrev');

## variable declairations
my $progname = "gen_check_snmp_if_services";
my $version = "0.1.2";

my $hostname;
my $needhelp;
my $templatefile = "services-check_snmp_if.template";
my $template;
my $cmd = "check_snmp_if";

# snmp variables
my $snmpcommunity = "public";
my $snmpport = "161";
my %snmpoid = (
	ifAdminStatus => ".1.3.6.1.2.1.2.2.1.7",
	ifOperStatus => ".1.3.6.1.2.1.2.2.1.8",
	ifIndex => ".1.3.6.1.2.1.2.2.1.1",
	ifName => ".1.3.6.1.2.1.31.1.1.1.1",
	ifDescr => ".1.3.6.1.2.1.2.2.1.2",
	ifAlias => ".1.3.6.1.2.1.31.1.1.1.18",
);
my $snmpifindex;
my $snmpifname;
my $snmpifdescr;
my $snmpifalias;
my $snmpcatalyst;
my @snmpvalues;
my $snmpoption;


## process command line options

if (scalar(@ARGV) == 0) {
	usage();
}

Getopt::Long::Configure("no_ignore_case");
my $getoptret = GetOptions(
						"H|hostname=s"		=> \$hostname,
						"i|ifindex"			=> \$snmpifindex,
						"n|ifname"			=> \$snmpifname,
						"d|ifdescr"			=> \$snmpifdescr,
						"a|ifalias"			=> \$snmpifalias,
						"catalyst"			=> \$snmpcatalyst,
						"C|community=s"		=> \$snmpcommunity,
						"p|port=i"			=> \$snmpport,
						"c|command=s"		=> \$cmd,
						"h|help"			=> \$needhelp
						);


if ($getoptret == 0 || $needhelp) {
	usage();
} # end if no options or wants help
if (!defined($hostname)) {
	print "Hostname not specified\n\n";
	usage();
} # end if no hostname
if (!defined($snmpifindex) && !defined($snmpifname) &&
	!defined($snmpifdescr) && !defined($snmpifalias) &&
	!defined($snmpcatalyst)) {
	print "Must specify key\n\n";
	usage();
} # end if no key
 

## get the values we wanted
if (defined($snmpifindex)) {
	$snmpoption = "-i";
	@snmpvalues = GetIfIndex();

} elsif (defined($snmpifname)) {
	$snmpoption = "-n";
	@snmpvalues = GetIfName();

} elsif (defined($snmpifdescr)) {
	$snmpoption = "-d";
	@snmpvalues = GetIfDescr();

} elsif (defined($snmpifalias)) {
	$snmpoption = "-a";
	@snmpvalues = GetIfAlias();

} elsif (defined($snmpcatalyst)) {
	$snmpoption = "--catalyst";
	@snmpvalues = GetIfName();

} # find the ifindex by specified method

$template = GetFileContents($templatefile);
print "## Generated by $progname\n\n";
foreach my $key (@snmpvalues) {
	if ($key !~ /^\s*$/ && $key !~ /virtual/i) {
		my $servicedef = $template;
		$servicedef =~ s/HOSTNAME/$hostname/;
		$servicedef =~ s/SERVDESCR/$key/;
		$servicedef =~ s/COMMAND/$cmd/;
		$servicedef =~ s/OPT/$snmpoption '$key'/;
		print $servicedef;
	} # end if the key isn't empty
}


## subroutines

sub usage
{
	print <<END;
== $progname $version ==
usage:
  $progname (-H|--hostname) <hostname> [-C|--community] <snmpcommunity>
    [-p|--port] <port> [-i|--ifindex] [-n|--ifname] [-d|--ifdescr] 
    [-a|--ifAlias] [--catalyst] [-h|--help]

END

	exit(1);
} # end usage;


sub GetIfIndex
{
	my $snmp_session;
	my $snmp_error;
	my $snmp_response;
	my @returnval;

	## get the list of active users via snmp
	($snmp_session, $snmp_error) = Net::SNMP->session(
		-hostname  => $hostname,
		-community => $snmpcommunity,
		-port      => $snmpport
	);

	if (!defined($snmp_session)) {
		print(STDERR "ERROR: couldn't open snmp session\n");
		exit(1);
	}

	if (!defined($snmp_response = $snmp_session->get_table($snmpoid{ifIndex}))) {
		$snmp_session->close;
		print(STDERR "ERROR: couldn't execute snmp query: ifIndex\n");
		exit(1);
	}

	foreach my $snmpkey (keys( %{$snmp_response})) {
		push(@returnval, $snmp_response->{$snmpkey});
	}
	$snmp_session->close;

	return @returnval;

} # end GetIfIndex;


sub GetIfName
{
	my $snmp_session;
	my $snmp_error;
	my $snmp_response;
	my @returnval;

	## get the list of active users via snmp
	($snmp_session, $snmp_error) = Net::SNMP->session(
		-hostname  => $hostname,
		-community => $snmpcommunity,
		-port      => $snmpport
	);

	if (!defined($snmp_session)) {
		print(STDERR "ERROR: couldn't open snmp session\n");
		exit(1);
	}

	if (!defined($snmp_response = $snmp_session->get_table($snmpoid{ifName}))) {
		$snmp_session->close;
		print(STDERR "ERROR: couldn't execute snmp query: ifName\n");
		exit(1);
	}

	foreach my $snmpkey (keys( %{$snmp_response})) {
		push(@returnval, $snmp_response->{$snmpkey});
	}
	$snmp_session->close;

	return @returnval;

} # end GetIfName;


sub GetIfDescr
{
	my $snmp_session;
	my $snmp_error;
	my $snmp_response;
	my @returnval;

	## get the list of active users via snmp
	($snmp_session, $snmp_error) = Net::SNMP->session(
		-hostname  => $hostname,
		-community => $snmpcommunity,
		-port      => $snmpport
	);

	if (!defined($snmp_session)) {
		print(STDERR "ERROR: couldn't open snmp session\n");
		exit(1);
	}

	if (!defined($snmp_response = $snmp_session->get_table($snmpoid{ifDescr}))) {
		$snmp_session->close;
		print(STDERR "ERROR: couldn't execute snmp query: ifDescr\n");
		exit(1);
	}

	foreach my $snmpkey (keys( %{$snmp_response})) {
		push(@returnval, $snmp_response->{$snmpkey});
	}
	$snmp_session->close;

	return @returnval;

}


sub GetIfAlias
{
	my $snmp_session;
	my $snmp_error;
	my $snmp_response;
	my @returnval;

	## get the list of active users via snmp
	($snmp_session, $snmp_error) = Net::SNMP->session(
		-hostname  => $hostname,
		-community => $snmpcommunity,
		-port      => $snmpport
	);

	if (!defined($snmp_session)) {
		print(STDERR "ERROR: couldn't open snmp session\n");
		exit(1);
	}

	if (!defined($snmp_response = $snmp_session->get_table($snmpoid{ifAlias}))) {
		$snmp_session->close;
		print(STDERR "ERROR: couldn't execute snmp query: ifAlias\n");
		exit(1);
	}

	foreach my $snmpkey (keys( %{$snmp_response})) {
		push(@returnval, $snmp_response->{$snmpkey});
	}
	$snmp_session->close;

	return @returnval;

}


sub GetFileContents
{
	my $filename = shift(@_);
	my $output = "";
	open (F, $filename);
	while (my $line = <F>) {
		$output .= $line;
	}
	close(F);
	return $output;
} # end GetFileContents;


