mirror of https://github.com/eLvErDe/hwraid.git
106 lines
2.8 KiB
Python
106 lines
2.8 KiB
Python
#!/usr/bin/python
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
binarypath = "/usr/sbin/megactl"
|
|
|
|
if len(sys.argv) > 2:
|
|
print 'Usage: megaraid-status [-d]'
|
|
sys.exit(1)
|
|
|
|
printarray = True
|
|
if len(sys.argv) > 1:
|
|
if sys.argv[1] == '-d':
|
|
printarray = False
|
|
else:
|
|
print 'Usage: megaraid-status [-d]'
|
|
sys.exit(1)
|
|
|
|
# Check binary exists (and +x), if not print an error message
|
|
if os.path.exists(binarypath) and os.access(binarypath, os.X_OK):
|
|
pass
|
|
else:
|
|
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 returnDiskList(output):
|
|
lines = []
|
|
for line in output:
|
|
if re.match(r'^[a-z][0-9]+[a-z][0-9\*]+[a-z][0-9]+\s.*$',line.strip()):
|
|
list = line.split()
|
|
# Let's hack... Some disk may report smart error after status
|
|
# Get theses errors, join them into one list item and place it
|
|
# before status
|
|
errindex = False
|
|
try:
|
|
errindex = list.index('errs:')
|
|
except ValueError:
|
|
pass
|
|
if errindex:
|
|
list.insert(errindex-1, ' '.join(list[errindex:]))
|
|
list = list[:errindex+1]
|
|
lines.append(list)
|
|
if fake_failure:
|
|
lines[0][-1] = 'BAD'
|
|
return lines
|
|
|
|
def returnArrayList(output):
|
|
lines = []
|
|
for line in output:
|
|
if re.match(r'^[a-z][0-9]+[a-z][0-9]+\s.*$',line.strip()):
|
|
lines.append(line.split())
|
|
if fake_failure:
|
|
lines[0][-1] = 'DEGRADED'
|
|
return lines
|
|
|
|
# A way to force a fake failure
|
|
fake_failure = False
|
|
if os.path.exists('/root/fake_megaraid_failure'):
|
|
fake_failure = True
|
|
|
|
cmd = binarypath+' -v'
|
|
output = getOutput(cmd)
|
|
disklist = returnDiskList(output)
|
|
arraylist = returnArrayList(output)
|
|
|
|
if printarray:
|
|
print '-- Arrays informations --'
|
|
print '-- ID | Type | Size | Status'
|
|
for array in arraylist:
|
|
print array[0]+' | '+array[2]+' '+array[3]+' | '+array[1]+' | '+array[-1]
|
|
print ''
|
|
|
|
print '-- Disks informations'
|
|
print '-- ID | Model | Status | Warnings'
|
|
for disk in disklist:
|
|
# Check if there's some smart non critical warnings
|
|
if re.match(r'^errs:.*$', disk[-2]):
|
|
# Some disk may have vendor or model containing spaces
|
|
print disk[0]+' | '+' '.join(disk[1:-3])+' | '+disk[-1]+' | '+disk[-2]
|
|
else:
|
|
print disk[0]+' | '+' '.join(disk[1:-2])+' | '+disk[-1]
|
|
|
|
# Check if there's a bad disk
|
|
bad = False
|
|
for array in arraylist:
|
|
if not array[-1] == 'optimal':
|
|
bad = True
|
|
|
|
for disk in disklist:
|
|
if disk[-1] not in [ 'online', 'hotspare', 'ready' ]:
|
|
bad = True
|
|
|
|
if bad:
|
|
print '\nThere is at least one disk/array in a NOT OPTIMAL state.'
|
|
sys.exit(1)
|