Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def log_volume_holding_process(lv):
try:
# Let's try to provide more information on the failure
devices = [i.split("\t") for i in subprocess.check_output([
utils.find_executable('dmsetup'), "ls"]).splitlines()]
dev_id = [i[1].strip("()").split(":") for i in devices if
lv.split("/").pop() in i[0] and
not i[0].endswith("cow")][0]
command = "{} | grep {},{}".format(
# lsof is quite long, so no need to add a sleep here
utils.find_executable('lsof'), dev_id[0], dev_id[1])
process = subprocess.check_output([command], shell=True)
LOG.warning("Process holding the volume is '{}'".format(process))
except Exception as e:
LOG.warning("Could not get informations on the process holding the"
" volume: {}".format(str(e)))
def log_volume_holding_process(lv):
try:
# Let's try to provide more information on the failure
devices = [i.split("\t") for i in subprocess.check_output([
utils.find_executable('dmsetup'), "ls"]).splitlines()]
dev_id = [i[1].strip("()").split(":") for i in devices if
lv.split("/").pop() in i[0] and
not i[0].endswith("cow")][0]
command = "{} | grep {},{}".format(
# lsof is quite long, so no need to add a sleep here
utils.find_executable('lsof'), dev_id[0], dev_id[1])
process = subprocess.check_output([command], shell=True)
LOG.warning("Process holding the volume is '{}'".format(process))
except Exception as e:
LOG.warning("Could not get informations on the process holding the"
" volume: {}".format(str(e)))
def _lvremove(lv):
for attempt in range(5):
lvremove_proc = subprocess.Popen(
'{0} -f {1}'.format(utils.find_executable('lvremove'), lv),
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True,
executable=utils.find_executable('bash'))
output, error = lvremove_proc.communicate()
if lvremove_proc.returncode:
if "contains a filesystem in use" in error:
LOG.warning("Couldn't remove volume {0}. "
"It is still in use.".format(lv))
log_volume_holding_process(lv)
else:
break
else:
return
# Raise if five attempts made or different error than fs in use
raise Exception('Unable to remove snapshot {0}. {1}'.format(lv, error))
def get_vol_fs_type(vol_name):
"""
The argument need to be a full path lvm name i.e. /dev/vg0/var
or a disk partition like /dev/sda1. The returnet value is the
file system type
"""
if os.path.exists(vol_name) is False:
err = 'Provided volume name not found: {0} '.format(vol_name)
LOG.exception(err)
raise Exception(err)
file_cmd = '{0} -0 -bLs --no-pad --no-buffer --preserve-date \
{1}'.format(utils.find_executable("file"), vol_name)
file_process = subprocess.Popen(
file_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True,
executable=utils.find_executable("bash"))
(file_out, file_err) = file_process.communicate()
file_match = re.search(r'(\S+?) filesystem data', file_out, re.I)
if file_match is None:
err = 'File system type not guessable: {0}'.format(file_err)
LOG.exception(err)
raise Exception(err)
else:
filesys_type = file_match.group(1)
LOG.info('File system {0} found for volume {1}'.format(
filesys_type, vol_name))
return filesys_type.lower().strip()
def _lvremove(lv):
for attempt in range(5):
lvremove_proc = subprocess.Popen(
'{0} -f {1}'.format(utils.find_executable('lvremove'), lv),
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True,
executable=utils.find_executable('bash'))
output, error = lvremove_proc.communicate()
if lvremove_proc.returncode:
if "contains a filesystem in use" in error:
LOG.warning("Couldn't remove volume {0}. "
"It is still in use.".format(lv))
log_volume_holding_process(lv)
else:
break
else:
return
# Raise if five attempts made or different error than fs in use
raise Exception('Unable to remove snapshot {0}. {1}'.format(lv, error))
def _umount(path):
# Change dir if we are within the mount point to be removed.
if os.getcwd().startswith(os.path.normpath(path)):
os.chdir('/')
umount_proc = subprocess.Popen('{0} -l -f {1}'.format(
utils.find_executable('umount'), path),
stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True, executable=utils.find_executable('bash'))
(umount_out, mount_err) = umount_proc.communicate()
if umount_proc.returncode:
raise Exception('Impossible to umount {0}. {1}'
.format(path, mount_err))
os.rmdir(path)
LOG.info('Volume {0} unmounted'.format(path))