#!/usr/bin/perl 
#
# OPERATION
# Run the script.  Or configure it to work in Nagios.  
#
# CONFIGURATION
# Maybe you have to set the path for nsrjb and mminfo/mmpool programs
#
# ISSUES
# Must be run as root, setuid root, sudo'd up, or something.  
# 
# TODO
#
# Perl/CPAN Modules needed
# Getopt::Std
# Bit::Vector
# Date::Calc
#
# TESTED ON
# Linux		Networker 7.1/7.2
# Solaris	Networker 7.1
#
# THANKS TO
# Peter Rupp (Solaris Input)
# Rafael Kolless (Long Tapenames)
#
# VERSION HSTORY
# 0.3.1		- First running Version for Linux/Networker 7.1
# 0.3.2		- Completely rewriten parser for mminfo/nsrjb output, to fix issues with Solaris/Networker 7.1
# 0.4.0		- Added Group Check for status of Networker Savegroups
# 0.4.1		- Bug fixes for long tape names and calculating of free tapes
# 0.5.0		- Added Check for Networker message Log, Bugfix in Drivestatus
# 0.5.1		- Added support for german logs and headers
# 0.6.0		- First Performance Infos added
#
# AUTHOR
# Martin Nuernberger <m.nuernberger@net17.de>

use strict;
use Getopt::Std;
use Date::Calc qw(:all);
my $version = "0.5.0";
my $debug = 0; # Just set to 1 if you want lots of Output ;-)

#my ($minloglevel) = "ERROR";
#my ($hoursago) = "1";
#######################################################
# SET THIS PATH CORRECTLY OR YOUR LIFE IS FORFEIT
#######################################################
my $NWJUKEBOX = "sudo /opt/nsr/nsrjb -C ";
my $NWMMINFO = "/opt/nsr/mminfo -m ";
my $NSRADMIN = "nsradmin -i nsrcmd";
my $NWLOG = "/nsr/logs/messages";
#######################################################

#######################################################
# Please don't change these.
#######################################################
use constant OK		=> 0;
use constant WARNING	=> 1;
use constant CRITICAL	=> 2;
use constant UNKNOWN	=> 3;
use constant VERSION	=> 0.0.1;
#######################################################

use vars qw($status $statust);

my %opt = ();
getopt('HStpjlmwc',\%opt);
#print $opt{S}."\n";
#print $opt{t}."\n";
#print $opt{w}."\n";
#print $opt{c}."\n";
if (defined $opt{H}) {
    usage();
    exit;
}
my $checktype = $opt{t};
my $checkparm = $opt{p};
my $checkbox = $opt{j};
my $checkwarn = $opt{w};
my $checkcrit = $opt{c};
my $checklog = $opt{l};
my $checkminutes = $opt{m};

$status = OK;

my $warncount = 0;
my $critcount = 0;

my $pos = 0;
my $pos1 = 0;
my $pos2 = 0;
my $pos3 = 0;
my $pos4 = 0;
my $pos5 = 0;
my $pos6 = 0;
my $pos7 = 0;

my $ws = "";
my $perfdata = "";

# Slot Data
my $cc_slot = 0;
my ($jb_slot,@jb_volnum,@jb_pool,@jb_barcode,@jb_volumeid,@jb_recycle);
# Drive Data
my $cc_drive = 1;
my ($jb_driveno,@jb_drivepath,@jb_driveinfo);
# Pool Data
my $cc_pool = 1;
my (@jb_poolname,@jb_pooltapes,@jb_poolfreetapes,@jb_poolpercent);
$jb_poolname[0] = "Free Tapes";
$jb_pooltapes[0] = 0;
# Tape Data
my $cc_tape = 0;
my (@jb_tapename,@jb_tapesize,@jb_tapesizeunit,@jb_expired,@jb_tapeused,@jb_tapeusedunit,@jb_tapepercent,@jb_tapepool,@jb_tapeexpires,@jb_taperead,@jb_tapereadunit,@jb_tapemounts);

