pass
reject_device('removable', 1, 'removable')
reject_device('ro', 1, 'read-only')
+ reject_device('locked', 1, 'locked')
self._valid = len(self._rejected_reasons) == 0
return self._valid
return device_name.startswith(('/dev/mapper', '/dev/dm-'))
+def is_locked_raw_device(disk_path):
+ """
+ A device can be locked by a third party software like a database.
+ To detect that case, the device is opened in Read/Write and exclusive mode
+ """
+ open_flags = (os.O_RDWR | os.O_EXCL)
+ open_mode = 0
+ fd = None
+
+ try:
+ fd = os.open(disk_path, open_flags, open_mode)
+ except OSError:
+ return 1
+
+ try:
+ os.close(fd)
+ except OSError:
+ return 1
+
+ return 0
+
+
def get_devices(_sys_block_path='/sys/block', _dev_path='/dev', _mapper_path='/dev/mapper'):
"""
Captures all available devices from /sys/block/, including its partitions,
metadata['human_readable_size'] = human_readable_size(float(size) * 512)
metadata['size'] = float(size) * 512
metadata['path'] = diskname
+ metadata['locked'] = is_locked_raw_device(metadata['path'])
device_facts[diskname] = metadata
return device_facts