mirror of https://github.com/eLvErDe/hwraid.git
109 lines
2.9 KiB
Python
109 lines
2.9 KiB
Python
#!/usr/bin/python
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
binarypath = "/usr/sbin/megasasctl"
|
|
|
|
if len(sys.argv) > 2:
|
|
print("Usage: megaraidsas-status [-d]")
|
|
sys.exit(1)
|
|
|
|
printarray = True
|
|
if len(sys.argv) > 1:
|
|
if sys.argv[1] == "-d":
|
|
printarray = False
|
|
else:
|
|
print("Usage: megaraidsas-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)
|