# Get Slot, Pool and Drive data
# Read Jukebox Statistics
if ($checkbox eq "") {
}
else {
    $NWJUKEBOX = $NWJUKEBOX." -j ".$checkbox;
    print $NWJUKEBOX."\n";
}
open IN,"$NWJUKEBOX|" || die "Something has gone terribly, terribly wrong with $NWJUKEBOX\n";
#open IN,"nsrjb.sap.txt" || die "Something has gone terribly, terribly wrong with $NWJUKEBOX\n";
while (<IN>) {
    chomp ($_);
    if ($debug == 1) {
	print "DEBUG: (read nsrjb) ".$_."\n";
    }
    $jb_slot = trimwhitespace(substr($_,0,6));
    if (index($_,"slot") > 0 && index($_,"volume") > 0 && index($_,"pool") > 0) {
	$pos1 = index($_,"slot") - 1;
	$pos2 = index($_,"volume");
	$pos3 = index($_,"pool");
	$pos4 = index($_,"barcode");
	$pos5 = index($_,"volume id");
	$pos6 = index($_,"recyclable");
    }
    if (index($_,"Slot") > 0 && index($_,"Datenträger") > 0 && index($_,"Pool") > 0) {
	$pos1 = index($_,"Slot") - 1;
	$pos2 = index($_,"Datenträger");
	$pos3 = index($_,"Pool");
	$pos4 = index($_,"Barcode");
	$pos5 = index($_,"Datenträgerid");
	$pos6 = index($_,"wiederverwendbar");
    }
    if ($jb_slot eq "drive" || $jb_slot eq "Laufwe") {
	if ($jb_slot eq "drive") {
	    $jb_driveno = trimwhitespace(substr($_,5,2));
	}
	else {
	    $jb_driveno = trimwhitespace(substr($_,8,2));
	}
	my ($j,$len,$pos1,$pos2,$start);
	$len = length($_);
	$start = 6;
	for ($j = $start; $j < $len; $j++) {
	    if (substr($_,$j,1) eq "(") {
		$pos1 = $j + 1;
	    }
	    if (substr($_,$j,1) eq ")") {
		$pos2 = $j;
		$j = $len;
		$start=$j + 1;
	    }
	}
	$jb_drivepath[$jb_driveno] = trimwhitespace(substr($_,$pos1,$pos2-$pos1));
	$jb_driveinfo[$jb_driveno] = trimwhitespace(substr($_,$pos2 + 1));
	$cc_drive++;
    }
    else {
	if (IsNumeric($jb_slot) && length($_) > 10) {
	    if ($cc_slot < $jb_slot) {
		$cc_slot = $jb_slot;
	    }
	    $jb_volnum[$jb_slot] = trimwhitespace(substr($_,$pos2,$pos3-$pos2-1));
	    $jb_pool[$jb_slot] = trimwhitespace(substr($_,$pos3,$pos4-$pos3-1));
	    if ($jb_volnum[$jb_slot] eq "-*    ") {
		$jb_pooltapes[0] = $jb_pooltapes[0] + 1;
		$jb_poolfreetapes[0] = $jb_poolfreetapes[0] + 1;
	    }
	    else {
		add_pool_tape($jb_pool[$jb_slot]);
	    }
	    $jb_barcode[$jb_slot] = trimwhitespace(substr($_,$pos4,$pos5-$pos4-1));
	    $jb_volumeid[$jb_slot] = trimwhitespace(substr($_,$pos5,$pos6-$pos5-1));
	    $jb_recycle[$jb_slot] = trimwhitespace(substr($_,$pos6,4));
	}
    }
}
close IN;

