hwraid/wrapper-scripts/megaide-status

115 lines
3.8 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)