hwraid/wrapper-scripts/megaide-status

120 lines
3.9 KiB
Python
Executable File

#!/usr/bin/python
import os
import re
import sys
if len(sys.argv) > 2:
print "Usage: megaide-status [-d]"
sys.exit(1)
printarray = True
printcontroller = True
if len(sys.argv) > 1:
if sys.argv[1] == "-d":
printarray = False
printcontroller = False
else:
print "Usage: megaide-status [-d]"
sys.exit(1)
def returnControllerNumber():
for dir in os.listdir("/proc/megaide/"):
# We don't really care about how many entries are
# First is 0, last one is number
number = dir
return int(number)
def returnArrayNumber(controllerid):
list()
for array in os.listdir("/proc/megaide/" + str(controllerid) + "/logicaldrives/"):
absopath = "/proc/megaide/" + str(controllerid) + "/logicaldrives/" + array
if os.system('grep -q "This logical drive is not present" ' + absopath):
return int(array.strip("_info").strip("log_drv_"))
def returnArrayInfo(controllerid, arrayid):
id = "c" + str(controllerid) + "u" + str(arrayid)
f = open("/proc/megaide/" + str(controllerid) + "/logicaldrives/" + "log_drv_" + str(arrayid) + "_info")
for line in f:
if re.match(r"^RAID Level :.*$", line.strip()):
type = "RAID" + line.split("Status")[0].strip().split()[4]
if re.match(r"^Sectors :.*$", line.strip()):
size = line.split("Stripe Size")[0].split(":")[1].strip()
size = str(int(round(float(size) * 512 / 1000 / 1000 / 1000))) + "G"
if re.match(r"^.*Status :.*$", line.strip()):
state = line.split("Status")[1].split(":")[1].strip()
f.close()
return [id, type, size, state]
def returnDiskInfo():
# Megaide module report all available port, even there's no disk on it
# The problem is that an used offline disk will be reported as NOT PRESET
# So we can't know if it's not used or failed
# Let's use a conf file for this
# Conf file should looks like:
# c0u0d0
# c0u0d2
# If logical drive 0 uses disk 0 and disk 2 (chan0 disk0, chan1 disk 0)
f = open("/etc/megaide-status.conf")
table = []
for line in f:
if re.match("^c[0-9]+u[0-9]+p[0-9]+$", line.strip()):
# Valid disk entry
controllerid = line.split("u")[0].strip().strip("c")
diskid = line.split("p")[1].strip()
id = line.strip()
f2 = open("/proc/megaide/" + controllerid + "/physicaldrives/phy_drv_" + diskid + "_info")
for line in f2:
if re.match("^Model No :.*$", line.strip()):
model = line.split(":")[1].strip()
if re.match("^Status :.*$", line.strip()):
state = line.split()[2].strip()
if re.match("^Drive is Not Present.*$", line.strip()):
model = "Unknown"
state = "OFFLINE"
f2.close()
table.append([id, state, model])
f.close()
return table
controllernumber = returnControllerNumber()
bad = False
if printarray:
controllerid = 0
print "-- Arrays informations --"
print "-- ID | Type | Size | Status"
while controllerid <= controllernumber:
arrayid = 0
arraynumber = returnArrayNumber(controllerid)
while arrayid <= arraynumber:
arrayinfo = returnArrayInfo(controllerid, arrayid)
print arrayinfo[0] + " | " + arrayinfo[1] + " | " + arrayinfo[2] + " | " + arrayinfo[3]
arrayid += 1
if not arrayinfo[3] == "ONLINE":
bad = True
controllerid += 1
print ""
print "-- Disks informations"
print "-- ID | Model | Status"
controllerid = 0
while controllerid <= controllernumber:
diskinfo = returnDiskInfo()
for disk in diskinfo:
print disk[0] + " | " + disk[2] + " | " + disk[1]
if not disk[1] == "ONLINE":
bad = True
controllerid += 1
if bad:
print "\nThere is at least one disk/array in a NOT OPTIMAL state."
sys.exit(1)