refs #1701 - Fix script convertVMtoIMG.py #26

Merged
ggil merged 1 commits from add_python_scripts into main 2025-03-12 17:33:29 +01:00
1 changed files with 21 additions and 19 deletions

View File

@ -116,29 +116,34 @@ def convert_to_raw(vm_image_name, vm_extension):
def map_vm_partitions(vm_image_name):
""" Mapea las particiones de la imagen RAW en "dev/mapper", para que "partclone" pueda convertir la imagen.
Si se ejecuta correctamente retorna "True", y si da error retorna "False".
Si se ejecuta correctamente retorna "True" y la lista de mapeos, y si da error retorna "False" y "None".
NOTA: Debe ejecutarse con "sudo", o dará error.
"""
try:
journal.send("convertVMtoIMG.py: Running command 'kpartx -a'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
result = subprocess.run(['sudo', 'kpartx', '-a', f"{vm_path}{vm_image_name}.raw"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
journal.send("convertVMtoIMG.py: Running command 'kpartx -av'...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
result = subprocess.run(['sudo', 'kpartx', '-av', f"{vm_path}{vm_image_name}.raw"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='UTF8')
# Evaluamos el resultado de la ejecución, retornando "True" si es correcta y "False" si no lo es:
# Evaluamos el resultado de la ejecución, retornando "True" y la lista de mapeos si es correcta, o "False" y "None" si no lo es:
if result.returncode == 0:
return True
# Parseamos la salida del comando, para añadir cada mapeo a "map_list":
map_list = []
for line in result.stdout.split('\n'):
if "loop" in line:
map_list.append(line.split()[2])
return True, map_list
else:
return False
# Si se produce un error o una excepción lo imprimimos en el log, y retornamos "False":
return False, None
# Si se produce un error o una excepción lo imprimimos en el log, y retornamos "False" y "None":
except subprocess.CalledProcessError as error:
journal.send(f"convertVMtoIMG.py: 'kpartx -a' error: {error}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
return False
journal.send(f"convertVMtoIMG.py: 'kpartx -av' error: {error}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
return False, None
except Exception as error:
journal.send(f"convertVMtoIMG.py: 'kpartx -a' exception: {error}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
return False
journal.send(f"convertVMtoIMG.py: 'kpartx -av' exception: {error}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
return False, None
def get_target_device(filesystem):
def get_target_device(map_list, filesystem):
""" Busca entre los mapeos generados por "kpartx" el dispositivo correspondiente a la partición a restaurar (en base al filesystem especificado como parámetro),
ejecutando el comando "blkid" sobre cada dispositivo mapeado (por lo que el filesystem debe respetar la nomenclatura de "blkid").
Si se ejecuta correctamente retorna el dispositivo de destino, y si da error retorna un mensaje que incluye "Filesystem".
@ -146,9 +151,6 @@ def get_target_device(filesystem):
"""
try:
journal.send("convertVMtoIMG.py: Getting target device...", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
# Almacenamos en una lista los mapeos generados por "kpartx", y eliminamos el elemento "control" (que no lo ha generado "kpartx"):
map_list = os.listdir('/dev/mapper')
map_list.remove('control')
# Sobre cada mapeo ejecutamos el comando "blkid", buscamos el filesystem en la respuesta, y si lo encontramos extraemos el nombre del dispositivo (para pasárselo a "partclone"):
for device in map_list:
@ -331,9 +333,9 @@ def main():
journal.send("convertVMtoIMG.py: Conversion to RAW OK (ReturnCode: 0)", PRIORITY=journal.LOG_INFO, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
# Mapeamos las particiones de la imagen RAW (con "kpartx -a"):
partitions_map = map_vm_partitions(vm_image_name)
if partitions_map == False:
# Mapeamos las particiones de la imagen RAW (con "kpartx -av"):
map_result, map_list = map_vm_partitions(vm_image_name)
if map_result == False:
journal.send("convertVMtoIMG.py: Partitions map failed", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
erase_image_file(vm_image_name, '.raw') # Como ha fallado, borramos la imagen "RAW"
sys.exit(3)
@ -342,7 +344,7 @@ def main():
# Obtenemos la partición mapeada de destino (con "blkid"):
target_device = get_target_device(filesystem)
target_device = get_target_device(map_list, filesystem)
if "Filesystem" in target_device:
journal.send("convertVMtoIMG.py: Get target device failed", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
umap_vm_partitions(vm_image_name) # Como ha fallado, desmapeamos las particiones de la imagen "RAW"