refs #1701 - Fix script convertVMtoIMG.py #26
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue