#!/usr/bin/perl -w
####
#       Author:         Zhivko Todorov <ztodorov@neterra.net>
#       Date:           07-Jan-2015
#       Version:        0.0.3
#       License:        GPL
####

# WARNING:
# ipvsadmin requires root privileges to run so
# user running the script must be in sudoers file

use strict;
use warnings;
use Getopt::Long;

# Nagios parsable return codes
use constant OK       => 0;
use constant UNKNOWN  => 3;

MAIN:
{
        # Values for variable below will be collected from CLI
        my $sudo_path     = undef(); # Path to sudo
        my $ipvsadm_path  = undef(); # Path to ipvsadm
    	my $virtualhost   = undef(); # Virtual hostname as shown in ipvsadmin
        my $help          = undef(); # Ask for usage info.

        # Store Nmap output here.
        my @ipvsadm_raw = (); # Raw ipvsadm output

        # Receive command line parameters.
        GetOptions
        (
                "sudo=s"        => \$sudo_path,
                "ipvsadm=s"     => \$ipvsadm_path,
        	"virtualhost=s" => \$virtualhost,
                "help"          => \$help
        );

        # Show usage info.
        if($help)
        {
                showHelp();
                exit(OK);
        }

        # Parse command line arguments.
        if(!parseCLIArgs($sudo_path, $ipvsadm_path, $virtualhost))
        {
                print "Invalid command line arguments supplied.";
                showHelp();
                exit(UNKNOWN);
        }


        @ipvsadm_raw = `$sudo_path $ipvsadm_path -L`;

        chomp(@ipvsadm_raw);

        if(grep(/$virtualhost/, @ipvsadm_raw))
        {
                print "Status: MASTER\n";
                exit(OK);
        }
        elsif(grep(/RemoteAddress/, @ipvsadm_raw))
        {
                print "Status: BACKUP\n";
                exit(OK);
        }

        print "Status: Unknown\n";
        exit(UNKNOWN);


} # END MAIN


sub parseCLIArgs
{
        my ($sudo_path, $ipvsadm_path, $virtualhost) = @_;

        return 0
                if(!$sudo_path or !-x $sudo_path);

        return 0
                if(!$ipvsadm_path or !-x $ipvsadm_path);

	return 0
                if(!$virtualhost);

        return 1;
} # END sub parseCLIArgs



sub showHelp
{
        my @showHelpMsg =
        (
                "USAGE:",
                "    -s --sudo  /path/to/sudo.",
                "    -i --ipvsadm  /path/to/ipvsadm.",
        	"    -v --virtualhost  Name of the virtual host.",
                "    -h --help  Display help message (this).",
                "",
        );

        print join("\n", @showHelpMsg);
} # END sub showHelp