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