check_hpacucli.py: pep8 cleanup

This commit is contained in:
Pall Sigurdsson 2013-05-27 16:58:58 +00:00
parent f06667b55d
commit 5eb8ce9199
1 changed files with 130 additions and 102 deletions

View File

@ -23,19 +23,15 @@
debugging = False debugging = False
# No real need to change anything below here # No real need to change anything below here
version="1.1" version = "1.1"
ok=0 ok = 0
warning=1 warning = 1
critical=2 critical = 2
unknown=3 unknown = 3
not_present = -1 not_present = -1
nagios_status = -1 nagios_status = -1
state = {} state = {}
state[not_present] = "Not Present" state[not_present] = "Not Present"
state[ok] = "OK" state[ok] = "OK"
@ -44,53 +40,58 @@ state[critical] = "Critical"
state[unknown] = "Unknown" state[unknown] = "Unknown"
longserviceoutput="\n" longserviceoutput = "\n"
perfdata="" perfdata = ""
summary="" summary = ""
sudo=False sudo = False
from sys import exit from sys import exit
from sys import argv from sys import argv
from os import getenv,putenv,environ from os import getenv, putenv, environ
import subprocess import subprocess
def print_help(): def print_help():
print "check_hpacucli version %s" % version print "check_hpacucli version %s" % version
print "This plugin checks HP Array with the hpacucli command" print "This plugin checks HP Array with the hpacucli command"
print "" print ""
print "Usage: %s " % argv[0] print "Usage: %s " % argv[0]
print "Usage: %s [--help]" % argv[0] print "Usage: %s [--help]" % argv[0]
print "Usage: %s [--version]" % argv[0] print "Usage: %s [--version]" % argv[0]
print "Usage: %s [--path </path/to/hpacucli>]" % argv[0] print "Usage: %s [--path </path/to/hpacucli>]" % argv[0]
print "Usage: %s [--no-perfdata]" % argv[0] print "Usage: %s [--no-perfdata]" % argv[0]
print "Usage: %s [--no-longoutput]" % argv[0] print "Usage: %s [--no-longoutput]" % argv[0]
print "" print ""
def error(errortext): def error(errortext):
print "* Error: %s" % errortext print "* Error: %s" % errortext
print_help() print_help()
print "* Error: %s" % errortext print "* Error: %s" % errortext
exit(unknown) exit(unknown)
def debug( debugtext ):
global debugging def debug(debugtext):
if debugging: global debugging
print debugtext if debugging:
print debugtext
def runCommand(command): def runCommand(command):
""" Runs command from the shell prompt. Exit Nagios style if unsuccessful""" """ Run command from the shell prompt. Exit Nagios style if unsuccessful"""
proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE,) proc = subprocess.Popen(command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout, stderr = proc.communicate('through stdin to stdout') stdout, stderr = proc.communicate('through stdin to stdout')
if proc.returncode > 0: if proc.returncode > 0:
print "Error %s: %s\n command was: '%s'" % (proc.returncode,stderr.strip(),command) print "Error %s: %s\n command was: '%s'"\
debug("results: %s" % (stdout.strip() ) ) % (proc.returncode, stderr.strip(), command)
if proc.returncode == 127: # File not found, lets print path debug("results: %s" % (stdout.strip()))
path=getenv("PATH") if proc.returncode == 127: # File not found, lets print path
path = getenv("PATH")
print "Check if your path is correct %s" % (path) print "Check if your path is correct %s" % (path)
if stderr.find('Password:') == 0 and command.find('sudo') == 0: if stderr.find('Password:') == 0 and command.find('sudo') == 0:
print "Check if user is in the sudoers file" print "Check if user is in the sudoers file"
@ -100,66 +101,79 @@ def runCommand(command):
else: else:
return stdout return stdout
def end(): def end():
global summary global summary
global longserviceoutput global longserviceoutput
global perfdata global perfdata
global nagios_status global nagios_status
print "%s - %s | %s" % (state[nagios_status], summary,perfdata) print "%s - %s | %s" % (state[nagios_status], summary, perfdata)
print longserviceoutput print longserviceoutput
if nagios_status < 0: nagios_status = unknown if nagios_status < 0:
nagios_status = unknown
exit(nagios_status) exit(nagios_status)
def add_perfdata(text): def add_perfdata(text):
global perfdata global perfdata
text = text.strip() text = text.strip()
perfdata = perfdata + " %s " % (text) perfdata = perfdata + " %s " % (text)
def add_long(text): def add_long(text):
global longserviceoutput global longserviceoutput
longserviceoutput = longserviceoutput + text + '\n' longserviceoutput = longserviceoutput + text + '\n'
def add_summary(text): def add_summary(text):
global summary global summary
summary = summary + text summary = summary + text
def set_path(path): def set_path(path):
current_path = getenv('PATH') current_path = getenv('PATH')
if current_path.find('C:\\') > -1: # We are on this platform if current_path.find('C:\\') > -1: # We are on this platform
if path == '': if path == '':
path = ";C:\Program Files\Hewlett-Packard\Sanworks\Element Manager for StorageWorks HSV" path = ";C:\Program Files\Hewlett-Packard\Sanworks\Element Manager for StorageWorks HSV"
path = path + ";C:\Program Files (x86)\Compaq\Hpacucli\Bin" path = path + ";C:\Program Files (x86)\Compaq\Hpacucli\Bin"
path = path + ";C:\Program Files\Compaq\Hpacucli\Bin" path = path + ";C:\Program Files\Compaq\Hpacucli\Bin"
else: path = ';' + path else:
else: # Unix/Linux, etc path = ';' + path
if path == '': path = ":/usr/sbin" else: # Unix/Linux, etc
else: path = ':' + path if path == '':
current_path = "%s%s" % (current_path,path) path = ":/usr/sbin"
else:
path = ':' + path
current_path = "%s%s" % (current_path, path)
environ['PATH'] = current_path environ['PATH'] = current_path
def run_hpacucli(run_type='controllers', controller=None): def run_hpacucli(run_type='controllers', controller=None):
if run_type=='controllers': if run_type == 'controllers':
command="hpacucli controller all show detail" command = "hpacucli controller all show detail"
elif run_type in ('logicaldisks','physicaldisks'): elif run_type in ('logicaldisks', 'physicaldisks'):
if 'Slot' not in controller: if 'Slot' not in controller:
add_summary( "Controller not found" ) add_summary("Controller not found")
end() end()
identifier = 'slot=%s' % (controller['Slot'] ) identifier = 'slot=%s' % (controller['Slot'])
if run_type=='logicaldisks': command = "hpacucli controller %s %s all show detail"
command = "hpacucli controller %s ld all show detail" % (identifier) if run_type == 'logicaldisks':
elif run_type=='physicaldisks': subcommand = 'ld'
command = "hpacucli controller %s pd all show detail" % (identifier) elif run_type == 'physicaldisks':
debug ( command ) subcommand = 'pd'
if sudo: command = "sudo " + command else:
end()
return
command = command % (subcommand, identifier)
debug(command)
if sudo:
command = "sudo " + command
output = runCommand(command) output = runCommand(command)
# Some basic error checking # Some basic error checking
error_strings = [ 'Permission denied' ] error_strings = ['Permission denied']
error_strings.append('Error: You need to have administrator rights to continue.') error_strings.append('Error: You need to have administrator rights to continue.')
for error in error_strings: for error in error_strings:
if output.find( error ) > -1 and output.find("sudo") != 0: if output.find(error) > -1 and output.find("sudo") != 0:
command = "sudo " + command command = "sudo " + command
print command print command
output = runCommand(command) output = runCommand(command)
@ -173,31 +187,41 @@ def run_hpacucli(run_type='controllers', controller=None):
continue continue
if i.startswith('Note:'): if i.startswith('Note:'):
continue continue
if run_type=='controllers' and i[0] != ' ': # No space on first line if run_type == 'controllers' and i[0] != ' ': # space on first line
if my_object and not my_object in objects: objects.append(my_object) if my_object and not my_object in objects:
objects.append(my_object)
my_object = {} my_object = {}
my_object['name'] = i my_object['name'] = i
elif run_type=='logicaldisks' and i.find('Logical Drive:') > 0: elif run_type == 'logicaldisks' and i.find('Logical Drive:') > 0:
if my_object and not my_object in objects: objects.append(my_object) if my_object and not my_object in objects:
objects.append(my_object)
my_object = {} my_object = {}
my_object['name'] = i.strip() my_object['name'] = i.strip()
elif run_type=='physicaldisks' and i.find('physicaldrive') > 0: elif run_type == 'physicaldisks' and i.find('physicaldrive') > 0:
if my_object and not my_object in objects: objects.append(my_object) if my_object and not my_object in objects:
objects.append(my_object)
my_object = {} my_object = {}
my_object['name'] = i.strip() my_object['name'] = i.strip()
else: else:
i = i.strip() i = i.strip()
if i.find(':') < 1: continue if i.find(':') < 1:
continue
i = i.split(':') i = i.split(':')
if i[0] == '': continue # skip empty lines if i[0] == '':
if len(i) == 1: continue continue # skip empty lines
if len(i) == 1:
continue
key = i[0].strip() key = i[0].strip()
value = ' '.join( i[1:] ).strip() value = ' '.join(i[1:]).strip()
my_object[key] = value my_object[key] = value
if my_object and not my_object in objects: objects.append(my_object) if my_object and not my_object in objects:
objects.append(my_object)
return objects return objects
controllers = [] controllers = []
def check_controllers(): def check_controllers():
global controllers global controllers
status = -1 status = -1
@ -207,26 +231,28 @@ def check_controllers():
global nagios_state global nagios_state
nagios_state = unknown nagios_state = unknown
end() end()
add_summary( "Found %s controllers" % ( len(controllers) ) ) add_summary("Found %s controllers" % (len(controllers)))
for i in controllers: for i in controllers:
controller_status = check(i, 'Controller Status', 'OK' ) controller_status = check(i, 'Controller Status', 'OK')
status = max(status, controller_status) status = max(status, controller_status)
cache_status = check(i, 'Cache Status' ) cache_status = check(i, 'Cache Status')
status = max(status, cache_status) status = max(status, cache_status)
controller_serial = 'n/a' controller_serial = 'n/a'
cache_serial = 'n/a' cache_serial = 'n/a'
if i.has_key('Serial Number'): if 'Serial Number' in i:
controller_serial = i['Serial Number'] controller_serial = i['Serial Number']
if i.has_key('Cache Serial Number'): if 'Cache Serial Number' in i:
cache_serial = i['Cache Serial Number'] cache_serial = i['Cache Serial Number']
add_long ( "%s" % (i['name']) ) add_long("%s" % (i['name']))
add_long( "- Controller Status: %s (sn: %s)" % ( state[controller_status], controller_serial ) ) add_long("- Controller Status: %s (sn: %s)"
add_long( "- Cache Status: %s (sn: %s)" % ( state[cache_status], cache_serial ) ) % (state[controller_status], controller_serial))
add_long("- Cache Status: %s (sn: %s)"
% (state[cache_status], cache_serial))
if controller_status > ok or cache_status > ok: if controller_status > ok or cache_status > ok:
add_summary( ";%s on %s;" % (state[controller_status], i['name']) ) add_summary(";%s on %s;" % (state[controller_status], i['name']))
add_summary(', ') add_summary(', ')
return status return status
@ -238,33 +264,35 @@ def check_logicaldisks():
controllers = run_hpacucli() controllers = run_hpacucli()
logicaldisks = [] logicaldisks = []
for controller in controllers: for controller in controllers:
for ld in run_hpacucli(run_type='logicaldisks', controller=controller): for ld in run_hpacucli(run_type='logicaldisks',
logicaldisks.append ( ld ) controller=controller):
logicaldisks.append(ld)
status = -1 status = -1
add_long("\nChecking logical Disks:" ) add_long("\nChecking logical Disks:")
add_summary( "%s logicaldisks" % ( len(logicaldisks) ) ) add_summary("%s logicaldisks" % (len(logicaldisks)))
for i in logicaldisks: for i in logicaldisks:
ld_status = check(i, 'Status' ) ld_status = check(i, 'Status')
status = max(status, ld_status) status = max(status, ld_status)
mount_point = i['Mount Points'] mount_point = i['Mount Points']
add_long( "- %s (%s) = %s" % (i['name'], mount_point, state[ld_status]) ) add_long("- %s (%s) = %s" % (i['name'], mount_point, state[ld_status]))
add_summary(". ") add_summary(". ")
def check_physicaldisks(): def check_physicaldisks():
global controllers global controllers
disktype='physicaldisks' disktype = 'physicaldisks'
if len(controllers) < 1: if len(controllers) < 1:
controllers = run_hpacucli() controllers = run_hpacucli()
disks = [] disks = []
for controller in controllers: for controller in controllers:
for disk in run_hpacucli(run_type=disktype, controller=controller): for disk in run_hpacucli(run_type=disktype, controller=controller):
disks.append ( disk ) disks.append(disk)
status = -1 status = -1
add_long("\nChecking Physical Disks:" ) add_long("\nChecking Physical Disks:")
add_summary( "%s %s" % ( len(disks), disktype ) ) add_summary("%s %s" % (len(disks), disktype))
for i in disks: for i in disks:
disk_status = check(i, 'Status' ) disk_status = check(i, 'Status')
status = max(status, disk_status) status = max(status, disk_status)
size = i['Size'] size = i['Size']
@ -272,20 +300,23 @@ def check_physicaldisks():
interface = i['Interface Type'] interface = i['Interface Type']
serial = i['Serial Number'] serial = i['Serial Number']
model = i['Model'] model = i['Model']
add_long( "- %s, %s, %s = %s" % (i['name'], interface, size, state[disk_status]) ) add_long("- %s, %s, %s = %s" %
(i['name'], interface, size, state[disk_status])
)
if disk_status > ok: if disk_status > ok:
add_long( "-- Replace drive, firmware=%s, model=%s, serial=%s" % (firmware,model, serial)) error_str = "-- Replace drive, firmware=%s, model=%s, serial=%s"
add_long(error_str % (firmware, model, serial))
if status > ok: if status > ok:
add_summary( "(errors)" ) add_summary("(errors)")
add_summary(". ") add_summary(". ")
def check(my_object, field, valid_states = None): def check(my_object, field, valid_states=None):
if valid_states is None: if valid_states is None:
valid_states = ['OK'] valid_states = ['OK']
state = -1 state = -1
global nagios_status global nagios_status
if my_object.has_key(field): if field in my_object:
if my_object[field] in valid_states: if my_object[field] in valid_states:
state = ok state = ok
else: else:
@ -294,7 +325,6 @@ def check(my_object, field, valid_states = None):
return state return state
def parse_arguments(): def parse_arguments():
arguments = argv[1:] arguments = argv[1:]
while len(arguments) > 0: while len(arguments) > 0:
@ -316,8 +346,6 @@ def parse_arguments():
exit(unknown) exit(unknown)
def main(): def main():
parse_arguments() parse_arguments()
set_path('') set_path('')