refs #1245 add scripts/deployImage.py

pull/1/head
Natalia Serrano 2024-12-12 18:29:39 +01:00
parent 1de8e854ad
commit f0c4f7e07a
2 changed files with 141 additions and 112 deletions

View File

@ -32,7 +32,7 @@ OGLOGSESSION='/tmp/session.log'
OGLOGCOMMAND='/tmp/command.log' OGLOGCOMMAND='/tmp/command.log'
#OGWINCHKDISK=True #Hacer chkdisk tras la clonacion #OGWINCHKDISK=True #Hacer chkdisk tras la clonacion
ACTIONCACHEFULL='NONE' #Que hacer cuando la cache no tenga espacio libre. [ NONE | FORMAT ] ] ACTIONCACHEFULL='NONE' #Que hacer cuando la cache no tenga espacio libre. [ NONE | FORMAT ] ]
#RESTOREPROTOCOLNOTCACHE=None #Que protocolo de restauracion usar en el caso de que no exista cache o no exista espacio sufiente. [NONE | UNICAST | MULTICAST].NONE retorna error RESTOREPROTOCOLNOTCACHE=None #Que protocolo de restauracion usar en el caso de que no exista cache o no exista espacio sufiente. [NONE | UNICAST | MULTICAST].NONE retorna error
#IMGPROG='partclone' #IMGPROG='partclone'
#IMGCOMP='lzop' #IMGCOMP='lzop'
#IMGEXT='img' #IMGEXT='img'

View File

