summaryrefslogtreecommitdiffstats
path: root/plugins/check_vol_server.py
blob: 87ca269bda249a9736cbf90889dcf79d66b0b4d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/python
import sys
import commands
import random
import argparse
import livestatus
import os
from glusternagios import utils

_NRPEPath = "/usr/lib64/nagios/plugins/check_nrpe"


def _getListHosts(args):
    table = livestatus.readLiveStatus("GET hostgroups\nColumns: members\n"
                                      "Filter: name = "
                                      + args.hostgroup + "\n")
    tab1 = table[0]
    list_hosts = tab1[0].split(",")
    #First take a random host from the group and send the request
    return list_hosts


def _getHostAddress(host):
    # Get the address of the host
    host_address = livestatus.checkLiveStatus("GET hosts\nColumns: address\n"
                                        "Filter: display_name = "
                                        + host + "\n")
    return host_address.rstrip()


def _getVolUtilizationNRPECommand(args):
    return ("check_vol_utilization -a " + args.volume + " " +
                   str(args.warning) + " " + str(args.critical))


def _getVolStatusNRPECommand(args):
    return ("check_vol_status -a " + args.volume)


def _getNRPEBaseCmd(host):
    return _NRPEPath + " -H " + host + " -c ";


def execNRPECommand(command):
    status, output = commands.getstatusoutput(command)
    return os.WEXITSTATUS(status), output


def showVolumeOutput(args):
    list_hosts = _getListHosts(args)
    host = random.choice(list_hosts)
    #Get the address of the host
    host_address = _getHostAddress(host)

    if args.option == 'status':
        command = _getVolStatusNRPECommand(args)
    elif args.option == 'utilization':
        command = _getVolUtilizationNRPECommand(args)

    status, output = execNRPECommand(_getNRPEBaseCmd(host_address) + command)

    if status != utils.PluginStatusCode.UNKNOWN:
        return status, output
    for host in list_hosts:
        status, output = execNRPECommand(_getNRPEBaseCmd(_getHostAddress(host))
                                         + command)
        if status != utils.PluginStatusCode.UNKNOWN:
            return status, output
            break
    return status, output

    #if success return from here
    if "Volume Utilization" in output:
        return status, output
    #radom host is not able to execute the command
    #Now try to iterate through the list of hosts
    #in the host group and send the command until
    #the command is successful
    for host in list_hosts:
        status, output = execNRPECommand(host, args)
        #if success return from here
        if "Volume Utilization" in output:
            return status, output
            break
    return status, output


def parse_input():
    parser = argparse.ArgumentParser(
        usage='%(prog)s [-h] <hostgroup>  <volume> -w <Warning>'
        ' -c <Critical> [-o|--option]')
    parser.add_argument(
        "hostgroup",
        help="Name of the hostgroup to which the volume belongs")
    parser.add_argument(
        "volume",
        help="Name of the volume being queried")
    parser.add_argument(
        "-w",
        "--warning",
        action="store",
        type=int,
        default=70,
        help="Warning Threshold in percentage")
    parser.add_argument(
        "-c",
        "--critical",
        action="store",
        type=int,
        default=90,
        help="Critical Threshold in percentage")
    parser.add_argument('-o', '--option',
                        action='store',
                        help='the volume option to check',
                        choices=['utilization',
                                 'status'])
    args = parser.parse_args()
    if args.critical <= args.warning:
        print "UNKNOWN:Critical must be greater than Warning."
        sys.exit(utils.PluginStatusCode.UNKNOWN)
    return args

if __name__ == '__main__':
    args = parse_input()
    status, output = showVolumeOutput(args)
    print output
    exit(status)