refs #1163 add updateCache.py

code-review
Natalia Serrano 2024-11-20 15:34:12 +01:00
parent 385ddb6ac1
commit 88dce42514
7 changed files with 386 additions and 122 deletions

View File

@ -98,60 +98,58 @@ def ogFindCache():
if not PART: return
return DiskLib.ogDevToDisk (PART.split()[0]) # usar la 1ª partición encontrada.
#/**
# ogFormatCache
#@brief Formatea el sistema de ficheros para la caché local.
#@return (por determinar)
#@warning Prueba con formato Reiser.
#@attention
#@note El sistema de archivos de la caché se queda montado.
#*/ ##
def ogFormatCache():
"""
Formatea la partición de caché.
:raises RuntimeError: Si ocurre un error durante el formateo de la partición.
"""
# Si se solicita, mostrar ayuda.
if len(sys.argv) > 1 and sys.argv[1] == "help":
ogHelp("ogFormatCache", "ogFormatCache")
return
# Error si no hay definida partición de caché.
cachepart = ogFindCache()
if cachepart is None:
ogRaiseError(OG_ERR_PARTITION, MSG_NOCACHE)
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, ogGlobals.lang.MSG_NOCACHE)
return
disk = ogDiskToDev(cachepart)
disk = DiskLib.ogDiskToDev (cachepart)
if not disk: return
# Formatear sistema de ficheros.
ogUnmountCache()
options = "extent,large_file"
if re.match("^5", platform.release()):
options += ",uninit_bg,^metadata_csum,^64bit"
try:
subprocess.run(["mkfs.ext4", "-q", "-F", disk, "-L", "CACHE", "-O", options], check=True)
except subprocess.CalledProcessError as e:
raise RuntimeError(f"Error al formatear la partición de caché: {e}")
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, "CACHE")
return
# Crear estructura básica.
mntdir = ogMountCache()
os.makedirs(os.path.join(mntdir, OGIMG), exist_ok=True)
os.makedirs(os.path.join(mntdir, ogGlobals.OGIMG), exist_ok=True)
# Incluir kernel e Initrd del ogLive
updateBootCache()
## como lo llamo sin especificar el path entero?
#subprocess.run (['scripts/updateBootCache.py']) ## TODO
#/**
# ogGetCacheSize
#@brief Devuelve el tamaño definido para la partición de caché.
#@return int_partsize tamaño de la partición (en KB)
#@exception OG_ERR_PARTITION No existe partición de caché.
#*/ ##
def ogGetCacheSize():
"""
Obtiene el tamaño de la partición de caché.
:return: Tamaño de la partición de caché en kilobytes.
:raises RuntimeError: Si ocurre un error al obtener el tamaño de la partición de caché.
"""
# Si se solicita, mostrar ayuda.
if len(sys.argv) > 1 and sys.argv[1] == "help":
ogHelp("ogGetCacheSize", "help", "ogGetCacheSize")
# Error si no se encuentra partición de caché.
cachepart = ogFindCache()
if cachepart is None:
raise RuntimeError(MSG_NOCACHE)
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, ogGlobals.lang.MSG_NOCACHE)
return
# Devuelve tamaño de la partición de caché.
return ogGetPartitionSize(cachepart)
disk, par = cachepart.split()
return DiskLib.ogGetPartitionSize (disk, par)
def ogGetCacheSpace():
"""
@ -204,33 +202,32 @@ def ogGetCacheSpace():
#@warning Salidas de errores no determinada
#*/ ##
def ogMountCache():
c = CacheLib.ogFindCache().split()
c = ogFindCache().split()
m = FileSystemLib.ogMountFs (c[0], c[1])
if not m:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, ogGlobals.lang.MSG_NOCACHE)
#return
return m
#/**
# ogUnmountCache
#@brief Desmonta la particion Cache y elimina la variable $OGCAC
#@param sin parametros
#@return nada
#@warning Salidas de errores no determinada
#*/ ##
def ogUnmountCache():
"""
Desmonta la partición de caché.
:raises RuntimeError: Si ocurre un error durante el desmontaje de la partición de caché.
"""
# Si se solicita, mostrar ayuda.
if len(sys.argv) > 1 and sys.argv[1] == "help":
ogHelp("ogUnmountCache", "help", "ogUnmountCache")
# Obtener la partición de caché.
cachepart = ogFindCache()
if cachepart is None:
raise RuntimeError("No se encontró la partición de caché.")
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_PARTITION, ogGlobals.lang.MSG_NOCACHE)
return
# Desmontar la partición de caché.
try:
subprocess.run(["umount", cachepart], check=True)
except subprocess.CalledProcessError as e:
raise RuntimeError(f"Error al desmontar la partición de caché: {e}")
if not FileSystemLib.ogIsMounted (cachepart): return True
FileSystemLib.ogUnmountFs (cachepart)
# Eliminar el enlace simbólico de /mnt/ParticiónCache.
os.remove(f"/mnt/{cachepart}")
dev = ogDiskToDev (cachepart)
dev.replace ('dev', 'mnt')
os.remove (dev)

View File

@ -166,40 +166,58 @@ def ogCalculateFullChecksum (disk=None, par=None, container=None, file=None):
#@return Progreso de la copia.
#@warning Deben existir tanto el fichero origen como el directorio destino.
#*/ ##
#ogCopyFile (src, dst)
#ogCopyFile ({container='REPO', file='newfile.txt'}, {disk=1, par=2, file='/tmp/newfile.txt'})
#ogCopyFile ({disk=1, par=2, file='/tmp/newfile.txt'}, {container='REPO', file='newfile.txt'})
def ogCopyFile (src, dst):
for elem in src, dst:
if elem == src: which = 'source'
else: which = 'target'
def ogCopyFile(*args):
# Variables locales.
ARGS = args
if "help" in args:
SystemLib.ogHelp("$FUNCNAME", "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_source [ str_repo | int_ndisk int_npartition ] path_target", "$FUNCNAME REPO newfile.txt 1 2 /tmp/newfile.txt")
return
if 'file' not in elem:
raise TypeError ('missing required argument in {which} dict:: "file"')
ARGS = args
if args[0].startswith("/"):
# Camino completo. */ (Comentrio Doxygen)
SOURCE = ogGetPath(*args[:1])
args = args[1:]
elif args[0].isdigit():
# ndisco npartición.
SOURCE = ogGetPath(*args[:3])
args = args[3:]
else:
# Otros: repo, cache, cdrom (no se permiten caminos relativos).
SOURCE = ogGetPath(*args[:2])
args = args[2:]
if 'container' in elem:
if 'disk' not in elem and 'par' not in elem:
## we were given container=
path = ogGetPath (src=elem['container'], file=elem['file'])
dev_err = f'{elem["container"]} {elem["file"]}'
print (f'ogGetPath {which} (src=({elem["container"]}), file=({elem["file"]})) = path ({path})')
else:
raise TypeError ('argument "container" can be specified along neither "disk" nor "par"')
TARGET = ogGetPath(*args)
else:
if 'disk' in elem and 'par' in elem:
## we were given disk= par=
path = ogGetPath (src=f'{elem["disk"]} {elem["par"]}', file=elem['file'])
dev_err = f'{elem["disk"]} {elem["par"]} {elem["file"]}'
print (f'ogGetPath {which} (src=({elem["disk"]} {elem["par"]}), file=({elem["file"]})) = path ({path})')
elif 'disk' not in elem and 'par' not in elem:
## we were given nothing
path = ogGetPath (file=elem['file'])
dev_err = elem['file']
print (f'ogGetPath {which} (file=({elem["file"]})) = path ({path})')
else:
raise TypeError ('if one of "disk" and "par" are specified, then both must be')
if elem == src:
SOURCE = path
src_dev_err = dev_err
else:
TARGET = path
dst_dev_err = dev_err
# Comprobar fichero origen y directorio destino.
if not SOURCE:
SystemLib.ogRaiseError(OG_ERR_NOTFOUND, *args[:-1])
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'device or file {src_dev_err} not found')
return
if not TARGET:
SystemLib.ogRaiseError(OG_ERR_NOTFOUND, *args)
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'device or file {dst_dev_err} not found')
return
print (f'nati: ogCopyFile: SOURCE ({SOURCE}) TARGET ({TARGET})')
# Copiar fichero (para evitar problemas de comunicaciones las copias se hacen con rsync en vez de cp).
result = subprocess.run(["rsync", "--progress", "--inplace", "-avh", SOURCE, TARGET])
print (f'nati: ogCopyFile: rsync --progress --inplace -avh ({SOURCE}) ({TARGET})')
result = subprocess.run(["rsync", "--progress", "--inplace", "-avh", SOURCE, TARGET], capture_output=True, text=True)
return result.returncode
@ -242,7 +260,7 @@ def ogDeleteFile (disk=None, par=None, container=None, file=None):
except OSError as e:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_GENERIC, str (e))
return
def ogDeleteTree(*args):
# Variables locales.
DIR = None
@ -408,18 +426,46 @@ def ogMakeChecksumFile(*args):
with open(f"{FILE}.sum", "w") as f:
f.write(checksum)
def ogMakeDir(*args):
# Variables locales.
PARENT = None
DIR = None
if "help" in args:
SystemLib.ogHelp("$FUNCNAME", "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_dir", "$FUNCNAME 1 2 /tmp/newdir")
#/**
# ogMakeDir [ str_repo | int_ndisk int_npartition ] path_dirpath
#@brief Metafunción que crea un subdirectorio vacío en un dispositivo.
#@see ogGetParentPath
#*/ ##
#ogMakeDir (container='REPO', file='/tmp/newdir')
#ogMakeDir (disk='1', par='2', file='/tmp/newdir')
def ogMakeDir (container=None, disk=None, par=None, file=None):
if file is None:
raise TypeError ('missing required argument: "file"')
if container is not None:
if disk is None and par is None:
## we were given container=
parent = ogGetParentPath (src=container, file=file)
dev_err = f'{container} {file}'
print (f'ogGetParentPath (src=({container}), file=({file})) = parent ({parent})')
else:
raise TypeError ('argument "container" can be specified along neither "disk" nor "par"')
else:
if disk is not None and par is not None:
## we were given disk= par=
parent = ogGetParentPath (src=f'{disk} {par}', file=file)
dev_err = f'{disk} {par} {file}'
print (f'ogGetParentPath (src=({disk} {par}), file=({file})) = parent ({parent})')
elif disk is None and par is None:
## we were given nothing
parent = ogGetParentPath (file=file)
dev_err = file
print (f'ogGetParentPath (file=({file})) = parent ({parent})')
else:
raise TypeError ('if one of "disk" and "par" are specified, then both must be')
print (f'nati: ogMakeDir: parent ({parent})')
if not parent:
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'device or file {dev_err} not found')
return
PARENT = ogGetParentPath(*args)
if not PARENT:
SystemLib.ogRaiseError(OG_ERR_NOTFOUND, *args)
return
DIR = os.path.basename(args[-1])
os.makedirs(os.path.join(PARENT, DIR), exist_ok=True)
dst = os.path.basename (file)
print (f'nati: ogMakeDir: dst ({dst})')
os.makedirs (os.path.join (parent, dst), exist_ok=True)

View File

@ -284,17 +284,15 @@ def ogFormatFs (disk, par, type=None, label=None):
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Disco o partición no corresponden con un dispositivo.
#*/ ##
def ogGetFsSize (disk, par, unit=None):
u = unit or "KB"
def ogGetFsSize (disk, par, unit='KB'):
factor = 1
if u.upper() == "MB":
if unit.upper() == "MB":
factor = 1024
elif u.upper() == "GB":
elif unit.upper() == "GB":
factor = 1024 * 1024
elif u.upper() == "TB":
elif unit.upper() == "TB":
factor = 1024 * 1024 * 1024
elif u.upper() != "KB":
elif unit.upper() != "KB":
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, f"{unit} != {{ KB, MB, GB, TB }}")
return
@ -827,33 +825,37 @@ def ogUnsetDirtyBit(int_ndisk, int_nfilesys):
else:
pass # Add more specific actions for other file systems if needed.
def ogGetFreeSize(int_ndisk, int_npartition, str_SizeOutput):
if len(sys.argv) == 3 and sys.argv[2] == "help":
ogHelp("ogGetFreeSize", "ogGetFreeSize int_ndisk int_npartition str_SizeOutput", "ogGetFreeSize 1 1 GB")
return
if len(sys.argv) < 3:
ogRaiseError(OG_ERR_FORMAT)
return
#/**
# ogGetFreeSize int_disco int_partition str_SizeOutput
#@brief muestra informacion del tamaño total, datos y libre.
#@param int_ndisk nº de orden del disco
#@param int_npart nº de orden de partición
#@param str_unitSize unidad mostrada
#@return int_size:int_data:int_free
#@TODO Componer corretcamente esta función.
#@exception OG_ERR_FORMAT Formato incorrecto.
#*/ ##
PART = ogDiskToDev(int_ndisk, int_npartition)
if not PART:
return
def ogGetFreeSize(disk, part, unit='KB'):
PART = DiskLib.ogDiskToDev (disk, part)
if not PART: return
unit = str_SizeOutput
if not unit:
unit = "GB"
unit2factor = {
'kb': 1.024 / 1,
'mb': 1.024 / 1000,
'gb': 1.024 / 1000000,
}
if unit.lower() not in unit2factor:
kk
factor = unit2factor[unit.lower()]
factor = 1.024 / 1000000
if unit == "kB":
factor = 1.024
elif unit == "MB":
factor = 1.024 / 1000
result = subprocess.run(["df", PART], capture_output=True, text=True)
output = result.stdout.strip().split("\n")[1].split()
size = float(output[1]) * factor
used = float(output[2]) * factor
free = float(output[3]) * factor
return free
particion = FileSystemLib.ogMount (disk, part)
if not particion:
kk
df = subprocess.run (['df'], capture_output=True, text=True).stdout
df_part = list (filter (lambda l: particion in l, df.splitlines()))
if not len (df_part):
kk
_, size, used, free, pct, mntpt = df_part[0].split()
return float (free) * factor

View File

@ -221,7 +221,7 @@ def ogGetMacAddress():
mac_addresses.append(parts[i + 1].upper())
if mac_addresses:
print(mac_addresses[0])
print (f'nati: ogGetMacAddress: {mac_addresses[0]}')
return mac_addresses[0]
else:
print("No active mac address found")

View File

@ -31,7 +31,7 @@ TZ='Europe/Madrid'
OGLOGSESSION='/tmp/session.log'
OGLOGCOMMAND='/tmp/command.log'
#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
#IMGPROG='partclone'
#IMGCOMP='lzop'
@ -109,4 +109,4 @@ OG_ERR_NOTDIFFERENT=73 # No se detectan diferencias entre la image
OG_ERR_SYNCHRONIZING=74 # Error al sincronizar, puede afectar la creacion/restauracion de la imagen
OG_ERR_NOTUEFI=80 # La interfaz UEFI no está activa
OG_ERR_NOTBIOS=81 # La interfaz BIOS legacy no está activa
OG_ERR_NOTBIOS=81 # La interfaz BIOS legacy no está activa

View File

@ -8,6 +8,7 @@
#@param $4 Número de particion
#@param $5 Protocolo (UNICAST, UNICAST-DIRECT, MULTICAST o MULTICAST-DIRECT)
#@param $6 Opciones del protocolo
#@ejemplo restoreImage.py REPO imgname 2 2 unicast
#@exception OG_ERR_FORMAT 1 formato incorrecto.
#@exception OG_ERR_NOTFOUND 2 cambio de repositorio: repositorio no encontrado
#@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados.

View File

@ -0,0 +1,218 @@
#!/usr/bin/python3
#/**
# updateCache
#@brief Actualiza la cache del cliente con imagen o fichero iso.
#@param 1 REPO Origen del fichero. -accesible por nfs-samba-
#@param 2 str_fichero nombre del fichero a actualizar.
#@param 3 str_protoco. TORRENT | MULTICAST | UNICAST.
#@param 4 str_opcionesprotocolo
#@param 4 str_opcionesupdatecache
#@ejemplo: updateCache.py REPO imgname.img UNICAST 8042:42
#@return
#@exception OG_ERR_FORMAT formato incorrecto.
#@exception OG_ERR_NOTCACHE No existe cache -15-
#@exception $OG_ERR_CACHESIZE Tamaño de la paticion menor al archivo a descargar -16-
#@exception $OG_ERR_MCASTRECEIVERFILE Error en la recepción Multicast de un fichero -57-
#@exception $OG_ERR_PROTOCOLJOINMASTER Error en la conexión de una sesión Unicast|Multicast con el Master -60-
#@note
#@todo:
#*/ ##
import os.path
import sys
import time
import subprocess
import shutil
import glob
import random
import ogGlobals
import SystemLib
import StringLib
import NetLib
import CacheLib
import FileLib
import ProtocolLib
import FileSystemLib
prog = os.path.basename (sys.argv[0])
print (f'argv ({sys.argv}) len ({len (sys.argv)})')
if len (sys.argv) < 3:
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_FORMAT, f'{ogGlobals.lang.MSG_FORMAT}: {prog} str_REPO _str_Relative_Path_OGIMG_with_/ PROTOCOLO OPCIONES_PROTOCOLO OPCIONES_UPDATECACHE')
sys.exit (1)
#_, repositorio, path, protocolo, optprotocolo, cacheopts = sys.argv
_, repositorio, path, protocolo, optprotocolo = sys.argv
cacheopts = ''
if 'RSYNC' == protocolo:
raise Exception ('synchronised images are no longer supported')
#Carga del configurador del engine
## (ogGlobals se encarga)
# Clear temporary file used as log track by httpdlog
# Limpia los ficheros temporales usados como log de seguimiento para httpdlog
open (ogGlobals.OGLOGCOMMAND, 'w').close()
if SystemLib.ogGetCaller() not in ['deployImage', 'restoreBaseImage', 'restoreDiffImage']:
open (ogGlobals.OGLOGSESSION, 'w').close()
SystemLib.ogEcho (['log', 'session'], None, f'[1] {ogGlobals.lang.MSG_SCRIPTS_START} {prog} {sys.argv}')
# Si MCASTWAIT menos que tiempo de espera del servidor lo aumento
MCASTWAIT = ogGlobals.MCASTWAIT
if ':' in optprotocolo:
port, wait = optprotocolo.split (':')
else:
port, wait = ('', '')
if protocolo.startswith ('MULTICAST') and re.match (r'^-?\d+$', wait):
if int (MCASTWAIT or 0) < int (wait):
MCASTWAIT = int (wait) + 5
# Unidad organizativa.
## (no longer supported)
#print (f'repositorio ({repositorio}) path ({path}) protocolo ({protocolo}) optprotocolo ({optprotocolo}) cacheopts ({cacheopts}) MCASTWAIT ({MCASTWAIT})')
# Si es una ip y es distinta a la del recurso samba cambiamos de REPO.
if StringLib.ogCheckIpAddress (repositorio) or 'REPO' == repositorio:
if not NetLib.ogChangeRepo (repositorio):
SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, repositorio)
sys.exit (1)
repositorio = 'REPO'
repoip = NetLib.ogGetRepoIp()
SystemLib.ogEcho (['log', 'session'], None, f'{repositorio} {repoip} {protocolo} {optprotocolo}')
# Si el repositorio local CACHE no existe error 15.
if not CacheLib.ogFindCache():
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_NOTCACHE, 'CACHE')
sys.exit (1)
# comprobar si la imagen existe (.img, .img.diff o directorio)
repofile = FileLib.ogGetPath ('REPO', f'/{path}')
if not os.path.exists (repofile):
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_NOTFOUND, f'REPO /{path}')
sys.exit (1)
SystemLib.ogEcho (['log', 'session'], None, ogGlobals.lang.MSG_SCRIPTS_UPDATECACHE_DOUPDATE)
# Distingo si es monolitica o sincronizable
f = subprocess.run (['file', repofile], capture_output=True, text=True).stdout.lower()
if ' btrfs filesystem ' in f or ' ext4 filesystem ' in f or ' directory' in f:
raise Exception ('synchronised images are no longer supported')
rc = ProtocolLib.ogUpdateCacheIsNecesary (repositorio, path, protocolo)
# si rc=True: actualizamos; si rc=False: no actualizamos (exit 0); si rc=None: exit error
if rc == True: pass ## es necesario actualizar
elif rc == False: sys.exit (0) ## no es necesario actualizar
elif rc == None: sys.exit (ogGlobals.OG_ERR_UPDATECACHE) ## hubo errores
SystemLib.ogEcho (['log', 'session'], None, ogGlobals.lang.MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE)
cachesize = CacheLib.ogGetCacheSize()
cache_disk, cache_par = CacheLib.ogFindCache().split()
cachesizefree = FileSystemLib.ogGetFreeSize (cache_disk, cache_par)
path_repo = FileLib.ogGetPath ('REPO', path)
filesize = int (subprocess.run (['ls', '-sk', path_repo], capture_output=True, text=True).stdout.split()[0])
realfilesize = subprocess.run (['stat', '--format', '%s', repofile], capture_output=True, text=True).stdout
realfilesize = int (int (realfilesize) / 1024)
# La sincronizada, si existe la imagen en cache el espacio necesario
# es la nueva menos lo que ocupa la que ya hay.
sizerequired = filesize
#ERROR CACHESIZE 16 (tamanyo de la CACHE insuficiente)
if sizerequired >= cachesize:
SystemLib.ogEcho (['log', 'session'], None, f'{ogGlobals.lang.MSG_WARNING}: {ogGlobals.lang.MSG_ERR_CACHESIZE}: {path} = {sizerequired} > CACHE = {cachesize}')
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_CACHESIZE, 'CACHE')
sys.exit (1)
#ERROR CACHESIZE 16 (Espacio libre en CACHE insuficiente)
if sizerequired >= cachesizefree:
SystemLib.ogEcho (['log', 'session'], None, f'{ogGlobals.lang.MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO}: ACTIONCACHEFULL={ogGlobals.ACTIONCACHEFULL}')
if 'NONE' == ogGlobals.ACTIONCACHEFULL:
SystemLib.ogEcho (['log', 'session'], None, f'{ogGlobals.lang.MSG_WARNING}: {ogGlobals.lang.MSG_ERR_CACHESIZE}: {path} = {sizerequired} > FREE SPACE CACHE = {cachesizefree}')
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_CACHESIZE, 'CACHE FULL, NO SPACE FREE')
sys.exit (1)
elif 'FORMAT' == ogGlobals.ACTIONCACHEFULL:
SystemLib.ogEcho (['log', 'session'], None, f'[51] {ogGlobals.lang.MSG_HELP_ogFormatCache}')
CacheLib.ogUnmountCache()
CacheLib.ogFormatCache()
CacheLib.ogMountCache()
elif 'DELETE' == ogGlobals.ACTIONCACHEFULL:
SystemLib.ogEcho (['log', 'session'], None, f'[51] {ogGlobals.lang.MSG_HELP_ogDeleteTree} {ogGlobals.OGCAC}{ogGlobals.OGIMG}/*')
for d in glob.glob (f'{ogGlobals.OGCAC}{ogGlobals.OGIMG}/*'):
shutil.rmtree (d)
else:
SystemLib.ogEcho (['log', 'session'], None, f'{ogGlobals.lang.MSG_WARNING}: {ogGlobals.lang.MSG_ERR_CACHESIZE}: {path} = {filesize} > CACHE = {cachesizefree}')
SystemLib.ogRaiseError ('session', ogGlobals.OG_ERR_CACHESIZE, 'CACHE')
sys.exit (1)
# Comprobamos que imagen cache igual a la del repo. Si sincronizada no podemos comprobar.
## nati: esto ya lo hicimos mas arriba...
rc = ProtocolLib.ogUpdateCacheIsNecesary (repositorio, path, protocolo)
# si rc=True: actualizamos; si rc=False: no actualizamos (exit 0); si rc=None: exit error
if rc == True: pass ## es necesario actualizar
elif rc == False: sys.exit (0) ## no es necesario actualizar
elif rc == None: sys.exit (ogGlobals.OG_ERR_UPDATECACHE) ## hubo errores
CacheLib.ogMountCache()
## Si no existe, crear subdirectorio para el fichero en la cache.
imgdir = FileLib.ogGetParentPath ('CACHE', f'/{path}')
if not imgdir:
SystemLib.ogEcho (['log', 'session'], None, f'[5] {ogGlobals.lang.MSG_HELP_ogMakeDir} "{path} {os.path.dirname (path)}".')
FileLib.ogMakeDir ('CACHE', os.path.dirname (f'/{path}'))
imgdir = ogGetParentPath ('CACHE', f'/{path}')
if not imgdir:
sys.exit (1)
t0 = time.time()
if 'TORRENT' == protocolo:
SystemLib.ogEcho (['log', 'session'], None, f'ogCopyFile {repositorio} {path}.torrent absolute {ogGlobals.OGCAC}/{ogGlobals.OGIMG}')
mac_digits = NetLib.ogGetMacAddress().split (':')
timewait = int ('0x' + mac_digits[4] + mac_digits[5], 16) * 120 / 65535
if not SystemLib.ogExecAndLog ('command', FileLib.ogCopyFile, {'container':repositorio, 'file':f'{path}.torrent'}, {'file':imgdir}):
sys.exit (1)
p2pwait = random.randint (1, 121)
SystemLib.ogEcho (['log', 'session'], None, f' [ ] {ogGlobals.lang.MSG_SCRIPTS_TASK_SLEEP} : {p2pwait} seconds')
time.sleep (p2pwait)
SystemLib.ogEcho (['log', 'session'], None, f' [ ] {ogGlobals.lang.MSG_SCRIPTS_TASK_START}: ogTorrentStart CACHE {path}.torrent {optprotocolo}')
SystemLib.ogExecAndLog ('command', ProtocolLib.ogTorrentStart, 'CACHE', f'{path}.torrent', optprotocolo)
resumeupdatecache = subprocess.run (['grep', '--max-count', '1', '--before-context', '1', 'Download', ogGlobals.OGLOGCOMMAND], capture_output=True, text=True).stdout
resumeupdatecachebf = subprocess.run (['grep', '--max-count', '1', 'Download', ogGlobals.OGLOGCOMMAND], capture_output=True, text=True).stdout
if 'Download complete.' == resumeupdatecachebf:
os.unlink (imgdir + path + '.torrent.bf')
elif 'MULTICAST' == protocolo:
SystemLib.ogEcho (['log', 'session'], None, f'{ogGlobals.lang.MSG_SCRIPTS_UPDATECACHE_CHECKMCASTSESSION}: {repoip}:{port}')
time.sleep (random.randint (1, 31))
SystemLib.ogEcho (['log', 'session'], None, f'ogMcastRequest {path} {optprotocolo}')
if not SystemLib.ogExecAndLog ('command', ProtocolLib.ogMcastRequest, path, optprotocolo):
sys.exit (1)
SystemLib.ogEcho (['log', 'session'], None, f'ogMcastReceiverFile {port} CACHE {path}')
if not SystemLib.ogExecAndLog ('command', ProtocolLib.ogMcastReceiverFile, port, 'CACHE', path):
sys.exit (1)
resumeupdatecache = subprocess.run (['grep', '--max-count', '1', '--before-context', '1', 'Transfer complete', f'{ogGlobals.OGLOGCOMMAND}.tmp'], capture_output=True, text=True).stdout
elif 'UNICAST' == protocolo:
print (f'ogExecAndLog ("command", FileLib.ogCopyFile, {{"container":{repositorio}, "file":{path}}}, {{"file":{imgdir}}})')
SystemLib.ogExecAndLog ('command', FileLib.ogCopyFile, {'container':repositorio, 'file':path}, {'file':imgdir})
time.sleep (5)
resumeupdatecache = subprocess.run (['grep', '--max-count', '1', '100%', f'{ogGlobals.OGLOGCOMMAND}.tmp'], capture_output=True, text=True).stdout
elif 'RSYNC' == protocolo:
raise Exception ('synchronised images are no longer supported')
t = time.time() - t0
SystemLib.ogEcho (['log', 'session'], None, f' [ ] {resumeupdatecache} ')
SystemLib.ogEcho (['log', 'session'], None, f' [ ] {ogGlobals.lang.MSG_SCRIPTS_TIME_PARTIAL} updateCache {int (t/60)}m {int (t%60)}s')
SystemLib.ogEcho (['log', 'session'], None, f' [ ] {ogGlobals.lang.MSG_SCRIPTS_TASK_START} {ogGlobals.lang.MSG_HELP_ogCalculateChecksum} ')
t0 = time.time()
# Si es imagen sincronizada siempre da distinto md5. No podemos comprobar
rc = ProtocolLib.ogUpdateCacheIsNecesary (repositorio, path, protocolo)
if 'deployImage' != SystemLib.ogGetCaller():
t = time.time() - t0
SystemLib.ogEcho (['log', 'session'], None, f' [ ] {ogGlobals.lang.MSG_SCRIPTS_TIME_PARTIAL} {ogGlobals.lang.MSG_HELP_ogCalculateChecksum} {int (t/60)}m {int (t%60)}s')
# si rc todavia es True: exit error; si rc=False: todo bien (exit 0); si rc=None: exit error
if rc == True: sys.exit (ogGlobals.OG_ERR_UPDATECACHE)
elif rc == False: sys.exit (0)
elif rc == None: sys.exit (ogGlobals.OG_ERR_UPDATECACHE)