# Get Pool Tape data
open IN,"$NWMMINFO|" || die "Something has gone terribly, terribly wrong with $NWJUKEBOX\n";
#open IN,"mminfo.sap.txt" || die "Something has gone terribly, terribly wrong with $NWJUKEBOX\n";
while (<IN>) {
    chomp ($_);
    if ($debug == 1) {
	print "DEBUG: (read mminfo) ".$_."\n";
    }
    if (length($_) > 10) {
	if (index($_,"volume") > 0 && index($_,"written") > 0 && index($_,"expires") > 0) {
	    $pos1 = index($_,"volume");
	    $pos2 = index($_,"written");
	    $pos3 = index($_,"expires");
	    $pos4 = index($_,"read");
	    $pos5 = index($_,"mounts");
	    $pos6 = index($_,"capacity");
	}
	if (index($_,"Datenträger") > 0 && index($_,"geschrieben") > 0 && index($_,"expires") > 0) {
	    $pos1 = index($_,"Datenträger");
	    $pos2 = index($_,"geschrieben");
	    $pos3 = index($_,"expires");
	    $pos4 = index($_,"gelesen");
	    $pos5 = index($_,"mounts");
	    $pos6 = index($_,"Kapazität");
	}
	$pos = index($_," ",$pos1);
        $jb_tapename[$cc_tape] = trimwhitespace(substr($_,$pos1,$pos-$pos1+1));
	if ($jb_tapename[$cc_tape] ne "volume") {
	    $ws = trimwhitespace(substr($_,$pos));
    	    $jb_expired[$cc_tape] = substr($_,0,1);
	    $pos = index($ws," ");
	    $jb_tapeused[$cc_tape] = trimwhitespace(substr($ws,0,$pos));
	    $ws = trimwhitespace(substr($ws,$pos));
	    $pos = index($ws," ");
	    $jb_tapeusedunit[$cc_tape] = trimwhitespace(substr($ws,0,$pos));
	    $ws = trimwhitespace(substr($ws,$pos));
	    $pos = index($ws," ");
	    $jb_tapepercent[$cc_tape] = trimwhitespace(substr($ws,0,$pos));
	    if ($jb_expired[$cc_tape] eq "E") {
		$jb_tapepercent[$cc_tape] = "0%";
	    }
	    if ($jb_tapepercent[$cc_tape] eq "full") {
		$jb_tapepercent[$cc_tape] = "100%";
	    }
	    $jb_tapepool[$cc_tape] = add_pool_percent($jb_tapename[$cc_tape],$jb_tapepercent[$cc_tape]);
	    $ws = trimwhitespace(substr($ws,$pos));
	    $pos = index($ws," ");
	    $jb_tapeexpires[$cc_tape] = trimwhitespace(substr($ws,0,$pos));
	    $ws = trimwhitespace(substr($ws,$pos));
	    $pos = index($ws," ");
	    $jb_taperead[$cc_tape] = trimwhitespace(substr($ws,0,$pos));
	    $ws = trimwhitespace(substr($ws,$pos));
	    $pos = index($ws," ");
	    $jb_tapereadunit[$cc_tape] = trimwhitespace(substr($ws,0,$pos));
	    $ws = trimwhitespace(substr($ws,$pos));
	    $pos = index($ws," ");
	    $jb_tapemounts[$cc_tape] = trimwhitespace(substr($ws,0,$pos));
	    $ws = trimwhitespace(substr($ws,$pos));
	    $pos = index($ws," ");
	    $jb_tapesize[$cc_tape] = trimwhitespace(substr($ws,0,$pos));
	    $ws = trimwhitespace(substr($ws,$pos));
	    $pos = index($ws," ");
	    $jb_tapesizeunit[$cc_tape] = trimwhitespace(substr($ws,0,$pos));
	    $cc_tape = $cc_tape + 1;
	}
    }
}
close IN;

#######################################################
# Now do the checks....
#######################################################
$statust = "UNKNOWN - Cannot check";
$status = 3;

$perfdata = "\n";

use Switch;
switch ($checktype) {
    case "POOLFREE" {
	$status = check_poolfree($checkparm);
    }
    case "POOLFREETAPES" {
	$status = check_poolfreetapes($checkparm);
    }
    case "DRIVESTATUS" {
	$status = check_drivestatus($checkparm);
    }
    case "GROUPSTATUS" {
	$status = check_groupstatus($checkparm);
    }
    case "LOGSTATUS" {
	$status = check_logstatus($checkparm,$checklog,$checkminutes);
    }
    else {
	$statust = "\nInvalid Checktype, please retry\n";
	$status = 3;
	usage();
    }
}

print $statust.$perfdata."\n";
if (substr($statust,0,2) eq "OK") {
    $status = 0;
}
if (substr($statust,0,7) eq "WARNING") {
    $status = 0;
}
if (substr($statust,0,8) eq "CRITICAL") {
    $status = 0;
}
if (substr($statust,0,7) eq "UNKNOWN") {
    $status = 0;
}
exit($status);


