Compare commits

..

No commits in common. "20a1628dd3264b90ab6f703b20cde4280aa9f2fb" and "bafa4c78fa598468c30ce61445f19dfdc9bb2a5d" have entirely different histories.

1 changed files with 19 additions and 21 deletions

View File

@ -116,34 +116,29 @@ 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 la lista de mapeos, y si da error retorna "False" y "None".
Si se ejecuta correctamente retorna "True", y si da error retorna "False".
NOTA: Debe ejecutarse con "sudo", o dará error.
"""
try:
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')
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)
# 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:
# Evaluamos el resultado de la ejecución, retornando "True" si es correcta y "False" si no lo es:
if result.returncode == 0:
# 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
return True
else:
return False, None
# Si se produce un error o una excepción lo imprimimos en el log, y retornamos "False" y "None":
return False
# Si se produce un error o una excepción lo imprimimos en el log, y retornamos "False":
except subprocess.CalledProcessError as error:
journal.send(f"convertVMtoIMG.py: 'kpartx -av' error: {error}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
return False, None
journal.send(f"convertVMtoIMG.py: 'kpartx -a' error: {error}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
return False
except Exception as error:
journal.send(f"convertVMtoIMG.py: 'kpartx -av' exception: {error}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
return False, None
journal.send(f"convertVMtoIMG.py: 'kpartx -a' exception: {error}", PRIORITY=journal.LOG_ERR, SYSLOG_IDENTIFIER="ogrepo-api_DEBUG")
return False
def get_target_device(map_list, filesystem):
def get_target_device(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".
@ -151,6 +146,9 @@ def get_target_device(map_list, 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:
@ -333,9 +331,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 -av"):
map_result, map_list = map_vm_partitions(vm_image_name)
if map_result == False:
# Mapeamos las particiones de la imagen RAW (con "kpartx -a"):
partitions_map = map_vm_partitions(vm_image_name)
if partitions_map == 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)
@ -344,7 +342,7 @@ def main():
# Obtenemos la partición mapeada de destino (con "blkid"):
target_device = get_target_device(map_list, filesystem)
target_device = get_target_device(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"