mirror of https://github.com/eLvErDe/hwraid.git
120 lines
3.9 KiB
Python
Executable File
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)
|