sub usage {
    print "+-------------------------------------------------------------------------------------+\n";
    print "! check_nw - Check Legato Networker Library                                           !\n";
    print "! Version: $version                                                                      !\n";
    print "! Autor: Martin Nuernberger (m.nuernberger\@net17.de)                                  !\n";
    print "!                                                                                     !\n";
    print "! check_nw -t Type of Check                                                           !\n";
    print "!             POOLFREE                                                                !\n";
    print "!             POOLFREETAPES                                                           !\n";
    print "!             DRIVESTATUS                                                             !\n";
    print "!             LOGSTATUS                                                               !\n";
    print "!          -j Jukebox                                                                 !\n";
    print "!          -w Warn Level                                                              !\n";
    print "!          -c Critical Level                                                          !\n";
    print "!          -p Parameter                                                               !\n";
    print "!                                                                                     !\n";
    print "! POOLFREE - Get percentage of free tape capacity in Pool                             !\n";
    print "! check_nw -t POOLFREE -p poolname -w warningpercentage -c criticalpercentage         !\n";
    print "! If the pool name includes Blanks you have to put it in \"\", f.e. \"Pool with Blanks\"  !\n";
    print "!                                                                                     !\n";
    print "! POOLFREETAPES - Get Number of free tapes in Pool                                    !\n";
    print "! check_nw -t POOLFREETAPES -p poolname -w warningnumber -c criticalnumber            !\n";
    print "! If the pool name includes Blanks you have to put it in \"\", f.e. \"Pool with Blanks\"  !\n";
    print "!                                                                                     !\n";
    print "! DRIVESTATUS - Get Status of Tape Drives in Library                                  !\n";
    print "! check_nw -t DRIVESTATUS                                                             !\n";
    print "!                                                                                     !\n";
    print "! LOGSTATUS - Check Networker Log for failed Clients                                  !\n";
    print "! check_nw -t LOGSTATUS -l path/to/logfile -m Minutes ago                             !\n";
    print "!                       [-p savegroupname1,savegroupname2,savegroupname3,....]        !\n";
    print "!                                                                                     !\n";
    print "+-------------------------------------------------------------------------------------+\n";
}

sub check_poolfree {
    my $InputString = shift;
    my ($i,$num,$ret);
    $ret = 3;
    $num = get_pool_num($InputString);
    #print "Poolnummer: ".$num." - ".$jb_poolname[$num]." : ".$InputString."\n";
    my ($tmp,$tmp2,$poolfree,$diff);
    #print "JB Pooltapes: ".$jb_pooltapes[$num]."-".$num."\n";
    $tmp = $jb_pooltapes[$num] * 100;
    $tmp2 = $tmp - $jb_poolpercent[$num];
    $poolfree = ($tmp2 * 100) / ($tmp);
    $poolfree = trimwhitespace(sprintf ("%3.2f",$poolfree));
    if ($poolfree < $checkwarn) {
	$diff = $checkwarn - $poolfree;
	$diff = sprintf ("%3.3f",$diff);
	$statust = "WARNING - Percentage of free Space in Pool ".$jb_poolname[$num]." is ".$poolfree."%, ".$diff."% less than Warn level";
	$ret = 1;
    }
    if ($poolfree < $checkcrit) {
	$diff = $checkcrit - $poolfree;
	$diff = sprintf ("%3.3f",$diff);
	$statust = "CRITICAL - Percentage of free Space in Pool ".$jb_poolname[$num]." is ".$poolfree."%, ".$diff."% less than Critical Level";
	$ret = 2;
    }
    if ($poolfree > $checkwarn) {
	$statust = "OK - Percentage of free Space in Pool ".$jb_poolname[$num]." is ".$poolfree."%";
	$ret = 0;
    }
    $perfdata = "|poolfree=".$poolfree;
    if ($checkwarn ne "") {
	$perfdata = $perfdata.";".$checkwarn;
    }
    if ($checkcrit ne "") {
	$perfdata = $perfdata.";".$checkcrit;
    }
    return $ret;
}

