#!/usr/bin/python import os import re import sys binarypath = "/usr/sbin/tw-cli" if len(sys.argv) > 2: print 'Usage: 3ware-status [--nagios]' sys.exit(1) nagiosmode=False nagiosoutput='' nagiosgoodarray=0 nagiosbadarray=0 nagiosgooddisk=0 nagiosbaddisk=0 if len(sys.argv) > 1: if sys.argv[1] == '--nagios': nagiosmode=True else: print 'Usage: 3ware-status [--nagios]' sys.exit(1) # Check binary exists (and +x), if not print an error message # or return UNKNOWN nagios error code if os.path.exists(binarypath) and os.access(binarypath, os.X_OK): pass else: if nagiosmode: print 'UNKNOWN - Cannot find '+binarypath else: print 'Cannot find '+binarypath+'. Please install it.' sys.exit(3) # Get command output def getOutput(cmd): output = os.popen(cmd) lines = [] for line in output: if not re.match(r'^$',line.strip()): lines.append(line.strip()) return lines def returnControllerList(output): lines = [] for line in output: if re.match(r'^c[0-9]+\s.*$',line.strip()): lines.append(line.split()[0]) return lines def returnDiskList(output): lines = [] for line in output: if re.match(r'^[p][0-9]+\s.*$',line.strip()): # Shoudl contain something like 'u0' # '-' means the drive doesn't belong to any array # If is NOT PRESENT too, it just means this is an empty port if not line.split()[2].strip() == '-' and not line.split()[1].strip() == 'NOT-PRESENT': lines.append(line.split()) if fake_failure: lines[0][1] = 'NOT PRESENT' return lines def returnArrayList(output): lines = [] for line in output: if re.match(r'^[u][0-9]+\s.*$',line.strip()): lines.append(line.split()) if fake_failure: lines[0][2] = 'DEGRADED' return lines # A way to force a fake failure fake_failure = False if os.path.exists('/root/fake_3ware_failure'): fake_failure = True cmd = binarypath+' info' output = getOutput(cmd) controllerlist = returnControllerList(output) bad = False # List available controller if not nagiosmode: print '-- Controller informations --' print '-- ID | Model' for controller in controllerlist: cmd = binarypath+' info '+controller+' model' # https://github.com/eLvErDe/hwraid/issues/69 try: model = getOutput(cmd)[0].split(' = ')[1].strip() except IndexError: model = 'N/A' print controller+' | '+model print '' # List arrays if not nagiosmode: print '-- Arrays informations --' print '-- ID\tType\tSize\tStatus' for controller in controllerlist: cmd = binarypath+' info '+controller output = getOutput(cmd) arraylist = returnArrayList(output) for array in arraylist: type = array[1].replace('-','') id = controller+array[0] size = array[6].split('.')[0]+'G' status = array[2] if not status in ['OK','VERIFYING']: bad = True nagiosbadarray=nagiosbadarray+1 else: nagiosgoodarray=nagiosgoodarray+1 if not nagiosmode: print id+'\t'+type+'\t'+size+'\t'+status if not nagiosmode: print '' # List disks if not nagiosmode: print '-- Disks informations' print '-- ID\tModel\t\t\tStatus' for controller in controllerlist: cmd = binarypath+' info '+controller output = getOutput(cmd) disklist = returnDiskList(output) for disk in disklist: id = controller+disk[2]+disk[0] cmd = binarypath+' info '+controller+' '+disk[0]+' model' model = getOutput(cmd)[0].split(' = ')[1].strip() cmd = binarypath+' info '+controller+' '+disk[0]+' status' status = getOutput(cmd)[0].split(' = ')[1].strip() if not status == 'OK': bad = True nagiosbaddisk=nagiosbaddisk+1 else: nagiosgooddisk=nagiosgooddisk+1 if not nagiosmode: print id+'\t'+model+'\t'+status if nagiosmode: if bad: print 'RAID ERROR - Arrays: OK:'+str(nagiosgoodarray)+' Bad:'+str(nagiosbadarray)+' - Disks: OK:'+str(nagiosgooddisk)+' Bad:'+str(nagiosbaddisk) sys.exit(2) else: print 'RAID OK - Arrays: OK:'+str(nagiosgoodarray)+' Bad:'+str(nagiosbadarray)+' - Disks: OK:'+str(nagiosgooddisk)+' Bad:'+str(nagiosbaddisk) else: if bad: print '\nThere is at least one disk/array in a NOT OPTIMAL state.' sys.exit(1)