#!/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)