diff --git a/linux/debian/changelog b/linux/debian/changelog index 9a3204e..d434d00 100644 --- a/linux/debian/changelog +++ b/linux/debian/changelog @@ -1,3 +1,9 @@ +ogagent (1.3.8-1) stable; urgency=medium + + * Add more functionality to the ogAdmClient module + + -- OpenGnsys developers Tue, 01 Oct 2024 13:41:48 +0200 + ogagent (1.3.7-1) stable; urgency=medium * CloningEngine: RESTfully keep a list of long-running jobs diff --git a/ogcore-mock.py b/ogcore-mock.py index 765ba5e..5008317 100644 --- a/ogcore-mock.py +++ b/ogcore-mock.py @@ -167,6 +167,11 @@ def disponibilidad_comandos(): return jsonify({}) +@app.route('/opengnsys/rest/ogAdmClient/recibeArchivo', methods=['POST']) +def oac_recibe_archivo(): + logging.info(f'{request.get_json()}') + return jsonify({'anything':'anything'}) ## if we return {}, then we trigger "if not {}" which happens to be true + @app.route('/opengnsys/rest/ogAdmClient/', methods=['GET', 'POST']) def oac_cucu(cucu): #j = request.get_json(force=True) @@ -181,7 +186,7 @@ def oac_cucu(cucu): ## agente oglive: modulo CloningEngine @app.route('/opengnsys/rest/CloningEngine/recibeArchivo', methods=['POST']) -def recibe_archivo(): +def ce_recibe_archivo(): logging.info(f'{request.get_json()}') return jsonify({'anything':'anything'}) ## if we return {}, then we trigger "if not {}" which happens to be true diff --git a/src/VERSION b/src/VERSION index 3336003..e05cb33 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -1.3.7 +1.3.8 diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index a7c44cb..bd96d8a 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -50,21 +50,6 @@ class CloningEngineWorker (ogLiveWorker): def onDeactivation (self): logger.debug ('onDeactivation') - ## en C, esto envia una trama de respuesta al servidor. Devuelve un boolean - ## en python, simplemente termina de construir la respuesta y la devuelve; no envía nada por la red. El caller la usa en return() para enviar implícitamente la respuesta - def respuestaEjecucionComando (self, cmd, herror, ids): - if ids: ## Existe seguimiento - cmd['ids'] = ids ## Añade identificador de la sesión - - if 0 == herror: ## el comando terminó con resultado satisfactorio - cmd['res'] = 1 - cmd['der'] = '' - else: ## el comando tuvo algún error - cmd['res'] = 2 - cmd['der'] = self.tbErroresScripts[herror] ## XXX - - return cmd - def InventariandoSoftware (self, dsk, par, sw, nfn): sft_src = f'/tmp/CSft-{self.IPlocal}-{par}' try: diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 3184068..bc2d5c6 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -36,6 +36,8 @@ import base64 #import threading #import time import subprocess +from pathlib import Path +from urllib.parse import unquote #from opengnsys import operations from opengnsys.log import logger @@ -421,7 +423,36 @@ class ogAdmClientWorker (ogLiveWorker): return {} ## ogAdmClient.c:920 def process_ConsolaRemota (self, path, get_params, post_params, server): - logger.warning ('in process_ConsolaRemota') + logger.debug ('in process_ConsolaRemota, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + + for k in ['nfn', 'scp']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = unquote (post_params['nfn']) + scp = unquote (post_params['scp']) + filescript = f'/tmp/_script_{self.IPlocal}' + ecosrc = f'/tmp/_econsola_{self.IPlocal}' + ecodst = f'/tmp/_Seconsola_{self.IPlocal}' ## Nombre que tendra el archivo en el Servidor + + with open (filescript, 'w') as fd: + fd.write (scp) + + try: + self.interfaceAdmin (nfn, [filescript, ecosrc]) + ecosrc_contents = Path (ecosrc).read_bytes() + except: + logger.error ('Error al ejecutar el comando') + return {} + + logger.debug ('sending recibeArchivo to server') + res = self.enviaMensajeServidor ('recibeArchivo', { 'nfl': ecodst, 'contents': base64.b64encode (ecosrc_contents).decode ('utf-8') }) + logger.debug (res) + if not res: + logger.error ('Ha ocurrido algún problema al enviar un archivo por la red') + + return {} def process_Arrancar (self, path, get_params, post_params, server): logger.warning ('in process_Arrancar') diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index e09b74e..0560ceb 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -114,6 +114,21 @@ class ogLiveWorker(ServerWorker): return res + ## en C, esto envia una trama de respuesta al servidor. Devuelve un boolean + ## en python, simplemente termina de construir la respuesta y la devuelve; no envía nada por la red. El caller la usa en return() para enviar implícitamente la respuesta + def respuestaEjecucionComando (self, cmd, herror, ids=None): + if ids: ## Existe seguimiento + cmd['ids'] = ids ## Añade identificador de la sesión + + if 0 == herror: ## el comando terminó con resultado satisfactorio + cmd['res'] = 1 + cmd['der'] = '' + else: ## el comando tuvo algún error + cmd['res'] = 2 + cmd['der'] = self.tbErroresScripts[herror] ## XXX + + return cmd + def cargaPaginaWeb (self, url=None): if (not url): url = self.urlMenu os.system ('pkill -9 browser')