sub check_poolfreetapes {
    my $InputString = shift;
    my ($i,$num,$ret);
    $ret = 3;
    $num = get_pool_num($InputString);
    my ($poolfree,$diff);
    $poolfree = trimwhitespace($jb_poolfreetapes[$num]);
    if ($poolfree < $checkwarn) {
	$diff = $checkwarn - $poolfree;
	$statust = "WARNING - Number of free Tapes in Pool ".$jb_poolname[$num]." is ".$poolfree.", ".$diff." less than Warn level";
	$ret = 1;
    }
    if ($poolfree < $checkcrit) {
	$diff = $checkcrit - $poolfree;
	$statust = "CRITICAL - Number of free Tapes in Pool ".$jb_poolname[$num]." is ".$poolfree.", ".$diff." less than Critical Level";
	$ret = 2;
    }
    if ($poolfree > $checkwarn) {
	$statust = "OK - Number of free Tapes in Pool ".$jb_poolname[$num]." is ".$poolfree;
	$ret = 0;
    }

    $perfdata = "|poolfree=".$poolfree;
    if ($checkwarn ne "") {
	$perfdata = $perfdata.";".$checkwarn;
    }
    if ($checkcrit ne "") {
	$perfdata = $perfdata.";".$checkcrit;
    }
    return $ret;
}

sub check_drivestatus {
    my $InputString = shift;
    my ($i,$tmp,$num,$ret);
    $ret = 3;
    $statust = "OK - All Drives enabled";
    $tmp = "";
    $num = 0;
    if ($InputString eq "") {
	for ($i = 1; $i < $cc_drive ; $i++) {
	    if (index($jb_driveinfo[$i],"disabled") > 0) {
		$num++;
	    	$tmp = $tmp.$jb_drivepath[$i]." ";
	    }
	    if (index($jb_driveinfo[$i],"deaktiviert") > 0) {
		$num++;
	    	$tmp = $tmp.$jb_drivepath[$i]." ";
	    }
	}
    }
    # otherwise just check this one drive
    else {
	for ($i = 1; $i < $cc_drive ; $i++) {
	    if ($jb_drivepath[$i] eq $InputString) {
		if (index($jb_driveinfo[$i],"disabled") > 0) {
		    $num++;
	    	    $tmp = $tmp.$jb_drivepath[$i]." ";
		}
	    }
	    if ($jb_drivepath[$i] eq $InputString) {
		if (index($jb_driveinfo[$i],"deaktiviert") > 0) {
		    $num++;
	    	    $tmp = $tmp.$jb_drivepath[$i]." ";
		}
	    }
	}
    }
    if ($num > 0) {
	$statust = "CRITICAL - ".$num." Drives disabled: ".$tmp;
	$num = 2;
    }
    $tmp = $cc_drive - 1;
    $perfdata = "|disabled=".$num.";".$tmp;
    return $ret;
}

sub check_groupstatus {
    my $InputString = shift;
    my ($i,$tmp,$num,$ret);
    my ($pos,$gname,$status,$numw,$nume,$tmpw,$tmpe,$checkit);
    my @ga; #Group Array
    my $nga; #Number of ga elements
    $ret = 0;
    #print "Group Status\n";
    $nga = 0;
    if ($checkparm ne "") {
	@ga = split(/,/,$checkparm);
    }
    $nga = @ga;
    $statust = "OK - All Groups idle";
    $tmp = "";
    $nume = 0;
    $tmpe = "";
    $numw = 0;
    $tmpw = "";
    # Create TMP File as nsradmin inout
    open OUT, "> nsrcmd" or die "Cannot create nsrcmd temp file!";
    print OUT "option hidden\n";
    print OUT "print nsr group\n";
    close OUT;
    # Exec nsradmin and read output
    open IN,"$NSRADMIN|" || die "Something has gone terribly, terribly wrong with $NSRADMIN\n";
    while (<IN>) {
	chomp ($_);
	if (index($_,"  name:") > 0) {
	    $pos = index($_, "name:");
	    $gname = trimwhitespace(substr($_,$pos+5));
	    $gname = substr($gname,0,length($gname)-1);
	    #print "Groupname: ".$gname."\n";
	    $checkit = 1;
	    if ($nga > 0) {
	        $checkit = 0;
		for ($i = 0 ; $i < $nga ; $i++) {
		    if ($ga[$i] eq $gname) {
			$checkit = 1;
			$i = $nga;
		    }
		}
	    }
	}
	if (index($_,"status:") > 0 && $checkit == 1) {
            $pos = index($_, "status:");
	    $status = trimwhitespace(substr($_,$pos+7));
	    $status = substr($status,0,length($status)-1);
            if ($status eq "stopped") {
	        $numw++;
	        $tmpw = $tmpw." ".$gname;
            }
	    if ($status eq "failed") {
	        $nume++;
	        $tmpe = $tmpe." ".$gname;
	    }
	    #print "Status: ".$status."\n";
	}
    }
    close IN;
    if ($tmpw > 0) {
	$ret = 1;
	$statust = "WARNING - Savegroups ".$tmpw." are stopped";
    }
    if ($tmpe > 0) {
	$ret = 2;
	$statust = "ERROR - Savegroups ".$tmpe." failed";
	
    }
    return $ret;
}