@ -1,143 +1,172 @@
#!/usr/bin/python3
import os import os
import sys import sys
import time import time
import subprocess
import shutil
import ogGlobals
import SystemLib import SystemLib
import DiskLib import DiskLib
import NetLib import NetLib
import StringLib
import FileLib
import ImageLib import ImageLib
#!/usr/bin/env python3 #Descripcion:
# Si Repositorio es el global (REPO) realiza un deploy.
# Si Repositorio es local (CACHE) realiza un restoreImage CACHE
# El deploy, si detecta que el cliente no tiene una CACHE o no tiene espacio suficiente consulta el engine.cfg RESTOREPROTOCOLNOCACHE
def main(): def main (repo, imgname, disk, par, proto='UNICAST', protoopt=''):
PROG = os.path.basename(__file__) time1 = time.time()
if len(sys.argv) < 5:
SystemLib.ogRaiseError("session", OG_ERR_FORMAT, f"{MSG_FORMAT}: {PROG} REPO imagen ndisco nparticion [ UNICAST-DIRECT|UNICAST|UNICAST-CACHE|MULTICAST-DIRECT|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]") # Clear temporary file used as log track by httpdlog
# Limpia los ficheros temporales usados como log de seguimiento para httpdlog
with open (ogGlobals.OGLOGCOMMAND, 'w') as fd:
fd.write (' ')
if 'EjecutarScript' != SystemLib.ogGetCaller():
with open (ogGlobals.OGLOGSESSION, 'w') as fd:
fd.write ('')
# Registro de inicio de ejecución
SystemLib.ogEcho (['log', 'session'], None, f'[1] {ogGlobals.lang.MSG_SCRIPTS_START} {__file__} {" ".join(sys.argv)}')
# Si el origen(pariticion) esta bloqueada salir.
if FileSystemLib.ogIsLocked (disk, par):
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_LOCKED, f'{ogGlobals.lang.MSG_PARTITION}, {disk} {par}')
sys.exit (1) sys.exit (1)
TIME1 = time.time() SystemLib.ogEcho (['log', 'session'], None, f'{ogGlobals.lang.MSG_HELP_ogUnmount} {disk} {par}')
REPO = sys.argv[1].upper() or "REPO" FileSystemLib.ogUnmount (disk, par)
IMGNAME = sys.argv[2]
DISK = sys.argv[3]
PART = sys.argv[4]
PROTO = (sys.argv[5].upper() if len(sys.argv) > 5 else "UNICAST")
PROTOOPT = sys.argv[6] if len(sys.argv) > 6 else ""
OGUNIT = os.getenv("ogunit", "")
if not OGENGINECONFIGURATE: # Valor por defecto para el repositorio.
exec(open("/opt/opengnsys/etc/engine.cfg").read()) if repo == NetLib.ogGetIpAddress() or 'CACHE' == repo:
MODE = 'CACHE'
with open(OGLOGCOMMAND, 'w') as f:
f.write(" ")
if SystemLib.ogGetCaller() != "EjecutarScript":
with open(OGLOGSESSION, 'w') as f:
f.write("")
SystemLib.ogEcho("log", "session", f"[1] {MSG_SCRIPTS_START} {PROG} {' '.join(sys.argv)}")
if FileSystemLib.ogIsLocked(DISK, PART):
sys.exit(SystemLib.ogRaiseError("session", OG_ERR_LOCKED, f"{MSG_PARTITION}, {DISK} {PART}"))
SystemLib.ogEcho("log", "session", f"{MSG_HELP_FileSystemLib.ogUnmount} {DISK} {PART}")
FileSystemLib.ogUnmount(DISK, PART)
if REPO == NetLib.ogGetIpAddress() or REPO == "CACHE":
MODE = "CACHE"
else: else:
if DiskLib.ogCheckIpAddress(REPO) == 0 or REPO == "REPO": if StringLib.ogCheckIpAddress (repo) or 'REPO' == repo:
if not NetLib.ogChangeRepo(REPO, OGUNIT): if not NetLib.ogChangeRepo (repo):
sys.exit(SystemLib.ogRaiseError(OG_ERR_NOTFOUND, f"{REPO} {OGUNIT}")) SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, repo)
MODE = "REPO" sys.exit (1)
MODE = 'REPO'
IMGOS = ImageLib.ogGetImageInfo(ogGetPath(MODE, f"{IMGNAME}.img")) #Informacioin previa de la imagen
if IMGOS == 1: imgpath = FileLib.ogGetPath (MODE, f'{imgname}.img')
sys.exit(SystemLib.ogRaiseError("session", OG_ERR_NOTFOUND, f"{REPO} {IMGNAME}")) imgos = ImageLib.ogGetImageInfo (imgpath)
elif IMGOS == 5: #if imgos == 1: sys.exit(SystemLib.ogRaiseError("session", OG_ERR_NOTFOUND, f"{repo} {imgname}"))
sys.exit(SystemLib.ogRaiseError("session", OG_ERR_IMAGEFILE, f"{REPO} {IMGNAME}")) #elif imgos == 5: sys.exit(SystemLib.ogRaiseError("session", OG_ERR_IMAGEFILE, f"{repo} {imgname}"))
elif IMGOS != 0: #elif imgos != 0: sys.exit(SystemLib.ogRaiseError("session", OG_ERR_GENERIC))
sys.exit(SystemLib.ogRaiseError("session", OG_ERR_GENERIC)) if not imgos:
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_GENERIC, '')
sys.exit (1)
IMGSIZE = os.path.getsize(ogGetPath(MODE, f"{IMGNAME}.img")) // 1024 imgsize = os.path.getsize (imgpath) // 1024
SystemLib.ogEcho("log", "session", f"[1] REPO={REPO} IMG-FILE={IMGNAME}.img SIZE={IMGSIZE} (KB) METADATA={IMGOS}") SystemLib.ogEcho (['log', 'session'], None, f'[1] REPO={repo} IMG-FILE={imgname}.img SIZE={imgsize} (KB) METADATA={imgos}')
if MODE == "CACHE": # Procesar repositorio.
NEXTOPERATION = "CACHE" if 'CACHE' == MODE:
elif MODE == "REPO": nextoperation = 'CACHE'
if PROTO in ["MULTICAST-DIRECT", "UNICAST-DIRECT"]: elif 'REPO' == MODE:
NEXTOPERATION = PROTO.split('-')[0] if 'MULTICAST-DIRECT' == proto:
elif PROTO in ["TORRENT", "TORRENT-CACHE", "MULTICAST", "MULTICAST-CACHE", "UNICAST", "UNICAST-CACHE"]: nextoperation = 'MULTICAST'
PROTO = PROTO.split('-')[0] elif 'UNICAST-DIRECT' == proto:
SystemLib.ogEcho("log", "session", f"[2] updateCache {REPO} /{IMGNAME}.img {PROTO} {PROTOOPT}") nextoperation = 'UNICAST'
TIME2 = time.time() # Si protocolo es torrent|torrent-cache o multicast|multicast-cache
RETVAL = updateCache(REPO, f"/{IMGNAME}.img", PROTO, PROTOOPT) elif proto in ['TORRENT', 'TORRENT-CACHE', 'MULTICAST', 'MULTICAST-CACHE', 'UNICAST', 'UNICAST-CACHE']:
TIME2 = time.time() - TIME2 # Eliminamos CACHE o DIRECT
SystemLib.ogEcho("log", "session", f" [ ] {MSG_SCRIPTS_TIME_PARTIAL} updateCache {TIME2 // 60}m {TIME2 % 60}s") proto = proto.split ('-')[0]
if RETVAL == 0: SystemLib.ogEcho (['log', 'session'], None, f'[2] updateCache {repo} "/{imgname}.img" {proto} {protoopt}')
SystemLib.ogEcho("log", "session", "[50] updateCache (OK)") time2 = time.time()
NEXTOPERATION = "CACHE" retval = subprocess.run (['updateCache', repo, f'/{imgname}.img', proto, protoopt]).returncode
elif RETVAL in [15, 16]: time2 = time.time() - time2
SystemLib.ogEcho("log", "session", f"[50] {MSG_ERR_NOTCACHE} ; {MSG_ERR_CACHESIZE}") SystemLib.ogEcho (['log', 'session'], None, f' [ ] {ogGlobals.lang.MSG_SCRIPTS_TIME_PARTIAL} updateCache {int (time2/60)}m {int (time2%60)}s')
SystemLib.ogEcho("log", "session", f"[50] {MSG_SCRIPTS_CHECK_ENGINE}: RESTOREPROTOCOLNOTCACHE={RESTOREPROTOCOLNOTCACHE}") if 0 == retval:
if RESTOREPROTOCOLNOTCACHE == "MULTICAST": SystemLib.ogEcho (['log', 'session'], None, '[50] updateCache (OK)')
NEXTOPERATION = "MULTICAST" if PROTO == "MULTICAST" else "UNICAST" nextoperation = 'CACHE'
elif RESTOREPROTOCOLNOTCACHE == "UNICAST": elif retval in [15, 16]:
NEXTOPERATION = "UNICAST" # no se permite usar la cache (no existe(15) o no espacio sufiente (16). Se consulta engine.cfg para RESTOREPROTOCOLNOCACHE [ multicast unicast none ]
elif RESTOREPROTOCOLNOTCACHE == "NONE": SystemLib.ogEcho (['log', 'session'], None, f'[50] {ogGlobals.lang.MSG_ERR_NOTCACHE} ; {ogGlobals.lang.MSG_ERR_CACHESIZE}')
if RETVAL == 15: SystemLib.ogEcho (['log', 'session'], None, f'[50] {ogGlobals.lang.MSG_SCRIPTS_CHECK_ENGINE}: RESTOREPROTOCOLNOTCACHE={ogGlobals.RESTOREPROTOCOLNOTCACHE}')
SystemLib.ogEcho("log", "session", f"[100] {MSG_ERR_NOTCACHE}") if 'MULTICAST' == RESTOREPROTOCOLNOTCACHE:
sys.exit(SystemLib.ogRaiseError("session", OG_ERR_NOTCACHE, "NOT CACHE")) if 'MULTICAST' == proto: nextoperation = 'MULTICAST'
elif RETVAL == 16: elif 'TORRENT' == proto: nextoperation = 'UNICAST'
SystemLib.ogEcho("log", "session", f"[100] {MSG_ERR_CACHESIZE}") elif 'UNICAST' == proto: nextoperation = 'UNICAST'
sys.exit(SystemLib.ogRaiseError("session", OG_ERR_CACHESIZE, "CACHE FULL")) elif 'UNICAST' == RESTOREPROTOCOLNOTCACHE:
elif RETVAL in [57, 60]: nextoperation = 'UNICAST'
sys.exit(RETVAL) elif RESTOREPROTOCOLNOTCACHE is None:
if 15 == retval:
SystemLib.ogEcho (['log', 'session'], None, f'[100] {ogGlobals.lang.MSG_ERR_NOTCACHE}')
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_NOTCACHE, 'NOT CACHE')
sys.exit (1)
elif 16 == retval:
SystemLib.ogEcho (['log', 'session'], None, f'[100] {ogGlobals.lang.MSG_ERR_CACHESIZE}')
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_CACHESIZE, 'CACHE FULL')
sys.exit (1)
elif retval in [57, 60]:
# Time-out en la transferencia multicast (El mensaje de error está enviado)
sys.exit (retval)
else: else:
sys.exit(RETVAL) # Error desconocido
sys.exit (retval)
else: else:
sys.exit(SystemLib.ogRaiseError("session", OG_ERR_FORMAT, f"{MSG_ERR_FORMAT}, {PROTO}")) SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_FORMAT, f'{ogGlobals.lang.MSG_ERR_FORMAT}, {proto}')
sys.exit (1)
else: else:
sys.exit(SystemLib.ogRaiseError("session", OG_ERR_FORMAT, f"{MSG_ERR_FORMAT}, {REPO}")) SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_FORMAT, f'{ogGlobals.lang.MSG_ERR_FORMAT}, {repo}')
sys.exit (1)
TIME3 = time.time() time3 = time.time()
if NEXTOPERATION == "CACHE": # Obtener parámetros de restauración.
PARAMS = f"CACHE {IMGNAME} {DISK} {PART}" if 'CACHE' == nextoperation:
elif NEXTOPERATION == "UNICAST": params = ['CACHE', imgname, disk, par]
PARAMS = f"{REPO} {IMGNAME} {DISK} {PART}" elif 'UNICAST' == nextoperation:
elif NEXTOPERATION == "MULTICAST": params = [repo, imgname, disk, par]
PARAMS = f"{REPO} {IMGNAME} {DISK} {PART} {PROTO} {PROTOOPT}" elif 'MULTICAST' == nextoperation:
params = [repo, imgname, disk, par, proto, protoopt]
if os.system("which restoreImageCustom") == 0: # Si existe, ejecuta script personalizado "restoreImageCustom"; si no, llama al genérico "restoreImage".
SystemLib.ogEcho("log", "session", f"[55] {MSG_HELP_ogRestoreImage}: restoreImageCustom {PARAMS}") if shutil.which ('restoreImageCustom'):
os.system(f"restoreImageCustom {PARAMS}") SystemLib.ogEcho (['log', 'session'], None, f'[55] {ogGlobals.lang.MSG_HELP_ogRestoreImage}: restoreImageCustom {params}')
retval = subprocess.run (['restoreImageCustom'] + params).returncode
else: else:
SystemLib.ogEcho("log", "session", f"[55] {MSG_HELP_ogRestoreImage}: restoreImage {PARAMS}") SystemLib.ogEcho (['log', 'session'], None, f'[55] {ogGlobals.lang.MSG_HELP_ogRestoreImage}: restoreImage {params}')
os.system(f"restoreImage {PARAMS}") retval = subprocess.run (['restoreImage'] + params).returncode
RETVAL = os.system(f"restoreImage {PARAMS}")
RESUMERESTOREIMAGE = os.popen(f"grep -m 1 'Total Time:' {OGLOGCOMMAND}").read() # Mostrar resultados.
SystemLib.ogEcho("log", "session", f" [ ] {RESUMERESTOREIMAGE}") resumerestoreimage = subprocess.run (['grep', '--max-count', '1', 'Total Time:', ogGlobals.OGLOGCOMMAND], capture_output=True, text=True).stdout
if RETVAL != 0: SystemLib.ogEcho (['log', 'session'], None, f' [ ] {resumerestoreimage} ')
SystemLib.ogRaiseError("session", OG_ERR_IMAGE, f"{REPO} {IMGNAME}") # Si la transferencia ha dado error me salgo.
if SystemLib.ogGetCaller() != "EjecutarScript": if retval:
SystemLib.ogEcho("log", "session", f"{MSG_INTERFACE_END} {OG_ERR_IMAGE}") SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_IMAGE, f'{repo} {imgname}')
sys.exit(OG_ERR_IMAGE) if SystemLib.ogGetCaller() != 'EjecutarScript':
SystemLib.ogEcho (['log', 'session'], None, f'{ogGlobals.lang.MSG_INTERFACE_END} {ogGlobals.OG_ERR_IMAGE}')
sys.exit (ogGlobals.OG_ERR_IMAGE)
TIME3 = time.time() - TIME3 time3 = time.time() - time3
SystemLib.ogEcho("log", "session", f" [ ] {MSG_SCRIPTS_TIME_PARTIAL} : {TIME3 // 60}m {TIME3 % 60}s") SystemLib.ogEcho (['log', 'session'], None, f' [ ] {ogGlobals.lang.MSG_SCRIPTS_TIME_PARTIAL} : {int (time3/60)}m {int (time3%60)}s')
if os.system("which configureOsCustom") == 0: # Si existe, ejecuta script personalizado de postconfiguración "configureOsCustom"; si no, llama al genérico "configureOs".
SystemLib.ogEcho("log", "session", "[90] configureOsCustom") if shutil.which ('configureOsCustom'):
os.system(f"configureOsCustom {DISK} {PART} {REPO} {IMGNAME}") SystemLib.ogEcho (['log', 'session'], None, '[90] configureOsCustom')
subprocess.run (['configureOsCustom', disk, par, repo, imgname])
else: else:
SystemLib.ogEcho("log", "session", f"[90] {MSG_SCRIPTS_OS_CONFIGURE}") SystemLib.ogEcho (['log', 'session'], None, f'[90] {ogGlobals.lang.MSG_SCRIPTS_OS_CONFIGURE}')
os.system(f"configureOs {DISK} {PART}") subprocess.run (['configureOs', disk, par])
TIME = time.time() - TIME1 time_total = time.time() - time1
SystemLib.ogEcho("log", "session", f"[100] {MSG_SCRIPTS_TIME_TOTAL} {TIME // 60}m {TIME % 60}s") SystemLib.ogEcho (['log', 'session'], None, f'[100] {ogGlobals.lang.MSG_SCRIPTS_TIME_TOTAL} {int (time_total/60)}m {int (time_total%60)}s')
if SystemLib.ogGetCaller() != "EjecutarScript": # Registro de fin de ejecución
SystemLib.ogEcho("log", "session", f"{MSG_INTERFACE_END} {RETVAL}") # Si se ha llamado desde ejecutar script no lo muestro para no repetir.
sys.exit(RETVAL) if SystemLib.ogGetCaller() != 'EjecutarScript':
SystemLib.ogEcho (['log', 'session'], None, f'{ogGlobals.lang.MSG_INTERFACE_END} {retval}')
sys.exit (retval)
if __name__ == "__main__": if __name__ == '__main__':
main() if len (sys.argv) < 4:
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_FORMAT, f'{ogGlobals.lang.MSG_FORMAT}: {__file__} REPO imagen ndisco nparticion [ UNICAST-DIRECT|UNICAST|UNICAST-CACHE|MULTICAST-DIRECT|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]')
sys.exit (1)
sys.argv[0] = sys.argv[0].upper() if sys.argv[0] else 'REPO'
main (*sys.argv)