mirror of
				https://github.com/eLvErDe/hwraid.git
				synced 2025-10-31 03:14:26 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/python
 | |
| 
 | |
| import os
 | |
| import re
 | |
| import sys
 | |
| 
 | |
| binarypath = "/usr/sbin/megasasctl"
 | |
| 
 | |
| if len(sys.argv) > 2:
 | |
|     print 'Usage: megaraidsas-status [-d]'
 | |
|     sys.exit(1)
 | |
| 
 | |
| printarray = True
 | |
| if len(sys.argv) > 1:
 | |
|     if sys.argv[1] == '-d':
 | |
|         printarray = False
 | |
|     else:
 | |
|         print 'Usage: megaraidsas-status [-d]'
 | |
|         sys.exit(1)
 | |
| 
 | |
| # Check binary exists (and +x), if not print an error message
 | |
| if os.path.exists(binarypath) and os.access(binarypath, os.X_OK):
 | |
| 	pass
 | |
| else:
 | |
| 	sys.exit(3)
 | |
| 
 | |
| # Get command output
 | |
| def getOutput(cmd):
 | |
|     output = os.popen(cmd)
 | |
|     lines = []
 | |
|     for line in output:
 | |
|         if not re.match(r'^$',line.strip()):
 | |
|             lines.append(line.strip())
 | |
|     return lines
 | |
|     
 | |
| def returnDiskList(output):
 | |
|     lines = []
 | |
|     for line in output:
 | |
|         if re.match(r'^[a-z][0-9]+[a-z][0-9\*]+[a-z][0-9]+\s.*$',line.strip()):
 | |
|             list = line.split()
 | |
|             # Let's hack... Some disk may report smart error after status
 | |
|             # Get theses errors, join them into one list item and place it
 | |
|             # before status
 | |
|             errindex = False
 | |
|             try:
 | |
|                 errindex = list.index('errs:')
 | |
|             except ValueError:
 | |
|                 pass
 | |
|             if errindex:
 | |
|                 list.insert(errindex-1, ' '.join(list[errindex:]))
 | |
|                 list = list[:errindex+1]
 | |
|             lines.append(list)
 | |
|     if fake_failure:
 | |
|         lines[0][-1] = 'BAD'
 | |
|     return lines
 | |
| 
 | |
| def returnArrayList(output):
 | |
|     lines = []
 | |
|     for line in output:
 | |
|         if re.match(r'^[a-z][0-9]+[a-z][0-9]+\s.*$',line.strip()):
 | |
|             lines.append(line.split())
 | |
|     if fake_failure:
 | |
|         lines[0][-1] = 'DEGRADED'
 | |
|     return lines
 | |
| 
 | |
| # A way to force a fake failure
 | |
| fake_failure = False
 | |
| if os.path.exists('/root/fake_megaraid_failure'):
 | |
|     fake_failure = True
 | |
| 
 | |
| cmd = binarypath+' -v'
 | |
| output = getOutput(cmd)
 | |
| disklist = returnDiskList(output)
 | |
| arraylist = returnArrayList(output)
 | |
| 
 | |
| if printarray:
 | |
|     print '-- Arrays informations --'
 | |
|     print '-- ID | Type | Size | Status'
 | |
|     for array in arraylist:
 | |
|         print array[0]+' | '+array[2]+' '+array[3]+' | '+array[1]+' | '+array[-1]
 | |
|     print ''
 | |
| 
 | |
| print '-- Disks informations'
 | |
| print '-- ID | Model | Status | Warnings'
 | |
| for disk in disklist:
 | |
|     # Check if there's some smart non critical warnings
 | |
|     if re.match(r'^errs:.*$', disk[-2]):
 | |
|         # Some disk may have vendor or model containing spaces
 | |
|         print disk[0]+' | '+' '.join(disk[1:-3])+' | '+disk[-1]+' | '+disk[-2]
 | |
|     else:
 | |
|         print disk[0]+' | '+' '.join(disk[1:-2])+' | '+disk[-1]
 | |
| 
 | |
| # Check if there's a bad disk
 | |
| bad = False
 | |
| for array in arraylist:
 | |
|     if not array[-1] == 'optimal':
 | |
|         bad = True
 | |
| 
 | |
| for disk in disklist:
 | |
|     if disk[-1] not in [ 'online', 'hotspare', 'ready' ]:
 | |
|         bad = True
 | |
| 
 | |
| if bad:
 | |
|     print '\nThere is at least one disk/array in a NOT OPTIMAL state.'
 | |
|     sys.exit(1)
 |