diff --git a/client/lib/engine/bin/FileLib.py b/client/lib/engine/bin/FileLib.py index dc649d1..e9de16f 100755 --- a/client/lib/engine/bin/FileLib.py +++ b/client/lib/engine/bin/FileLib.py @@ -233,9 +233,9 @@ def ogGetPath (src=None, file=None): #*/ ## #ogGetParentPath ([ str_repo | int_ndisk int_npartition ] path_filepath -#ogGetParentPath ('/mnt/sda1/windows/system32') ==> '/mnt/sda1/WINDOWS' -#ogGetParentPath ('REPO', '/etc/fstab') ==> '/opt/opengnsys/images/etc' -#ogGetParentPath ('1 1', '/windows/system32') ==> '/mnt/sda1/WINDOWS' +#ogGetParentPath ( file='/mnt/sda1/windows/system32') ==> '/mnt/sda1/WINDOWS' +#ogGetParentPath (src='REPO', file='/etc/fstab') ==> '/opt/opengnsys/images/etc' +#ogGetParentPath (src='1 1', file='/windows/system32') ==> '/mnt/sda1/WINDOWS' def ogGetParentPath (src=None, file=None): if file is None: SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, '') diff --git a/client/lib/engine/bin/ProtocolLib.py b/client/lib/engine/bin/ProtocolLib.py index 4fa50b5..b070ac8 100644 --- a/client/lib/engine/bin/ProtocolLib.py +++ b/client/lib/engine/bin/ProtocolLib.py @@ -658,6 +658,119 @@ def ogMcastRequest (img, proto): #@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. #*/ ## +#ogTorrentStart ( torrentfile='/opt/opengnsys/cache/linux.iso', torrentsess='peer:60') +#ogTorrentStart (container='CACHE', torrentfile='/PS1_PH1.img.torrent', torrentsess='seeder:10000') +#ogTorrentStart (disk=1, par=1, torrentfile='/linux.iso.torrent', torrentsess='leecher:60') +def ogTorrentStart (disk=None, par=None, container=None, torrentfile=None, torrentsess=None): + if torrentfile is None: + raise TypeError ('missing required argument: "torrentfile"') + if torrentsess is None: + raise TypeError ('missing required argument: "torrentsess"') + + if container is not None: + if disk is None and par is None: + ## we were given container= + if 'CACHE' != container.upper(): + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, 'La descarga torrent solo se hace desde local, copia el torrent a la cache y realiza la operación desde esa ubicación') + return None + source = FileLib.ogGetPath (src=container, file=torrentfile) + dev_err = f'{container} {torrentfile}' + print (f'ogGetPath (src=({container}), file=({torrentfile})) = source ({source})') + 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= + source = FileLib.ogGetPath (src=f'{disk} {par}', file=torrentfile) + dev_err = f'{disk} {par} {torrentfile}' + print (f'ogGetPath (src=({disk} {par}), file=({torrentfile})) = source ({source})') + elif disk is None and par is None: + ## we were given nothing + if torrentfile.startswith ('/opt/opengnsys/images'): + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, 'La descarga torrent solo se hace desde local, copia el torrent a la cache y realiza la operación desde esa ubicación') + return None + source = FileLib.ogGetPath (file=torrentfile) + dev_err = torrentfile + print (f'ogGetPath (file=({torrentfile})) = source ({source})') + else: + raise TypeError ('if one of "disk" and "par" are specified, then both must be') + + if not source: + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, f'device or torrentfile {dev_err} not found') + return + + if subprocess.run (['ctorrent', '-x', source]).returncode: + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_NOTFOUND, '') + return None + + target = re.sub (r'\.torrent$', '', source) + dirsource = FileLib.ogGetParentPath (file=source) + + ERROR = None + sess = torrentsess.split (':') + if 2 != len (sess): + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, 'parametros session Torrent no completa: modo:tiempo') + return None + + mode = sess[0].lower() + if mode not in ['seeder', 'peer', 'leecher']: + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, f'valor modo Torrent no valido {sess[0]}') + return None + + time = sess[1] + if not re.search (r'^[0-9]{1,10}$', time): + SystemLib.ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, f'valor tiempo no valido {sess[1]}') + return None + time = int (time) + + OPTION = None + cwd = os.getcwd() + # si No fichero .bf, y Si fichero destino imagen ya descargada y su chequeo fue comprobado en su descarga inicial. + if not os.path.exists (f'{source}.bf') and os.path.exists (target): + print ('imagen ya descargada') + if 'seeder' != mode: return 'success' ## return any true value + + print ('MODE seeder ctorrent') + os.chdir (dirsource) + subprocess.run (['timeout', '--signal', 'INT', time, 'ctorrent', '-f', source]) + os.chdir (cwd) + return 'success' + + #Si no existe bf ni fichero destino descarga inicial. + if not os.path.exists (f'{source}.bf') and not os.path.exists (target): + print ('descarga inicial') + OPTION = 'DOWNLOAD' + + # Si fichero bf descarga anterior no completada -. + if os.path.exists (f'{source}.bf') and os.path.exists (target): + print ('Continuar con Descargar inicial no terminada.') + OPTION = 'DOWNLOAD' + + if 'DOWNLOAD' != OPTION: return 'success' + + os.chdir (dirsource) + if 'peer' == mode: + print ('Donwloading Torrent as peer') + # Creamos el fichero de resumen por defecto + with open (f'{source}.bf', 'w') as fd: pass + # ctorrent controla otro fichero -b ${SOURCE}.bfog + subprocess.run (['ctorrent', '-f', '-c', '-X', f'sleep {time}; kill -2 $(pidof ctorrent)', '-C', '100', source, '-s', target, '-b', f'{source}.bfog']) + elif 'leecher' == mode: + print ('Donwloading Torrent as leecher') + subprocess.run (['ctorrent', '${SOURCE}', '-X', 'sleep 30; kill -2 $(pidof ctorrent)', '-C', '100', '-U', '0']) + elif 'seeder' == mode: + print ('MODE seeder ctorrent') + # Creamos el fichero de resumen por defecto + with open (f'{source}.bf', 'w') as fd: pass + # ctorrent controla otro fichero -b ${SOURCE}.bfog + subprocess.run (['ctorrent', '-f', '-c', '-X', f'sleep {time}; kill -2 $(pidof ctorrent)', '-C', '100', source, '-s', target, '-b', f'{source}.bfog']) + else: + print ('this should not happen') + return None + + os.chdir (cwd) + #/** # ogCreateTorrent [ str_repo | int_ndisk int_npart ] Relative_path_file