sub check_logstatus {
    my $InputParm = shift;
    my $InputLog = shift;
    my $InputMinutes = shift;
    my ($ret,$tmpw,$tmpe,$litmonth,$nwdate,$pday,$pmon,$phour,$pmin,$psec,$pos,$unres,$failed,$succeed,$savegrp,$savegroupsU,$savegroupsF);
    my ($year,$mon,$day,$hour,$min,$sec,$rest);
    my (@month);
    my $flag = 0;
    my $errtext = "";
    $month[1] = "Jan";
    $month[2] = "Feb";
    $month[3] = "Mar";
    $month[4] = "Apr";
    $month[5] = "May";
    $month[6] = "Jun";
    $month[7] = "Jul";
    $month[8] = "Aug";
    $month[9] = "Sep";
    $month[10] = "Oct";
    $month[11] = "Nov";
    $month[12] = "Dec";
    $ret = 3;
    
    if ($InputLog eq "") {
	$InputLog = $NWLOG;
    }
    if ($InputMinutes eq "") {
	$InputMinutes = 1440;
    }
    
    ($sec,$min,$hour,$day,$mon,$year,$rest) = localtime(time);
    $year += 1900;
    $mon++;
    #print "Aktuelles Datum: ".$year.".".$mon.".".$day." ".$hour.":".$min.":".$sec."\n";
    my $mindiff = -1 * $InputMinutes;
    ($year,$mon,$day,$hour,$min,$sec) = Add_Delta_YMDHMS($year,$mon,$day,$hour,$min,$sec,0,0,0,0,$mindiff,0);
    $litmonth = $month[$mon];
    $pday = $day;
    $phour = $hour;
    $pmin = $min;
    $psec= $sec;
    if ($day < 10) {
	$pday = " ".$day;
    }
    if ($hour < 10) {
	$phour = "0".$hour;
    }
    if ($min < 10) {
	$pmin = "0".$min;
    }
    if ($sec < 10) {
	$psec = "0".$sec;
    }
    
    $nwdate = $litmonth." ".$pday." ".$phour.":".$pmin.":".$psec;
    #print "Networker Date: ".$nwdate."\n";
    #print $year.".".$mon.".".$day." ".$hour.":".$min."\n";
    #print $nwdate."\n";
    open IN,"$InputLog" or die "Cannot open Networker message Log!! Exiting....\n";
    # Format of Logentry should be "mmm nn hh:mm:ss"
    while (<IN>) {
	chomp($_);
	#print substr($_,0,15)."-".$nwdate."*\n";
	#print substr($_,0,6)."-".$litmonth." ".$pday."\n";
	#print substr($_,7,8)."-".substr($nwdate,7,8)."\n";
	if ((substr($_,0,6) eq $litmonth." ".$pday) && (substr($_,7,8) ge substr($nwdate,7,8)) && ($flag == 0)) { # from now on it becomes interesting
	    $flag = 1;
	}
	#print substr($_,0,15)."-".$nwdate."*\n";
	if ($flag == 1) {
    	    if (index($_,"NetWorker savegroup") > 0) {
		if (index($_,"completed") > 0){
		    $pos = index($_,"savegroup:");
		    $savegrp = substr($_,$pos+11);
		    $pos = index($savegrp,")");
		    $savegrp = substr($savegrp,$pos+2);
		    $pos = index($savegrp," ");
		    $savegrp = substr($savegrp,0,$pos);
		    $pos = index($_,"Hostname");
		    $unres = substr($_,$pos-3,2);
		    $pos = index($_,"Failed");
		    $failed = substr($_,$pos-3,2);
		    $pos = index($_,"Succeeded");
		    $succeed = substr($_,$pos-3,2);
		    if ($unres > 0 ) {
			$savegroupsU = $savegroupsU." ".$savegrp;
		    }
		    if ($failed > 0 ) {
			$pos = rindex($_,"(");
			$errtext = substr($_,$pos);
			$savegroupsF = $savegroupsF." ".$savegrp.$errtext;
		    #print $_."\n";
		    }
		    #print $_."\n";
		    #print "Ergebnis: ".$savegrp."-".$unres."-".$failed."-".$succeed."\n";
		    #print "Fehlerstring: ".$savegroupsF."\n";
		    #getc();
		}
	    }
	}
    }
    close IN;
    $statust = "OK - No unresolved Hosts or failed Savegroups during the last ".$InputMinutes." Minutes";
    $ret = 0;
    if ($savegroupsU ne "") {
	$ret = 1;
	if (length($savegroupsF) > 100) {
	    $savegroupsU = substr($savegroupsU,0,100);
	    $statust = "WARNING - (Message truncated) Unresolved Hostnames in Savegroup(s)".$savegroupsU." failed";
	}
	else {
	    $statust = "WARNING - Unresolved Hostnames in Savegroup(s)".$savegroupsU." ";
	}
    }
    if ($savegroupsF ne "") {
	$ret = 2;
	if (length($savegroupsF) > 100) {
	    $savegroupsF = substr($savegroupsF,0,100);
	    $statust = "ERROR - (Message truncated) Savegroup(s)".$savegroupsF." failed";
	}
	else {
	    $statust = "ERROR - Savegroup(s)".$savegroupsF." failed";
	}
    }
    return $ret;
}

