#!/usr/bin/perl

use strict;
use Mail::Send;
use Getopt::Std;

# configuration

# Email of the OTRS-System
my $emailto 		= "otrs\@mycompany.xyz";
# Standard Queue (if no contact alias available from nagios)
my $std_queue 		= "nagios_test";
# 
# Definitions for TicketFreeKeys and TicketFreeText 
# (use corresponding settings in NagiosGenericAgent.pl !!)
# definitions for host freefield
my $host_key 		= "X-OTRS-TicketKey2";		# TicketFreeKey
my $host_text 		= "X-OTRS-TicketValue2";	# TicketFreeText
my $host_name		= "Server";			# Value for TicketFreeKey
# definitions for service freefield
my $service_key 	= "X-OTRS-TicketKey4";		# TicketFreeKey
my $service_text 	= "X-OTRS-TicketValue4";	# TicketFreeText
my $service_name	= "Service";			# Value for TicketFreeKey 
# definitions for state freefield
my $state_key	 	= "X-OTRS-TicketKey3";		# TicketFreeKey
my $state_text	 	= "X-OTRS-TicketValue3";	# TicketFreeText
my $host_state_name	= "Server-Status";		# Value for TicketFreeKey (State of the Host)
my $service_state_name	= "Service-Status";		# Value for TicketFreeKey (State of the Service)
	
# script execution command for closing tickets and adding notes
#
# nagios user (e.g. daemon) needs to execute this command without 
# having to type a password. Create an ssh key pair and place the
# public key in .ssh/authorized_key of the otrs user.
# 
my $ga_script = "ssh otrs\@otrs /opt/otrs/bin/NagiosGenericAgent.pl";

# end of configuration

my $MAIL = 1;
my $ADD_NOTE = 2;
my $CLOSE = 3;
my $action;

# Read Commandline Options
my %Opts = ();
getopt('HSsNdaonCT', \%Opts);

system ("echo \"DEBUG: H: $Opts{'H'}, S: $Opts{'S'}, s: $Opts{'s'}, T: $Opts{'T'}\" >> /tmp/error"); 
if (!$Opts{"H"} || !$Opts{"S"} || !$Opts{"n"} || !$Opts{"s"} || !$Opts{"T"} || !( $Opts{"T"} eq 's' || $Opts{"T"} eq 'h' )){

	print "H: $Opts{'H'}, S: $Opts{'S'}, s: $Opts{'s'}, T: $Opts{'T'}"; 
	system ("echo \"ERROR EXECUTING: H: $Opts{'H'}, S: $Opts{'S'}, s: $Opts{'s'}, T: $Opts{'T'}\" >> /tmp/error"); 

	print "Usage: otrs_mail.pl -T [s,h] -H HOSTALIAS -S SERVICEDESCRIPTION -s STATE \n".
		"      [ -t DATETIME -n NOTIFICATIONNUMBER -a HOSTADRESS -o OUTPUT \n".
		"	 -N NOTIFICATIONTYPE -C CONTACTALIAS]\n";
	exit(1);
}

# get Service State and set action
if ($Opts{'N'} eq "PROBLEM" && $Opts{'n'} == 1){
	$action = $MAIL;					
}elsif ($Opts{'N'} eq "RECOVERY"){
	$action = $CLOSE;
}elsif ($Opts{'N'} eq "PROBLEM" || $Opts{'N'} eq "ACKNOWLEDGEMENT"){
	$action = $ADD_NOTE;
}
print "H: $Opts{'H'}, S: $Opts{'S'}, s: $Opts{'s'}, T: $Opts{'T'}, n: $Opts{'n'}, N: $Opts{'N'}\n"; 
print "a: $action\n";


# set variables for HOST-Notification
my $type = " -T h";
my $freefield =$host_state_name;
my $subject = "Nagios-alert: HOST $Opts{'H'} IS DOWN!!!";
if ($Opts{'T'} eq "s"){
	# set variables for SERVICE-Notification
	$type = " -T s";
	$freefield = $service_state_name;
 	$subject = "Nagios-alert: Service-Check '$Opts{'S'}' hat den Status '$Opts{'s'}' auf Server '$Opts{'H'}'";
}

my $message =   "Art der Meldung: $Opts{'N'}\n".
                "Service: $Opts{'S'}\n".
                "Servername: $Opts{'H'}\n".
                "Serveradresse: $Opts{'a'}\n".
                "Status: $Opts{'s'}\n\n".
                "Ausgabe: $Opts{'o'}";

my $sshcmd = 	$ga_script . " -h $Opts{'H'} -S $Opts{'S'} -s $Opts{'s'} ".
	     	"-N $Opts{'N'} -a \"'$Opts{'a'}'\" -C $Opts{'C'} \"'-o $Opts{'o'}'\"";

# send email to OTRS = Create new Ticket
if ($action eq $MAIL){
	# OTRS-Email
	my $msg = new Mail::Send;
	$msg->to($emailto);
	$msg->subject($subject);

	my $queue = $Opts{'C'} || $std_queue;
	$msg->set("X-OTRS-Queue", $queue);
	$msg->set($host_key, "Host");
	$msg->add($host_text,$Opts{"H"} );
	$msg->set($service_key, "Service");
	$msg->add($service_text,$Opts{"S"} );
	$msg->set($state_key, $freefield);
	$msg->add($state_text, $Opts{"s"} );

	my $fh = $msg->open;               # some default mailer
	print $fh $message;	

	$fh->close;         		   # complete the message and send it
}elsif ($action eq $CLOSE){
        #
        # CLOSE TICKET ON OTRS SYSTEM
        #
        my $cmd = $sshcmd . " -c 1" . $type;
        system($cmd);

}elsif ($action eq $ADD_NOTE){
	#
	# ADD TICKET NOTE ON OTRS SYSTEM
	#
        my $cmd = $sshcmd . " -c 0" . $type ;
	system($cmd);
}
