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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
#!/usr/bin/python
import sys
import commands
import json
import random
import argparse
import livestatus
import os
from glusternagios import utils
from constants import NRPE_PATH
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 %s %s" % (args.volume, 'info'))
def _getVolQuotaStatusNRPECommand(args):
return ("check_vol_status -a %s %s" % (args.volume, 'quota'))
def _getVolSelfHealStatusNRPECommand(args):
return ("check_vol_status -a %s %s" % (args.volume, 'self-heal'))
def _getVolGeoRepStatusNRPECommand(args):
return ("check_vol_status -a %s %s" % (args.volume, 'geo-rep'))
def _getNRPEBaseCmd(host):
return NRPE_PATH + " -H " + host + " -c "
def execNRPECommand(command):
status, output = commands.getstatusoutput(command)
return os.WEXITSTATUS(status), output
def _getVolumeStatusOutput(args):
status, output = _executeRandomHost(_getVolStatusNRPECommand(args))
if status == utils.PluginStatusCode.OK:
#Following query will return the output in format [[2,0]]
#no.of bricks in OK state - 2 , CRITICAL state - 0
brick_states_output = livestatus.readLiveStatusAsJSON(
"GET services\n"
"Filter: host_groups >= %s\n"
"Filter: custom_variable_values >= %s\n"
"Filter: description ~ Brick Status - \n"
"Stats: state = 0\n"
"Stats: state = 2\n"
% (args.hostgroup, args.volume))
brick_states = json.loads(brick_states_output)
bricks_ok = brick_states[0][0]
bricks_critical = brick_states[0][1]
if bricks_ok == 0 and bricks_critical > 0:
status = utils.PluginStatusCode.CRITICAL
output = "All the bricks are in CRITICAL state"
elif bricks_critical > 0:
status = utils.PluginStatusCode.WARNING
output = "One or more bricks are in CRITICAL state"
return status, output
def _getVolumeQuotaStatusOutput(args):
# get current volume quota status
table = livestatus.readLiveStatus("GET services\n"
"Columns: state long_plugin_output\n"
"Filter: description = "
"Volume Status Quota - %s" % args.volume)
servicestatus = utils.PluginStatusCode.UNKNOWN
statusoutput = ''
if len(table) > 0:
servicetab = table[0]
servicestatus = servicetab[0]
statusoutput = servicetab[1]
if (int(servicestatus) == utils.PluginStatusCode.OK and
statusoutput.find("QUOTA: OK") > -1):
# if ok, don't poll
return servicestatus, statusoutput
return _executeRandomHost(_getVolQuotaStatusNRPECommand(args))
def _executeRandomHost(command):
list_hosts = _getListHosts(args)
host = random.choice(list_hosts)
#Get the address of the host
host_address = _getHostAddress(host)
status, output = execNRPECommand(_getNRPEBaseCmd(host_address) + command)
if status != utils.PluginStatusCode.UNKNOWN:
return status, output
#random 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(_getNRPEBaseCmd(_getHostAddress(host))
+ command)
if status != utils.PluginStatusCode.UNKNOWN:
return status, output
return status, output
def showVolumeOutput(args):
if args.option == 'status':
return _getVolumeStatusOutput(args)
elif args.option == 'utilization':
command = _getVolUtilizationNRPECommand(args)
elif args.option == 'quota':
return _getVolumeQuotaStatusOutput(args)
elif args.option == 'self-heal':
command = _getVolSelfHealStatusNRPECommand(args)
elif args.option == 'geo-rep':
command = _getVolGeoRepStatusNRPECommand(args)
return _executeRandomHost(command)
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',
'quota',
'self-heal',
'geo-rep'])
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)
|