sub num2date {
    my $InNum = shift;
    my $ret = "";
    
    return $ret;
}

sub date2num {
    my $InNum = shift;
    my $ret = "";
    
    return $ret;
}

sub add_pool_percent {
    	my $InputString = shift;
    	my $InputString2 = shift;
	$InputString2 = substr($InputString2,0,3);
	my $i;
	my $ff = 0;
	my $fret = "N/A";
	for ($i = 0 ; $i < $cc_slot ; $i++) {
	    if ($InputString eq $jb_volnum[$i]) {
		$fret = $jb_pool[$i];
		$ff = $i;
	    }
	}
	for ($i = 0 ; $i < $cc_pool ; $i++) {
	    if ($fret eq $jb_poolname[$i]) {
		$jb_poolpercent[$i] = $jb_poolpercent[$i] + $InputString2;
		if ($InputString2 == 0) {
		    $jb_poolfreetapes[$i] = $jb_poolfreetapes[$i] + 1;
		}
		$ff = $cc_pool;
	    }
	}
	return $fret;
}

sub add_pool_tape {
    	my $InputString = shift;
	my $i;
	my $ff = 0;
	for ($i = 0 ; $i < $cc_pool ; $i++) {
	    if ($InputString eq $jb_poolname[$i]) {
		$jb_pooltapes [$i] = $jb_pooltapes[$i] + 1;
		$ff = $i;
		$i = $cc_pool;
	    }
	}
	if ($ff eq 0) {
	    $jb_poolname[$cc_pool] = $InputString;
	    $jb_pooltapes[$cc_pool] = 1;
	    $jb_poolfreetapes[$cc_pool] = 0;
	    $cc_pool = $cc_pool + 1;
	}
}

sub get_pool_num {
    	my $InputString = shift;
	my $i;
	my $ff = 0;
	for ($i = 0 ; $i < $cc_pool ; $i++) {
	    #print "Suche: ".$InputString."-".$jb_poolname[$i]."\n";
	    if ($InputString eq $jb_poolname[$i]) {
		$ff = $i;
		$i = $cc_pool;
	    }
	}
	return $ff;
}

sub IsInPool {
    	my $InputString = shift;
	my $i;
	my $ff = "";
	for ($i = 0;$i < $cc_slot+1;$i++) {
	    if ($jb_volnum[$i] eq $InputString) {
		$ff = $jb_pool[$i];
		$i = $cc_slot;
	    }
	}
	return $ff;
}

sub IsNumeric {
    	my $InputString = shift;
    	
	if ($InputString eq "") {
    		return 0;
	}
    	if ($InputString !~ /^[0-9|.|,]*$/) {
    		return 0;
    	}
    	else {
    		return 1;	
    	}	
    }

sub trimwhitespace($)
{
	my $string = shift;
	$string =~ s/^\s+//;
	$string =~ s/\s+$//;
	return $string;
}
