mirror of
				https://github.com/xcat2/confluent.git
				synced 2025-10-31 19:32:33 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import subprocess
 | |
| import os
 | |
| 
 | |
| class DiskInfo(object):
 | |
|     def __init__(self, devname):
 | |
|         self.name = devname
 | |
|         self.wwn = None
 | |
|         self.path = None
 | |
|         self.model = ''
 | |
|         self.size = 0
 | |
|         self.driver = None
 | |
|         self.mdcontainer = ''
 | |
|         devnode = '/dev/{0}'.format(devname)
 | |
|         qprop = subprocess.check_output(
 | |
|             ['udevadm', 'info', '--query=property', devnode])
 | |
|         if not isinstance(qprop, str):
 | |
|             qprop = qprop.decode('utf8')
 | |
|         for prop in qprop.split('\n'):
 | |
|             if '=' not in prop:
 | |
|                 continue
 | |
|             k, v = prop.split('=', 1)
 | |
|             if k == 'DEVTYPE' and v != 'disk':
 | |
|                 raise Exception('Not a disk')
 | |
|             elif k == 'DM_NAME':
 | |
|                 raise Exception('Device Mapper')
 | |
|             elif k == 'ID_MODEL':
 | |
|                 self.model = v
 | |
|             elif k == 'DEVPATH':
 | |
|                 self.path = v
 | |
|             elif k == 'ID_WWN':
 | |
|                 self.wwn = v
 | |
|             elif k == 'MD_CONTAINER':
 | |
|                 self.mdcontainer = v
 | |
|         attrs = subprocess.check_output(['udevadm', 'info', '-a', devnode])
 | |
|         if not isinstance(attrs, str):
 | |
|             attrs = attrs.decode('utf8')
 | |
|         for attr in attrs.split('\n'):
 | |
|             if '==' not in attr:
 | |
|                 continue
 | |
|             k, v = attr.split('==', 1)
 | |
|             k = k.strip()
 | |
|             if k == 'ATTRS{size}':
 | |
|                 self.size = v.replace('"', '')
 | |
|             elif (k == 'DRIVERS' and not self.driver
 | |
|                     and v not in ('"sd"', '""')):
 | |
|                 self.driver = v.replace('"', '')
 | |
|         if not self.driver and 'imsm' not in self.mdcontainer:
 | |
|             raise Exception("No driver detected")
 | |
| 
 | |
|     @property
 | |
|     def priority(self):
 | |
|         if self.model.lower() in ('thinksystem_m.2_vd', 'thinksystem m.2'):
 | |
|             return 0
 | |
|         if 'imsm' in self.mdcontainer:
 | |
|             return 1
 | |
|         if self.driver == 'ahci':
 | |
|             return 2
 | |
|         if self.driver.startswith('megaraid'):
 | |
|             return 3
 | |
|         if self.driver.startswith('mpt'):
 | |
|             return 4
 | |
|         return 99
 | |
| 
 | |
|     def __repr__(self):
 | |
|         return repr({
 | |
|             'name': self.name,
 | |
|             'path': self.path,
 | |
|             'wwn': self.wwn,
 | |
|             'driver': self.driver,
 | |
|             'size': self.size,
 | |
|             'model': self.model,
 | |
|         })
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     disks = []
 | |
|     for disk in sorted(os.listdir('/sys/class/block')):
 | |
|         try:
 | |
|             disk = DiskInfo(disk)
 | |
|             disks.append(disk)
 | |
|         except Exception as e:
 | |
|             print("Skipping {0}: {1}".format(disk, str(e)))
 | |
|     nd = [x.name for x in sorted(disks, key=lambda x: x.priority)]
 | |
|     if nd:
 | |
|         open('/tmp/installdisk', 'w').write(nd[0])
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |