#!/usr/bin/python3 import ogGlobals import SystemLib import ImageLib #/** #@file ProtocolLib.py #@brief Librería o clase Protocol #@class Protocol #@brief Funciones para transmisión de datos #@warning License: GNU GPLv3+ #*/ ##################### FUNCIONES UNICAST ################ #/** # ogUcastSyntax #@brief Función para generar la instrucción de transferencia de datos unicast #@param 1 Tipo de operación [ SENDPARTITION RECEIVERPARTITION SENDFILE RECEIVERFILE ] #@param 2 Sesion Unicast #@param 3 Dispositivo (opción PARTITION) o fichero(opción FILE) que será enviado. #@param 4 Tools de clonación (opcion PARTITION) #@param 5 Tools de compresion (opcion PARTITION) #@return instrucción para ser ejecutada. #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_UCASTSYNTAXT formato de la sesion unicast incorrecta. #@note Requisitos: mbuffer #@todo: controlar que mbuffer esta disponible para los clientes. #*/ ## #ogUcastSyntax SENDPARTITION 8000:172.17.36.11:172.17.36.12 device tool level #ogUcastSyntax RECEIVERPARTITION 8000:172.17.36.249 device tool level #ogUcastSyntax SENDFILE 8000:172.17.36.11:172.17.36.12 file #ogUcastSyntax RECEIVERFILE 8000:172.17.36.249 file def ogUcastSyntax (op, sess, file=None, device=None, tool=None, level=None): if 'SENDPARTITION' == op or 'RECEIVERPARTITION' == op: if device is None: raise TypeError ('missing required argument: "device"') if tool is None: raise TypeError ('missing required argument: "tool"') if tool not in ['partclone', 'PARTCLONE', 'partimage', 'PARTIMAGE', 'ntfsclone', 'NTFSCLONE']: raise TypeError (f'argument "tool" has unsupported value "{tool}"') if level is None: raise TypeError ('missing required argument: "level"') if level not in ['lzop', 'gzip', 'LZOP', 'GZIP', '0', '1']: raise TypeError (f'argument "level" has unsupported value "{level}"') elif 'SENDFILE' == op or 'RECEIVERFILE' == op: if file is None: raise TypeError ('missing required argument: "file"') else: raise TypeError ('first parameter should match (SEND|RECEIVER)(PARTITION|FILE), eg. "SENDFILE"') if 'SEND' in op: mode = 'server' else: mode = 'client' session = sess.split (':') portbase = int (session[0]) if portbase not in range (8000, 8006): SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, f'McastSession portbase {portbase}') ## || PERROR=3 return if 'SERVER' == mode: address = '' for i in range (1, len (session)): address += f'-O {session[i]}:{portbase}' else: address = f'{session[1]}:{portbase}' print (f'nati mode ({mode}) address ({address})') if 'SENDPARTITION' == op: syn = ImageLib.ogCreateImageSyntax (device, ' ', tool, level) ## REQUIRES package mbuffer to be installed!! ## otherwise, param2 in ImageLib.ogCreateImageSyntax() is not '| mbuffer' but empty ## and then parts[2] is out of range parts = syn.split ('|') print (f'syn ({syn}) parts ({parts})') prog1 = f'{parts[0]}|{parts[2]}'.strip() prog1 = prog1.replace ('>', '').strip() return f'{prog1} | mbuffer {address}' elif 'RECEIVERPARTITION' == op: syn = ImageLib.ogRestoreImageSyntax (' ', device, tool, level) parts = syn.split ('|') compressor = parts[0].strip() tools = parts[-1].strip() return f'mbuffer -I {address} | {compressor} | {tools}' elif 'SENDFILE' == op: return f'mbuffer {address} -i {file}' elif 'RECEIVERFILE' == op: return f'mbuffer -I {address} -i {file}' else: pass ## shouldn't happen #/** # ogUcastSendPartition #@brief Función para enviar el contenido de una partición a multiples particiones remotas usando UNICAST. #@param 1 disk #@param 2 partition #@param 3 sesionUcast #@param 4 tool image #@param 5 tool compresor #@return #@exception $OG_ERR_FORMAT #@exception $OG_ERR_UCASTSENDPARTITION #@note #@todo: ogIsLocked siempre devuelve 1 #*/ ## #/** # ogUcastReceiverPartition #@brief Función para recibir directamente en la partición el contenido de un fichero imagen remoto enviado por UNICAST. #@param 1 disk #@param 2 partition #@param 3 session unicast #@return #@exception OG_ERR_FORMAT #@exception OG_ERR_UCASTRECEIVERPARTITION #@note #@todo: #*/ ## #/** # ogUcastSendFile [ str_repo | int_ndisk int_npart ] /Relative_path_file sessionMulticast #@brief Envía un fichero por unicast ORIGEN(fichero) DESTINO(sessionmulticast) #@param (2 parámetros) $1 path_aboluto_fichero $2 sesionMcast #@param (3 parámetros) $1 Contenedor REPO|CACHE $2 path_absoluto_fichero $3 sesionMulticast #@param (4 parámetros) $1 disk $2 particion $3 path_absoluto_fichero $4 sesionMulticast #@return #@exception OG_ERR_FORMAT formato incorrecto. #@exception $OG_ERR_NOTFOUND #@exception OG_ERR_UCASTSENDFILE #@note Requisitos: #*/ ## # #/** # ogMcastSyntax #@brief Función para generar la instrucción de ejucción la transferencia de datos multicast #@param 1 Tipo de operación [ SENDPARTITION RECEIVERPARTITION SENDFILE RECEIVERFILE ] #@param 2 Sesión Mulicast #@param 3 Dispositivo (opción PARTITION) o fichero(opción FILE) que será enviado. #@param 4 Tools de clonación (opcion PARTITION) #@param 5 Tools de compresion (opcion PARTITION) #@return instrucción para ser ejecutada. #@exception OG_ERR_FORMAT formato incorrecto. #@exception OG_ERR_NOTEXEC #@exception OG_ERR_MCASTSYNTAXT #@note Requisitos: upd-cast 2009 o superior #@todo localvar check versionudp #*/ ## # #/** # ogMcastSendFile [ str_repo | int_ndisk int_npart ] /Relative_path_file sessionMulticast #@brief Envía un fichero por multicast ORIGEN(fichero) DESTINO(sessionmulticast) #@param (2 parámetros) $1 path_aboluto_fichero $2 sesionMcast #@param (3 parámetros) $1 Contenedor REPO|CACHE $2 path_absoluto_fichero $3 sesionMulticast #@param (4 parámetros) $1 disk $2 particion $3 path_absoluto_fichero $4 sesionMulticast #@return #@exception OG_ERR_FORMAT formato incorrecto. #@exception $OG_ERR_NOTFOUND #@exception OG_ERR_MCASTSENDFILE #*/ ## # #/** # ogMcastReceiverFile sesion Multicast [ str_repo | int_ndisk int_npart ] /Relative_path_file #@brief Recibe un fichero multicast ORIGEN(sesionmulticast) DESTINO(fichero) #@param (2 parámetros) $1 sesionMcastCLIENT $2 path_aboluto_fichero_destino #@param (3 parámetros) $1 sesionMcastCLIENT $2 Contenedor REPO|CACHE $3 path_absoluto_fichero_destino #@param (4 parámetros) $1 sesionMcastCLIENT $2 disk $3 particion $4 path_absoluto_fichero_destino #@return #@exception OG_ERR_FORMAT formato incorrecto. #@exception $OG_ERR_MCASTRECEIVERFILE #@note Requisitos: #*/ ## # #/** # ogMcastSendPartition #@brief Función para enviar el contenido de una partición a multiples particiones remotas. #@param 1 disk #@param 2 partition #@param 3 session multicast #@param 4 tool clone #@param 5 tool compressor #@return #@exception OG_ERR_FORMAT #@exception OG_ERR_MCASTSENDPARTITION #@note #@todo: ogIsLocked siempre devuelve 1. crear ticket #*/ ## #/** # ogMcastReceiverPartition #@brief Función para recibir directamente en la partición el contenido de un fichero imagen remoto enviado por multicast. #@param 1 disk #@param 2 partition #@param 3 session multicast #@param 4 tool clone #@param 5 tool compressor #@return #@exception $OG_ERR_FORMAT #*/ ## #/** # ogMcastRequest #@brief Función temporal para solicitar al ogRepoAux el envio de un fichero por multicast #@param 1 Fichero a enviar ubicado en el REPO. puede ser ruta absoluta o relatica a /opt/opengnsys/images #@param 2 PROTOOPT opciones protocolo multicast #@return #@exception #*/ ## ########################################## ############## funciones torrent #/** # ogTorrentStart [ str_repo | int_ndisk int_npart ] Relative_path_file.torrent | SessionProtocol #@brief Función iniciar P2P - requiere un tracker para todos los modos, y un seeder para los modos peer y leecher y los ficheros .torrent. #@param str_pathDirectory str_Relative_path_file #@param int_disk int_partition str_Relative_path_file #@param str_REPOSITORY(CACHE - LOCAL) str_Relative_path_file #@param (2 parámetros) $1 path_aboluto_fichero_torrent $2 Parametros_Session_Torrent #@param (3 parámetros) $1 Contenedor CACHE $2 path_absoluto_fichero_Torrent $3 Parametros_Session_Torrent #@param (4 parámetros) $1 disk $2 particion $3 path_absoluto_fichero_Torrent 4$ Parametros_Session_Torrent #@return #@note protocoloTORRENT=mode:time mode=seeder -> Dejar el equipo seedeando hasta que transcurra el tiempo indicado o un kill desde consola, mode=peer -> seedear mientras descarga mode=leecher -> NO seedear mientras descarga time tiempo que una vez descargada la imagen queremos dejar al cliente como seeder. #*/ ## #/** # ogCreateTorrent [ str_repo | int_ndisk int_npart ] Relative_path_file #@brief Función para crear el fichero torrent. #@param str_pathDirectory str_Relative_path_file #@param int_disk int_partition str_Relative_path_file #@param str_REPOSITORY(CACHE - LOCAL) str_Relative_path_file #@return #@exception OG_ERR_FORMAT Formato incorrecto. #@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. #@exception OG_ERR_PARTITION Tipo de partición desconocido o no se puede montar. #@exception OG_ERR_NOTOS La partición no tiene instalado un sistema operativo. #*/ ## #/** # ogUpdateCacheIsNecesary [ str_repo ] Relative_path_file_OGIMG_with_/ #@brief Comprueba que el fichero que se desea almacenar en la cache del cliente, no esta. #@param 1 str_REPO #@param 2 str_Relative_path_file_OGIMG_with_/ #@param 3 md5 to check: use full to check download image torrent #@return 0 (true) cache sin imagen, SI es necesario actualizar el fichero. #@return 1 (false) imagen en la cache, NO es necesario actualizar el fichero #@return >1 (false) error de sintaxis (TODO) #@note #@todo: Proceso en el caso de que el fichero tenga el mismo nombre, pero su contenido sea distinto. #@todo: Se dejan mensajes mientras se confirma su funcionamiento. #*/ ##