From 5cb2ef6cfcb4f23b6e3479ae9763fc6acb594c4b Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 1 Oct 2024 13:31:27 +0200 Subject: [PATCH 01/29] refs #783 implement process_Actualizar() --- .../modules/server/ogAdmClient/__init__.py | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 3c617ea..9aaa408 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -162,10 +162,6 @@ class ogAdmClientWorker (ogLiveWorker): #def onLogout (self, user): # logger.warning ('in onLogout, should not happen') - @check_secret - def process_status (self, path, get_params, post_params, server): - return {self.name: 'in process_status'} ## XXX - #@check_secret #def process_reboot (self, path, get_params, post_params, server): # """ @@ -203,15 +199,6 @@ class ogAdmClientWorker (ogLiveWorker): # threading.Thread (target=pwoff).start() # return {'op': 'launched'} - ## curl --insecure -X POST --data '{"nfn": "popup", "title": "my title", "message": "my message"}' https://192.168.1.249:8000/ogAdmClient/popup - @check_secret - def process_popup (self, path, get_params, post_params, server): - logger.debug ('in process_popup, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) - logger.debug ('type(post_params) "{}"'.format (type (post_params))) - ## in process_popup, should not happen, path "[]" get_params "{}" post_params "{'title': 'mi titulo', 'message': 'mi mensaje'}" server "" - ## type(post_params) "" - return {'debug':'test'} - @@ -394,9 +381,36 @@ class ogAdmClientWorker (ogLiveWorker): logger.info ('onActivation ok') + @check_secret + def process_status (self, path, get_params, post_params, server): + return {self.name: 'in process_status'} ## XXX + + ## curl --insecure -X POST --data '{"nfn": "popup", "title": "my title", "message": "my message"}' https://192.168.1.249:8000/ogAdmClient/popup + @check_secret + def process_popup (self, path, get_params, post_params, server): + logger.debug ('in process_popup, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + logger.debug ('type(post_params) "{}"'.format (type (post_params))) + ## in process_popup, should not happen, path "[]" get_params "{}" post_params "{'title': 'mi titulo', 'message': 'mi mensaje'}" server "" + ## type(post_params) "" + return {'debug':'test'} + ## curl --insecure https://192.168.1.249:8000/ogAdmClient/Actualizar def process_Actualizar (self, path, get_params, post_params, server): - logger.warning ('in process_Actualizar') + logger.debug ('in process_Actualizar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + self.muestraMensaje (1) + #if !comandosPendientes: error 84 'Ha ocurrido algún problema al reiniciar la sesión del cliente' + cfg = self.LeeConfiguracion() + if not cfg: + logger.warning ('No se ha podido recuperar la configuración de las particiones del disco') + logger.error ('LeeConfiguracion() failed') + return {} + + cmd = { + 'nfn': 'RESPUESTA_Configurar', + 'cfg': cfg, + } + self.muestraMenu() + return self.respuestaEjecucionComando (cmd, 3) def process_Purgar (self, path, get_params, post_params, server): logger.warning ('in process_Purgar') From aa0f62edccdc2a59d0957e08b575aa8ab0bf85a6 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 1 Oct 2024 13:33:04 +0200 Subject: [PATCH 02/29] refs #784 implement process_Purgar() --- src/opengnsys/modules/server/ogAdmClient/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 9aaa408..8b5ca6c 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -413,7 +413,8 @@ class ogAdmClientWorker (ogLiveWorker): return self.respuestaEjecucionComando (cmd, 3) def process_Purgar (self, path, get_params, post_params, server): - logger.warning ('in process_Purgar') + logger.debug ('in process_Purgar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + exit (0) ## ogAdmClient.c:905 def process_ConsolaRemota (self, path, get_params, post_params, server): logger.warning ('in process_ConsolaRemota') From 62a2514569e93c2b680b05d9a979895ab39d9249 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 1 Oct 2024 13:33:54 +0200 Subject: [PATCH 03/29] refs #785 implement process_Sondeo() --- src/opengnsys/modules/server/ogAdmClient/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 8b5ca6c..3184068 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -416,12 +416,13 @@ class ogAdmClientWorker (ogLiveWorker): logger.debug ('in process_Purgar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) exit (0) ## ogAdmClient.c:905 + def process_Sondeo (self, path, get_params, post_params, server): + logger.debug ('in process_Sondeo, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return {} ## ogAdmClient.c:920 + def process_ConsolaRemota (self, path, get_params, post_params, server): logger.warning ('in process_ConsolaRemota') - def process_Sondeo (self, path, get_params, post_params, server): - logger.warning ('in process_Sondeo') - def process_Arrancar (self, path, get_params, post_params, server): logger.warning ('in process_Arrancar') From e28094ec1b9d432628499294edd705da1c0208d8 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 1 Oct 2024 14:15:10 +0200 Subject: [PATCH 04/29] refs #786 implement process_ConsolaRemota() --- linux/debian/changelog | 6 ++++ ogcore-mock.py | 7 +++- src/VERSION | 2 +- .../modules/server/CloningEngine/__init__.py | 15 --------- .../modules/server/ogAdmClient/__init__.py | 33 ++++++++++++++++++- src/opengnsys/workers/oglive_worker.py | 15 +++++++++ 6 files changed, 60 insertions(+), 18 deletions(-) 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') From 3191a171a1542637d193c89e9c73265535550c1a Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 1 Oct 2024 14:15:59 +0200 Subject: [PATCH 05/29] refs #783 fix return code --- src/opengnsys/modules/server/ogAdmClient/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index bc2d5c6..3a39119 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -412,7 +412,7 @@ class ogAdmClientWorker (ogLiveWorker): 'cfg': cfg, } self.muestraMenu() - return self.respuestaEjecucionComando (cmd, 3) + return self.respuestaEjecucionComando (cmd, 0) def process_Purgar (self, path, get_params, post_params, server): logger.debug ('in process_Purgar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) From 647489d507b958c8fdb3566ee59e040a37de215b Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Thu, 3 Oct 2024 14:20:48 +0200 Subject: [PATCH 06/29] refs #783 make Actualizar() asynchronous --- .../modules/server/CloningEngine/__init__.py | 24 +------------------ .../modules/server/ogAdmClient/__init__.py | 9 +++---- src/opengnsys/workers/oglive_worker.py | 22 +++++++++++++++++ 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index bd96d8a..ac9ac2c 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -32,12 +32,10 @@ import base64 import os -import time -import random from pathlib import Path from opengnsys.log import logger -from opengnsys.workers import ogLiveWorker, ThreadWithResult +from opengnsys.workers import ogLiveWorker class CloningEngineWorker (ogLiveWorker): name = 'CloningEngine' # Module name @@ -171,26 +169,6 @@ class CloningEngineWorker (ogLiveWorker): } return self.respuestaEjecucionComando (cmd, herror, ids) - def _long_running_job (self, name, f, args): - any_job_running = False - for k in self.thread_list: - if self.thread_list[k]['running']: - any_job_running = True - break - if any_job_running: - logger.info ('some job is already running, refusing to launch another one') - return { 'job_id': None, 'message': 'some job is already running, refusing to launch another one' } - - job_id = '{}-{}'.format (name, ''.join (random.choice ('0123456789abcdef') for _ in range (8))) - self.thread_list[job_id] = { - 'thread': ThreadWithResult (target=f, args=args), - 'starttime': time.time(), - 'running': True, - 'result': None - } - self.thread_list[job_id]['thread'].start() - return { 'job_id': job_id } - def process_status (self, path, get_params, post_params, server): ## join finished threads for k in self.thread_list: diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 3a39119..24c8d8d 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -387,7 +387,6 @@ class ogAdmClientWorker (ogLiveWorker): def process_status (self, path, get_params, post_params, server): return {self.name: 'in process_status'} ## XXX - ## curl --insecure -X POST --data '{"nfn": "popup", "title": "my title", "message": "my message"}' https://192.168.1.249:8000/ogAdmClient/popup @check_secret def process_popup (self, path, get_params, post_params, server): logger.debug ('in process_popup, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) @@ -396,9 +395,7 @@ class ogAdmClientWorker (ogLiveWorker): ## type(post_params) "" return {'debug':'test'} - ## curl --insecure https://192.168.1.249:8000/ogAdmClient/Actualizar - def process_Actualizar (self, path, get_params, post_params, server): - logger.debug ('in process_Actualizar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + def do_Actualizar (self, post_params): self.muestraMensaje (1) #if !comandosPendientes: error 84 'Ha ocurrido algún problema al reiniciar la sesión del cliente' cfg = self.LeeConfiguracion() @@ -414,6 +411,10 @@ class ogAdmClientWorker (ogLiveWorker): self.muestraMenu() return self.respuestaEjecucionComando (cmd, 0) + def process_Actualizar (self, path, get_params, post_params, server): + logger.debug ('in process_Actualizar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('Actualizar', self.do_Actualizar, args=(post_params,)) + def process_Purgar (self, path, get_params, post_params, server): logger.debug ('in process_Purgar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) exit (0) ## ogAdmClient.c:905 diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index 0560ceb..1232e49 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -31,6 +31,8 @@ # pylint: disable=unused-wildcard-import,wildcard-import import os +import time +import random import subprocess import threading @@ -190,3 +192,23 @@ class ogLiveWorker(ServerWorker): if not self.tomaIPlocal(): raise Exception ('Se han generado errores. No se puede continuar la ejecución de este módulo') + + def _long_running_job (self, name, f, args): + any_job_running = False + for k in self.thread_list: + if self.thread_list[k]['running']: + any_job_running = True + break + if any_job_running: + logger.info ('some job is already running, refusing to launch another one') + return { 'job_id': None, 'message': 'some job is already running, refusing to launch another one' } + + job_id = '{}-{}'.format (name, ''.join (random.choice ('0123456789abcdef') for _ in range (8))) + self.thread_list[job_id] = { + 'thread': ThreadWithResult (target=f, args=args), + 'starttime': time.time(), + 'running': True, + 'result': None + } + self.thread_list[job_id]['thread'].start() + return { 'job_id': job_id } From 72e41987621630a52b76218beb1aaedca7786e15 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Thu, 3 Oct 2024 14:21:26 +0200 Subject: [PATCH 07/29] refs #784 make Purgar() return something --- src/opengnsys/modules/server/ogAdmClient/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 24c8d8d..98ca5c8 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -417,7 +417,8 @@ class ogAdmClientWorker (ogLiveWorker): def process_Purgar (self, path, get_params, post_params, server): logger.debug ('in process_Purgar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) - exit (0) ## ogAdmClient.c:905 + return {} + #exit (0) ## ogAdmClient.c:905 def process_Sondeo (self, path, get_params, post_params, server): logger.debug ('in process_Sondeo, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) From 068e0cf63327d08f12fbe1217b9519b6ba5d512e Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Thu, 3 Oct 2024 14:39:31 +0200 Subject: [PATCH 08/29] refs #806 join threads when a new operation is requested --- .../modules/server/CloningEngine/__init__.py | 13 +------------ .../modules/server/ogAdmClient/__init__.py | 10 +++++++++- src/opengnsys/workers/oglive_worker.py | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index ac9ac2c..ac93cf9 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -170,19 +170,8 @@ class CloningEngineWorker (ogLiveWorker): return self.respuestaEjecucionComando (cmd, herror, ids) def process_status (self, path, get_params, post_params, server): - ## join finished threads - for k in self.thread_list: - logger.debug (f'considering thread ({k})') - elem = self.thread_list[k] - if 'thread' in elem: - elem['thread'].join (0.05) - if not elem['thread'].is_alive(): - logger.debug (f'is no longer alive, k ({k}) thread ({elem["thread"]})') - elem['running'] = False - elem['result'] = elem['thread'].result - del elem['thread'] + self._join_threads() - ## return status of threads thr_status = {} for k in self.thread_list: thr_status[k] = { diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 98ca5c8..d1c918a 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -385,7 +385,15 @@ class ogAdmClientWorker (ogLiveWorker): @check_secret def process_status (self, path, get_params, post_params, server): - return {self.name: 'in process_status'} ## XXX + self._join_threads() + + thr_status = {} + for k in self.thread_list: + thr_status[k] = { + 'running': self.thread_list[k]['running'], + 'result': self.thread_list[k]['result'], + } + return thr_status @check_secret def process_popup (self, path, get_params, post_params, server): diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index 1232e49..8fb02e9 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -194,6 +194,8 @@ class ogLiveWorker(ServerWorker): raise Exception ('Se han generado errores. No se puede continuar la ejecución de este módulo') def _long_running_job (self, name, f, args): + self._join_threads() + any_job_running = False for k in self.thread_list: if self.thread_list[k]['running']: @@ -212,3 +214,15 @@ class ogLiveWorker(ServerWorker): } self.thread_list[job_id]['thread'].start() return { 'job_id': job_id } + + def _join_threads (self): + for k in self.thread_list: + logger.debug (f'considering thread ({k})') + elem = self.thread_list[k] + if 'thread' in elem: + elem['thread'].join (0.05) + if not elem['thread'].is_alive(): + logger.debug (f'is no longer alive, k ({k}) thread ({elem["thread"]})') + elem['running'] = False + elem['result'] = elem['thread'].result + del elem['thread'] From 1e1974432e03b456416604151bd401450f68d5a7 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Thu, 3 Oct 2024 15:05:15 +0200 Subject: [PATCH 09/29] refs #784 make Purgar() actually terminate the agent --- src/opengnsys/modules/server/ogAdmClient/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index d1c918a..5d42100 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -35,6 +35,8 @@ import base64 #import threading #import time +import os +import signal import subprocess from pathlib import Path from urllib.parse import unquote @@ -425,6 +427,7 @@ class ogAdmClientWorker (ogLiveWorker): def process_Purgar (self, path, get_params, post_params, server): logger.debug ('in process_Purgar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + os.kill (os.getpid(), signal.SIGTERM) return {} #exit (0) ## ogAdmClient.c:905 From d3829cd46f4703c6a6c9f0c39b28065feecbe769 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Mon, 7 Oct 2024 17:55:34 +0200 Subject: [PATCH 10/29] refs #879 implement Comando() --- .../modules/server/ogAdmClient/__init__.py | 27 ++++++++++++++++++- src/opengnsys/workers/oglive_worker.py | 4 +-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 5d42100..ffea64a 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -431,6 +431,31 @@ class ogAdmClientWorker (ogLiveWorker): return {} #exit (0) ## ogAdmClient.c:905 + def do_Comando (self, post_params): + for k in ['nfn', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + ids = post_params['ids'] + + try: + self.interfaceAdmin (nfn) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + herror = 1 + + cmd = { + 'nfn': 'RESPUESTA_Comando', + } + return self.respuestaEjecucionComando (cmd, herror, ids) + + def process_Comando (self, path, get_params, post_params, server): + logger.debug ('in process_Comando, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('Comando', self.do_Comando, args=(post_params,)) + def process_Sondeo (self, path, get_params, post_params, server): logger.debug ('in process_Sondeo, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return {} ## ogAdmClient.c:920 @@ -443,7 +468,7 @@ class ogAdmClientWorker (ogLiveWorker): logger.error (f'required parameter ({k}) not in POST params') return {} - nfn = unquote (post_params['nfn']) + nfn = post_params['nfn'] scp = unquote (post_params['scp']) filescript = f'/tmp/_script_{self.IPlocal}' ecosrc = f'/tmp/_econsola_{self.IPlocal}' diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index 8fb02e9..e2e948b 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -68,9 +68,9 @@ class ogLiveWorker(ServerWorker): ''' if parametros: - proc = ['bash', '-c', '{} set -x; bash -x {} {}; set +x'.format (devel_bash_prefix, exe, ' '.join (parametros))] + proc = ['bash', '-c', '{} bash -x {} {}'.format (devel_bash_prefix, exe, ' '.join (parametros))] else: - proc = ['bash', '-c', '{} set -x; bash -x {}; set +x'.format (devel_bash_prefix, exe)] + proc = ['bash', '-c', '{} bash -x {}'.format (devel_bash_prefix, exe)] logger.debug ('subprocess.run ("{}", capture_output=True)'.format (proc)) p = subprocess.run (proc, capture_output=True) ## DEBUG From f21a75a23d1abb787318a0c1f7bd62c62bc4f3fd Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Mon, 7 Oct 2024 17:59:30 +0200 Subject: [PATCH 11/29] refs #881 implement Arrancar() --- .../modules/server/ogAdmClient/__init__.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index ffea64a..e8fb169 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -493,7 +493,20 @@ class ogAdmClientWorker (ogLiveWorker): return {} def process_Arrancar (self, path, get_params, post_params, server): - logger.warning ('in process_Arrancar') + logger.debug ('in process_Arrancar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + + for k in ['ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + ids = post_params['ids'] + + cmd = { + 'nfn': 'RESPUESTA_Arrancar', + 'tpc': 'OPG', + } + return self.respuestaEjecucionComando (cmd, 0, ids) def process_Apagar (self, path, get_params, post_params, server): logger.warning ('in process_Apagar') From 8d9a9ef5c3e039efdec0871d2902d4b03f7e6129 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Mon, 7 Oct 2024 18:12:02 +0200 Subject: [PATCH 12/29] refs #882 implement Apagar() --- .../modules/server/ogAdmClient/__init__.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index e8fb169..521cf05 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -508,8 +508,30 @@ class ogAdmClientWorker (ogLiveWorker): } return self.respuestaEjecucionComando (cmd, 0, ids) + def do_Apagar (self, post_params): + for k in ['nfn', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + ids = post_params['ids'] + + try: + self.interfaceAdmin (nfn) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + herror = 1 + + cmd = { + 'nfn': 'RESPUESTA_Apagar', + } + return self.respuestaEjecucionComando (cmd, herror, ids) + def process_Apagar (self, path, get_params, post_params, server): - logger.warning ('in process_Apagar') + logger.debug ('in process_Apagar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('Apagar', self.do_Apagar, args=(post_params,)) def process_Reiniciar (self, path, get_params, post_params, server): logger.warning ('in process_Reiniciar') From 1ee279afd50e38283cc291493482004a67648be1 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Mon, 7 Oct 2024 18:12:15 +0200 Subject: [PATCH 13/29] refs #883 implement Reiniciar() --- .../modules/server/ogAdmClient/__init__.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 521cf05..0cc2d3a 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -533,8 +533,30 @@ class ogAdmClientWorker (ogLiveWorker): logger.debug ('in process_Apagar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('Apagar', self.do_Apagar, args=(post_params,)) + def do_Reiniciar (self, post_params): + for k in ['nfn', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + ids = post_params['ids'] + + try: + self.interfaceAdmin (nfn) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + herror = 1 + + cmd = { + 'nfn': 'RESPUESTA_Reiniciar', + } + return self.respuestaEjecucionComando (cmd, herror, ids) + def process_Reiniciar (self, path, get_params, post_params, server): - logger.warning ('in process_Reiniciar') + logger.debug ('in process_Apagar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('Reiniciar', self.do_Reiniciar, args=(post_params,)) def process_IniciarSesion (self, path, get_params, post_params, server): logger.warning ('in process_IniciarSesion') From 7efb0fdcc8b160a139e3fedf728471658ab9d5b0 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Mon, 7 Oct 2024 18:18:07 +0200 Subject: [PATCH 14/29] refs #884 implement IniciarSesion() --- .../modules/server/ogAdmClient/__init__.py | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 0cc2d3a..cf0634d 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -555,11 +555,35 @@ class ogAdmClientWorker (ogLiveWorker): return self.respuestaEjecucionComando (cmd, herror, ids) def process_Reiniciar (self, path, get_params, post_params, server): - logger.debug ('in process_Apagar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + logger.debug ('in process_Reiniciar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('Reiniciar', self.do_Reiniciar, args=(post_params,)) + def do_IniciarSesion (self, post_params): + for k in ['nfn', 'dsk', 'par', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + dsk = post_params['dsk'] + par = post_params['par'] + ids = post_params['ids'] + + try: + self.interfaceAdmin (nfn, [dsk, par]) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + herror = 1 + + cmd = { + 'nfn': 'RESPUESTA_IniciarSesion', + } + return self.respuestaEjecucionComando (cmd, herror, ids) + def process_IniciarSesion (self, path, get_params, post_params, server): - logger.warning ('in process_IniciarSesion') + logger.debug ('in process_IniciarSesion, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('IniciarSesion', self.do_IniciarSesion, args=(post_params,)) def process_Configurar (self, path, get_params, post_params, server): logger.warning ('in process_Configurar') From 239bfc21f7de74bc3884fcabc9ba6ed30ef93803 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Mon, 7 Oct 2024 19:51:31 +0200 Subject: [PATCH 15/29] refs #885 implement Configurar() --- .../modules/server/ogAdmClient/__init__.py | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index cf0634d..62eb44d 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -415,7 +415,7 @@ class ogAdmClientWorker (ogLiveWorker): return {} cmd = { - 'nfn': 'RESPUESTA_Configurar', + 'nfn': 'RESPUESTA_Actualizar', 'cfg': cfg, } self.muestraMenu() @@ -585,8 +585,43 @@ class ogAdmClientWorker (ogLiveWorker): logger.debug ('in process_IniciarSesion, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('IniciarSesion', self.do_IniciarSesion, args=(post_params,)) + def do_Configurar (self, post_params): + for k in ['nfn', 'dsk', 'cfg', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + dsk = post_params['dsk'] + cfg = post_params['cfg'].replace('\n','$').replace('\t','#') + ids = post_params['ids'] + + self.muestraMensaje (4) + + try: + self.interfaceAdmin (nfn, [dsk, cfg]) + self.muestraMensaje (14) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + self.muestraMensaje (13) + herror = 1 + + cfg = self.LeeConfiguracion() + if not cfg: + logger.warning ('No se ha podido recuperar la configuración de las particiones del disco') + return {} + + cmd = { + 'nfn': 'RESPUESTA_Configurar', + 'cfg': cfg, + } + self.muestraMenu() + return self.respuestaEjecucionComando (cmd, herror, ids) + def process_Configurar (self, path, get_params, post_params, server): - logger.warning ('in process_Configurar') + logger.debug ('in process_Configurar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('Configurar', self.do_Configurar, args=(post_params,)) def process_EjecutarScript (self, path, get_params, post_params, server): logger.warning ('in process_EjecutarScript') From 08dba6d99a35eae4484996e04a024703e64a8fb4 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 09:31:03 +0200 Subject: [PATCH 16/29] refs #886 implement InventarioHardware() --- ogcore-mock.py | 12 +++++ .../modules/server/ogAdmClient/__init__.py | 50 +++++++++++++++++-- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/ogcore-mock.py b/ogcore-mock.py index 5008317..fc51888 100644 --- a/ogcore-mock.py +++ b/ogcore-mock.py @@ -170,6 +170,12 @@ def disponibilidad_comandos(): @app.route('/opengnsys/rest/ogAdmClient/recibeArchivo', methods=['POST']) def oac_recibe_archivo(): logging.info(f'{request.get_json()}') + j = request.get_json(force=True) + nfl = j['nfl'] + contents = j['contents'] + logging.info(f'nfl ({nfl}) contents ({contents})') + dec = base64.b64decode (contents).decode ('utf-8') + logging.info(f'dec ({dec})') 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']) @@ -188,6 +194,12 @@ def oac_cucu(cucu): @app.route('/opengnsys/rest/CloningEngine/recibeArchivo', methods=['POST']) def ce_recibe_archivo(): logging.info(f'{request.get_json()}') + j = request.get_json(force=True) + nfl = j['nfl'] + contents = j['contents'] + logging.info(f'nfl ({nfl}) contents ({contents})') + dec = base64.b64decode (contents).decode ('utf-8') + logging.info(f'dec ({dec})') return jsonify({'anything':'anything'}) ## if we return {}, then we trigger "if not {}" which happens to be true @app.route('/opengnsys/rest/CloningEngine/', methods=['GET', 'POST']) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 62eb44d..85abfae 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -623,11 +623,55 @@ class ogAdmClientWorker (ogLiveWorker): logger.debug ('in process_Configurar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('Configurar', self.do_Configurar, args=(post_params,)) - def process_EjecutarScript (self, path, get_params, post_params, server): - logger.warning ('in process_EjecutarScript') + def do_InventarioHardware (self, post_params): + for k in ['nfn', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + ids = post_params['ids'] + + self.muestraMensaje (6) + + hrdsrc = f'/tmp/Chrd-{self.IPlocal}' ## Nombre que tendra el archivo de inventario + hrddst = f'/tmp/Shrd-{self.IPlocal}' ## Nombre que tendra el archivo en el Servidor + try: + self.interfaceAdmin (nfn, [hrdsrc]) + hrdsrc_contents = Path (hrdsrc).read_bytes() + logger.debug (f'hrdsrc_contents 1 ({hrdsrc_contents})') + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + self.muestraMensaje (18) + herror = 1 + + if herror: + hrddst = '' + else: + logger.debug (f'hrdsrc_contents 2 ({hrdsrc_contents})') + ## Envía fichero de inventario al servidor + res = self.enviaMensajeServidor ('recibeArchivo', { 'nfl': hrddst, 'contents': base64.b64encode (hrdsrc_contents).decode ('utf-8') }) + logger.debug (res) + if not res: + logger.error ('Ha ocurrido algún problema al enviar un archivo por la red') + herror = 12 ## Error de envío de fichero por la red + self.muestraMensaje (17) + + ## Envia respuesta de ejecución de la función de interface + cmd = { + 'nfn': 'RESPUESTA_InventarioHardware', + 'hrd': hrddst, + } + self.muestraMenu() + return self.respuestaEjecucionComando (cmd, herror, ids) def process_InventarioHardware (self, path, get_params, post_params, server): - logger.warning ('in process_InventarioHardware') + logger.debug ('in process_InventarioHardware, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('InventarioHardware', self.do_InventarioHardware, args=(post_params,)) + + def process_EjecutarScript (self, path, get_params, post_params, server): + logger.warning ('in process_EjecutarScript') def process_InventarioSoftware (self, path, get_params, post_params, server): logger.warning ('in process_InventarioSoftware') From a3f4eafffb03b0692c9def44cd41ae84f3558086 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 10:19:04 +0200 Subject: [PATCH 17/29] refs #887 implement InventarioSoftware() --- .../modules/server/CloningEngine/__init__.py | 24 +++++++++++++++++++ .../modules/server/ogAdmClient/__init__.py | 3 --- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index ac93cf9..a5229d5 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -180,6 +180,26 @@ class CloningEngineWorker (ogLiveWorker): } return thr_status + def do_InventarioSoftware (self, post_params): + for k in ['nfn', 'dsk', 'par', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + dsk = post_params['dsk'] + par = post_params['par'] + ids = post_params['ids'] + + self.muestraMensaje (7) + + res = self.InventariandoSoftware (dsk, par, True, 'InventarioSoftware') + self.muestraMenu() + cmd = { + 'nfn': 'RESPUESTA_InventarioSoftware', + } + return self.respuestaEjecucionComando (cmd, 0, ids) + def process_CrearImagen (self, path, get_params, post_params, server): logger.debug ('in process_CrearImagen, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) logger.debug ('type(post_params) "{}"'.format (type (post_params))) @@ -210,3 +230,7 @@ class CloningEngineWorker (ogLiveWorker): logger.debug ('in process_RestaurarSoftIncremental, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) logger.warning ('this method has been removed') raise Exception ({ '_httpcode': 404, '_msg': 'This method has been removed' }) + + def process_InventarioSoftware (self, path, get_params, post_params, server): + logger.debug ('in process_InventarioSoftware, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('InventarioSoftware', self.do_InventarioSoftware, args=(post_params,)) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 85abfae..9d96aa1 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -673,8 +673,5 @@ class ogAdmClientWorker (ogLiveWorker): def process_EjecutarScript (self, path, get_params, post_params, server): logger.warning ('in process_EjecutarScript') - def process_InventarioSoftware (self, path, get_params, post_params, server): - logger.warning ('in process_InventarioSoftware') - def process_EjecutaComandosPendientes (self, path, get_params, post_params, server): logger.warning ('in process_EjecutaComandosPendientes') From e2f161ae9747b6d15aad01a5a4996ebf3a4300d1 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 10:25:54 +0200 Subject: [PATCH 18/29] refs #887 handle potential InventariandoSoftware() exceptions --- .../modules/server/CloningEngine/__init__.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index a5229d5..d6d1417 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -101,7 +101,13 @@ class CloningEngineWorker (ogLiveWorker): self.muestraMensaje (7) - if self.InventariandoSoftware (dsk, par, False, 'InventarioSoftware'): ## Crea inventario Software previamente + try: + res = self.InventariandoSoftware (dsk, par, False, 'InventarioSoftware'): ## Crea inventario Software previamente + except: + logger.warning ('Error al ejecutar el comando') + return {} + + if res: self.muestraMensaje (2) try: self.interfaceAdmin (nfn, [dsk, par, nci, ipr]) @@ -193,12 +199,18 @@ class CloningEngineWorker (ogLiveWorker): self.muestraMensaje (7) - res = self.InventariandoSoftware (dsk, par, True, 'InventarioSoftware') + try: + self.InventariandoSoftware (dsk, par, True, 'InventarioSoftware') + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + herror = 1 + self.muestraMenu() cmd = { 'nfn': 'RESPUESTA_InventarioSoftware', } - return self.respuestaEjecucionComando (cmd, 0, ids) + return self.respuestaEjecucionComando (cmd, herror, ids) def process_CrearImagen (self, path, get_params, post_params, server): logger.debug ('in process_CrearImagen, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) From 9e3d8be629fa723d05b231c6c8840f493ad0b834 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 10:32:11 +0200 Subject: [PATCH 19/29] refs #886 move InventarioHardware() to the CloningEngine module --- .../modules/server/CloningEngine/__init__.py | 47 +++++++++++++++++++ .../modules/server/ogAdmClient/__init__.py | 47 ------------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index d6d1417..04c072a 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -186,6 +186,49 @@ class CloningEngineWorker (ogLiveWorker): } return thr_status + def do_InventarioHardware (self, post_params): + for k in ['nfn', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + ids = post_params['ids'] + + self.muestraMensaje (6) + + hrdsrc = f'/tmp/Chrd-{self.IPlocal}' ## Nombre que tendra el archivo de inventario + hrddst = f'/tmp/Shrd-{self.IPlocal}' ## Nombre que tendra el archivo en el Servidor + try: + self.interfaceAdmin (nfn, [hrdsrc]) + hrdsrc_contents = Path (hrdsrc).read_bytes() + logger.debug (f'hrdsrc_contents 1 ({hrdsrc_contents})') + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + self.muestraMensaje (18) + herror = 1 + + if herror: + hrddst = '' + else: + logger.debug (f'hrdsrc_contents 2 ({hrdsrc_contents})') + ## Envía fichero de inventario al servidor + res = self.enviaMensajeServidor ('recibeArchivo', { 'nfl': hrddst, 'contents': base64.b64encode (hrdsrc_contents).decode ('utf-8') }) + logger.debug (res) + if not res: + logger.error ('Ha ocurrido algún problema al enviar un archivo por la red') + herror = 12 ## Error de envío de fichero por la red + self.muestraMensaje (17) + + ## Envia respuesta de ejecución de la función de interface + cmd = { + 'nfn': 'RESPUESTA_InventarioHardware', + 'hrd': hrddst, + } + self.muestraMenu() + return self.respuestaEjecucionComando (cmd, herror, ids) + def do_InventarioSoftware (self, post_params): for k in ['nfn', 'dsk', 'par', 'ids']: if k not in post_params: @@ -243,6 +286,10 @@ class CloningEngineWorker (ogLiveWorker): logger.warning ('this method has been removed') raise Exception ({ '_httpcode': 404, '_msg': 'This method has been removed' }) + def process_InventarioHardware (self, path, get_params, post_params, server): + logger.debug ('in process_InventarioHardware, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('InventarioHardware', self.do_InventarioHardware, args=(post_params,)) + def process_InventarioSoftware (self, path, get_params, post_params, server): logger.debug ('in process_InventarioSoftware, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('InventarioSoftware', self.do_InventarioSoftware, args=(post_params,)) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 9d96aa1..686a64c 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -623,53 +623,6 @@ class ogAdmClientWorker (ogLiveWorker): logger.debug ('in process_Configurar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('Configurar', self.do_Configurar, args=(post_params,)) - def do_InventarioHardware (self, post_params): - for k in ['nfn', 'ids']: - if k not in post_params: - logger.error (f'required parameter ({k}) not in POST params') - return {} - - nfn = post_params['nfn'] - ids = post_params['ids'] - - self.muestraMensaje (6) - - hrdsrc = f'/tmp/Chrd-{self.IPlocal}' ## Nombre que tendra el archivo de inventario - hrddst = f'/tmp/Shrd-{self.IPlocal}' ## Nombre que tendra el archivo en el Servidor - try: - self.interfaceAdmin (nfn, [hrdsrc]) - hrdsrc_contents = Path (hrdsrc).read_bytes() - logger.debug (f'hrdsrc_contents 1 ({hrdsrc_contents})') - herror = 0 - except: - logger.warning ('Error al ejecutar el comando') - self.muestraMensaje (18) - herror = 1 - - if herror: - hrddst = '' - else: - logger.debug (f'hrdsrc_contents 2 ({hrdsrc_contents})') - ## Envía fichero de inventario al servidor - res = self.enviaMensajeServidor ('recibeArchivo', { 'nfl': hrddst, 'contents': base64.b64encode (hrdsrc_contents).decode ('utf-8') }) - logger.debug (res) - if not res: - logger.error ('Ha ocurrido algún problema al enviar un archivo por la red') - herror = 12 ## Error de envío de fichero por la red - self.muestraMensaje (17) - - ## Envia respuesta de ejecución de la función de interface - cmd = { - 'nfn': 'RESPUESTA_InventarioHardware', - 'hrd': hrddst, - } - self.muestraMenu() - return self.respuestaEjecucionComando (cmd, herror, ids) - - def process_InventarioHardware (self, path, get_params, post_params, server): - logger.debug ('in process_InventarioHardware, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) - return self._long_running_job ('InventarioHardware', self.do_InventarioHardware, args=(post_params,)) - def process_EjecutarScript (self, path, get_params, post_params, server): logger.warning ('in process_EjecutarScript') From e39bb7401e67c18f2ce74e73171c21f21547c907 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 10:32:42 +0200 Subject: [PATCH 20/29] refs #887 fix syntax error --- src/opengnsys/modules/server/CloningEngine/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index 04c072a..b0aeb08 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -102,7 +102,7 @@ class CloningEngineWorker (ogLiveWorker): self.muestraMensaje (7) try: - res = self.InventariandoSoftware (dsk, par, False, 'InventarioSoftware'): ## Crea inventario Software previamente + res = self.InventariandoSoftware (dsk, par, False, 'InventarioSoftware') ## Crea inventario Software previamente except: logger.warning ('Error al ejecutar el comando') return {} From 2d7d023e9963e0530e43cb9865e4f968091d226d Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 10:46:14 +0200 Subject: [PATCH 21/29] refs #885 move Configurar() to CloningEngine --- .../modules/server/CloningEngine/__init__.py | 38 +++++++++++++++++++ .../modules/server/ogAdmClient/__init__.py | 38 ------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index b0aeb08..3eaff50 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -186,6 +186,40 @@ class CloningEngineWorker (ogLiveWorker): } return thr_status + def do_Configurar (self, post_params): + for k in ['nfn', 'dsk', 'cfg', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + dsk = post_params['dsk'] + cfg = post_params['cfg'].replace('\n','$').replace('\t','#') + ids = post_params['ids'] + + self.muestraMensaje (4) + + try: + self.interfaceAdmin (nfn, [dsk, cfg]) + self.muestraMensaje (14) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + self.muestraMensaje (13) + herror = 1 + + cfg = self.LeeConfiguracion() + if not cfg: + logger.warning ('No se ha podido recuperar la configuración de las particiones del disco') + return {} + + cmd = { + 'nfn': 'RESPUESTA_Configurar', + 'cfg': cfg, + } + self.muestraMenu() + return self.respuestaEjecucionComando (cmd, herror, ids) + def do_InventarioHardware (self, post_params): for k in ['nfn', 'ids']: if k not in post_params: @@ -286,6 +320,10 @@ class CloningEngineWorker (ogLiveWorker): logger.warning ('this method has been removed') raise Exception ({ '_httpcode': 404, '_msg': 'This method has been removed' }) + def process_Configurar (self, path, get_params, post_params, server): + logger.debug ('in process_Configurar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('Configurar', self.do_Configurar, args=(post_params,)) + def process_InventarioHardware (self, path, get_params, post_params, server): logger.debug ('in process_InventarioHardware, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('InventarioHardware', self.do_InventarioHardware, args=(post_params,)) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 686a64c..9cc84b4 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -585,44 +585,6 @@ class ogAdmClientWorker (ogLiveWorker): logger.debug ('in process_IniciarSesion, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('IniciarSesion', self.do_IniciarSesion, args=(post_params,)) - def do_Configurar (self, post_params): - for k in ['nfn', 'dsk', 'cfg', 'ids']: - if k not in post_params: - logger.error (f'required parameter ({k}) not in POST params') - return {} - - nfn = post_params['nfn'] - dsk = post_params['dsk'] - cfg = post_params['cfg'].replace('\n','$').replace('\t','#') - ids = post_params['ids'] - - self.muestraMensaje (4) - - try: - self.interfaceAdmin (nfn, [dsk, cfg]) - self.muestraMensaje (14) - herror = 0 - except: - logger.warning ('Error al ejecutar el comando') - self.muestraMensaje (13) - herror = 1 - - cfg = self.LeeConfiguracion() - if not cfg: - logger.warning ('No se ha podido recuperar la configuración de las particiones del disco') - return {} - - cmd = { - 'nfn': 'RESPUESTA_Configurar', - 'cfg': cfg, - } - self.muestraMenu() - return self.respuestaEjecucionComando (cmd, herror, ids) - - def process_Configurar (self, path, get_params, post_params, server): - logger.debug ('in process_Configurar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) - return self._long_running_job ('Configurar', self.do_Configurar, args=(post_params,)) - def process_EjecutarScript (self, path, get_params, post_params, server): logger.warning ('in process_EjecutarScript') From 3bfaf3c83819acb784162e3c68f60ed774dcbd15 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 10:51:52 +0200 Subject: [PATCH 22/29] refs #783 #784 #785 #786 #881 #882 #883 #879 move code around --- .../modules/server/ogAdmClient/__init__.py | 150 +++++++++--------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 9cc84b4..abfaef8 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -421,16 +421,6 @@ class ogAdmClientWorker (ogLiveWorker): self.muestraMenu() return self.respuestaEjecucionComando (cmd, 0) - def process_Actualizar (self, path, get_params, post_params, server): - logger.debug ('in process_Actualizar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) - return self._long_running_job ('Actualizar', self.do_Actualizar, args=(post_params,)) - - def process_Purgar (self, path, get_params, post_params, server): - logger.debug ('in process_Purgar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) - os.kill (os.getpid(), signal.SIGTERM) - return {} - #exit (0) ## ogAdmClient.c:905 - def do_Comando (self, post_params): for k in ['nfn', 'ids']: if k not in post_params: @@ -452,6 +442,81 @@ class ogAdmClientWorker (ogLiveWorker): } return self.respuestaEjecucionComando (cmd, herror, ids) + def do_Apagar (self, post_params): + for k in ['nfn', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + ids = post_params['ids'] + + try: + self.interfaceAdmin (nfn) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + herror = 1 + + cmd = { + 'nfn': 'RESPUESTA_Apagar', + } + return self.respuestaEjecucionComando (cmd, herror, ids) + + def do_Reiniciar (self, post_params): + for k in ['nfn', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + ids = post_params['ids'] + + try: + self.interfaceAdmin (nfn) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + herror = 1 + + cmd = { + 'nfn': 'RESPUESTA_Reiniciar', + } + return self.respuestaEjecucionComando (cmd, herror, ids) + + def do_IniciarSesion (self, post_params): + for k in ['nfn', 'dsk', 'par', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + dsk = post_params['dsk'] + par = post_params['par'] + ids = post_params['ids'] + + try: + self.interfaceAdmin (nfn, [dsk, par]) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + herror = 1 + + cmd = { + 'nfn': 'RESPUESTA_IniciarSesion', + } + return self.respuestaEjecucionComando (cmd, herror, ids) + + def process_Actualizar (self, path, get_params, post_params, server): + logger.debug ('in process_Actualizar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('Actualizar', self.do_Actualizar, args=(post_params,)) + + def process_Purgar (self, path, get_params, post_params, server): + logger.debug ('in process_Purgar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + os.kill (os.getpid(), signal.SIGTERM) + return {} + #exit (0) ## ogAdmClient.c:905 + def process_Comando (self, path, get_params, post_params, server): logger.debug ('in process_Comando, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('Comando', self.do_Comando, args=(post_params,)) @@ -508,79 +573,14 @@ class ogAdmClientWorker (ogLiveWorker): } return self.respuestaEjecucionComando (cmd, 0, ids) - def do_Apagar (self, post_params): - for k in ['nfn', 'ids']: - if k not in post_params: - logger.error (f'required parameter ({k}) not in POST params') - return {} - - nfn = post_params['nfn'] - ids = post_params['ids'] - - try: - self.interfaceAdmin (nfn) - herror = 0 - except: - logger.warning ('Error al ejecutar el comando') - herror = 1 - - cmd = { - 'nfn': 'RESPUESTA_Apagar', - } - return self.respuestaEjecucionComando (cmd, herror, ids) - def process_Apagar (self, path, get_params, post_params, server): logger.debug ('in process_Apagar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('Apagar', self.do_Apagar, args=(post_params,)) - def do_Reiniciar (self, post_params): - for k in ['nfn', 'ids']: - if k not in post_params: - logger.error (f'required parameter ({k}) not in POST params') - return {} - - nfn = post_params['nfn'] - ids = post_params['ids'] - - try: - self.interfaceAdmin (nfn) - herror = 0 - except: - logger.warning ('Error al ejecutar el comando') - herror = 1 - - cmd = { - 'nfn': 'RESPUESTA_Reiniciar', - } - return self.respuestaEjecucionComando (cmd, herror, ids) - def process_Reiniciar (self, path, get_params, post_params, server): logger.debug ('in process_Reiniciar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('Reiniciar', self.do_Reiniciar, args=(post_params,)) - def do_IniciarSesion (self, post_params): - for k in ['nfn', 'dsk', 'par', 'ids']: - if k not in post_params: - logger.error (f'required parameter ({k}) not in POST params') - return {} - - nfn = post_params['nfn'] - dsk = post_params['dsk'] - par = post_params['par'] - ids = post_params['ids'] - - try: - self.interfaceAdmin (nfn, [dsk, par]) - herror = 0 - except: - logger.warning ('Error al ejecutar el comando') - herror = 1 - - cmd = { - 'nfn': 'RESPUESTA_IniciarSesion', - } - return self.respuestaEjecucionComando (cmd, herror, ids) - def process_IniciarSesion (self, path, get_params, post_params, server): logger.debug ('in process_IniciarSesion, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('IniciarSesion', self.do_IniciarSesion, args=(post_params,)) From 4fdcbe620f9ea23e4ac73cbb277e13c291e41ae7 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 11:03:17 +0200 Subject: [PATCH 23/29] refs #786 make ConsolaRemota() asynchronous --- src/opengnsys/modules/server/ogAdmClient/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index abfaef8..27746a5 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -525,9 +525,7 @@ class ogAdmClientWorker (ogLiveWorker): logger.debug ('in process_Sondeo, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return {} ## ogAdmClient.c:920 - def process_ConsolaRemota (self, path, get_params, post_params, server): - logger.debug ('in process_ConsolaRemota, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) - + def do_ConsolaRemota (self, post_params): for k in ['nfn', 'scp']: if k not in post_params: logger.error (f'required parameter ({k}) not in POST params') @@ -557,6 +555,10 @@ class ogAdmClientWorker (ogLiveWorker): return {} + def process_ConsolaRemota (self, path, get_params, post_params, server): + logger.debug ('in process_ConsolaRemota, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('ConsolaRemota', self.do_ConsolaRemota, args=(post_params,)) + def process_Arrancar (self, path, get_params, post_params, server): logger.debug ('in process_Arrancar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) From 6757ab5697db208d89eaa31d58aafc410e7c7718 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 11:04:39 +0200 Subject: [PATCH 24/29] refs #786 move code --- .../modules/server/ogAdmClient/__init__.py | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 27746a5..6de72ca 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -442,6 +442,36 @@ class ogAdmClientWorker (ogLiveWorker): } return self.respuestaEjecucionComando (cmd, herror, ids) + def do_ConsolaRemota (self, post_params): + for k in ['nfn', 'scp']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = 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 do_Apagar (self, post_params): for k in ['nfn', 'ids']: if k not in post_params: @@ -525,36 +555,6 @@ class ogAdmClientWorker (ogLiveWorker): logger.debug ('in process_Sondeo, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return {} ## ogAdmClient.c:920 - def do_ConsolaRemota (self, post_params): - for k in ['nfn', 'scp']: - if k not in post_params: - logger.error (f'required parameter ({k}) not in POST params') - return {} - - nfn = 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_ConsolaRemota (self, path, get_params, post_params, server): logger.debug ('in process_ConsolaRemota, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('ConsolaRemota', self.do_ConsolaRemota, args=(post_params,)) From a0fb19ddbd572bb9f475f62e37868593a0b7077f Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 11:37:15 +0200 Subject: [PATCH 25/29] refs #888 implement EjecutarScript() --- .../modules/server/ogAdmClient/__init__.py | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 6de72ca..fe3d2a4 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -537,6 +537,46 @@ class ogAdmClientWorker (ogLiveWorker): } return self.respuestaEjecucionComando (cmd, herror, ids) + def do_EjecutarScript (self, post_params): + for k in ['nfn', 'scp', 'ids']: + if k not in post_params: + logger.error (f'required parameter ({k}) not in POST params') + return {} + + nfn = post_params['nfn'] + scp = unquote (post_params['scp']) + ids = post_params['ids'] + + self.muestraMensaje (8) + + filescript = f'/tmp/_script_{self.IPlocal}' ## Nombre del archivo de script + with open (filescript, 'w') as fd: + fd.write (scp) + + try: + self.interfaceAdmin (nfn, [filescript]) + self.muestraMensaje (22) + herror = 0 + except: + logger.warning ('Error al ejecutar el comando') + self.muestraMensaje (21) + herror = 1 + + ## Toma configuración de particiones + cfg = self.LeeConfiguracion() + if not cfg: + logger.warning ('No se ha podido recuperar la configuración de las particiones del disco') + herror = 36 + + #herror=ejecutarCodigoBash(scp); ## ogAdmClient.c:2004 + + cmd = { + 'nfn': 'RESPUESTA_EjecutarScript', + 'cfg': cfg, + } + self.muestraMenu() + return self.respuestaEjecucionComando (cmd, herror, ids) + def process_Actualizar (self, path, get_params, post_params, server): logger.debug ('in process_Actualizar, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) return self._long_running_job ('Actualizar', self.do_Actualizar, args=(post_params,)) @@ -588,7 +628,8 @@ class ogAdmClientWorker (ogLiveWorker): return self._long_running_job ('IniciarSesion', self.do_IniciarSesion, args=(post_params,)) def process_EjecutarScript (self, path, get_params, post_params, server): - logger.warning ('in process_EjecutarScript') + logger.debug ('in process_EjecutarScript, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('EjecutarScript', self.do_EjecutarScript, args=(post_params,)) def process_EjecutaComandosPendientes (self, path, get_params, post_params, server): logger.warning ('in process_EjecutaComandosPendientes') From e1bd063bdeee18bf20d09f2a2dbdcdb2ad4ecaf8 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 11:44:57 +0200 Subject: [PATCH 26/29] refs #890 implement EjecutaComandosPendientes() --- src/opengnsys/modules/server/ogAdmClient/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index fe3d2a4..2417294 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -632,4 +632,5 @@ class ogAdmClientWorker (ogLiveWorker): return self._long_running_job ('EjecutarScript', self.do_EjecutarScript, args=(post_params,)) def process_EjecutaComandosPendientes (self, path, get_params, post_params, server): - logger.warning ('in process_EjecutaComandosPendientes') + logger.debug ('in process_EjecutaComandosPendientes, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return {'true':'true'} ## ogAdmClient.c:2138 From def6750cd1f91229d075a3eaadc6f3e39f3f8a04 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 8 Oct 2024 17:55:51 +0200 Subject: [PATCH 27/29] refs #880 monitor running threads --- ogcore-mock.py | 10 +++++ .../modules/server/CloningEngine/__init__.py | 2 - .../modules/server/ogAdmClient/__init__.py | 2 - src/opengnsys/workers/oglive_worker.py | 38 ++++++++++++------- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/ogcore-mock.py b/ogcore-mock.py index fc51888..716e52f 100644 --- a/ogcore-mock.py +++ b/ogcore-mock.py @@ -178,6 +178,11 @@ def oac_recibe_archivo(): logging.info(f'dec ({dec})') return jsonify({'anything':'anything'}) ## if we return {}, then we trigger "if not {}" which happens to be true +@app.route('/opengnsys/rest/ogAdmClient/callback', methods=['POST']) +def oac_callback(): + logging.info(f'{request.get_json()}') + return jsonify({'anything':'anything'}) + @app.route('/opengnsys/rest/ogAdmClient/', methods=['GET', 'POST']) def oac_cucu(cucu): #j = request.get_json(force=True) @@ -202,6 +207,11 @@ def ce_recibe_archivo(): logging.info(f'dec ({dec})') return jsonify({'anything':'anything'}) ## if we return {}, then we trigger "if not {}" which happens to be true +@app.route('/opengnsys/rest/CloningEngine/callback', methods=['POST']) +def ce_callback(): + logging.info(f'{request.get_json()}') + return jsonify({'anything':'anything'}) + @app.route('/opengnsys/rest/CloningEngine/', methods=['GET', 'POST']) def ce_cucu(cucu): abort (404) diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index 3eaff50..41e310f 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -176,8 +176,6 @@ class CloningEngineWorker (ogLiveWorker): return self.respuestaEjecucionComando (cmd, herror, ids) def process_status (self, path, get_params, post_params, server): - self._join_threads() - thr_status = {} for k in self.thread_list: thr_status[k] = { diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 2417294..9b6939a 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -387,8 +387,6 @@ class ogAdmClientWorker (ogLiveWorker): @check_secret def process_status (self, path, get_params, post_params, server): - self._join_threads() - thr_status = {} for k in self.thread_list: thr_status[k] = { diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index e2e948b..c76d867 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -58,6 +58,28 @@ class ThreadWithResult (threading.Thread): class ogLiveWorker(ServerWorker): thread_list = {} + def notifier (self, result): + logger.debug (f'notifier() called, result ({result})') + res = self.REST.sendMessage ('/'.join ([self.name, 'callback']), result) + + def mon (self): + while True: + #print ('mon(): iterating') + for k in self.thread_list: + elem = self.thread_list[k] + if 'thread' not in elem: continue + logger.debug (f'considering thread ({k})') + try: elem['thread'].join (0.05) + except RuntimeError: pass ## race condition: a thread is created and this code runs before it is start()ed + if not elem['thread'].is_alive(): + logger.debug (f'is no longer alive, k ({k}) thread ({elem["thread"]})') + elem['running'] = False + elem['result'] = elem['thread'].result + del elem['thread'] + self.notifier (elem['result']) + + time.sleep (1) + def interfaceAdmin (self, method, parametros=[]): exe = '{}/{}'.format (self.pathinterface, method) ## for development only. Will be removed when the referenced bash code (/opt/opengnsys/lib/engine/bin/*.lib) is translated into python @@ -193,9 +215,9 @@ class ogLiveWorker(ServerWorker): if not self.tomaIPlocal(): raise Exception ('Se han generado errores. No se puede continuar la ejecución de este módulo') - def _long_running_job (self, name, f, args): - self._join_threads() + threading.Thread (name='monitoring_thread', target=self.mon, daemon=True).start() + def _long_running_job (self, name, f, args): any_job_running = False for k in self.thread_list: if self.thread_list[k]['running']: @@ -214,15 +236,3 @@ class ogLiveWorker(ServerWorker): } self.thread_list[job_id]['thread'].start() return { 'job_id': job_id } - - def _join_threads (self): - for k in self.thread_list: - logger.debug (f'considering thread ({k})') - elem = self.thread_list[k] - if 'thread' in elem: - elem['thread'].join (0.05) - if not elem['thread'].is_alive(): - logger.debug (f'is no longer alive, k ({k}) thread ({elem["thread"]})') - elem['running'] = False - elem['result'] = elem['thread'].result - del elem['thread'] From c19128619f4a17e53b97a9a36ca956fa87fd8438 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Fri, 11 Oct 2024 13:13:06 +0200 Subject: [PATCH 28/29] refs #915 release new version --- linux/debian/changelog | 7 +++++++ src/VERSION | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/linux/debian/changelog b/linux/debian/changelog index d434d00..f2c9429 100644 --- a/linux/debian/changelog +++ b/linux/debian/changelog @@ -1,3 +1,10 @@ +ogagent (1.4.0-1) stable; urgency=medium + + * Add more functionality + * Begin using semantic versioning + + -- OpenGnsys developers Fri, 11 Oct 2024 13:06:51 +0200 + ogagent (1.3.8-1) stable; urgency=medium * Add more functionality to the ogAdmClient module diff --git a/src/VERSION b/src/VERSION index e05cb33..88c5fb8 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -1.3.8 +1.4.0 From 3a9c293c3324a7f16af3b672dcbbf4f1dde90033 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Fri, 11 Oct 2024 19:55:35 +0200 Subject: [PATCH 29/29] refs #915 release ogagent 1.4.1 --- linux/debian/changelog | 6 ++ src/VERSION | 2 +- .../modules/server/ogAdmClient/__init__.py | 79 ------------------- src/opengnsys/workers/oglive_worker.py | 79 +++++++++++++++++++ 4 files changed, 86 insertions(+), 80 deletions(-) diff --git a/linux/debian/changelog b/linux/debian/changelog index f2c9429..0ee968c 100644 --- a/linux/debian/changelog +++ b/linux/debian/changelog @@ -1,3 +1,9 @@ +ogagent (1.4.1-1) stable; urgency=medium + + * Bugfix: move data structure to the right class + + -- OpenGnsys developers Fri, 11 Oct 2024 13:51:55 +0200 + ogagent (1.4.0-1) stable; urgency=medium * Add more functionality diff --git a/src/VERSION b/src/VERSION index 88c5fb8..347f583 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -1.4.0 +1.4.1 diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 9b6939a..8e87d7a 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -72,85 +72,6 @@ class ogAdmClientWorker (ogLiveWorker): #interface = None # Bound interface for OpenGnsys (el otro modulo lo usa para obtener .ip y .mac REST = None # REST object - tbErroresScripts = [ - "Se han generado errores desconocidos. No se puede continuar la ejecución de este módulo", ## 0 - "001-Formato de ejecución incorrecto.", - "002-Fichero o dispositivo no encontrado", - "003-Error en partición de disco", - "004-Partición o fichero bloqueado", - "005-Error al crear o restaurar una imagen", - "006-Sin sistema operativo", - "007-Programa o función BOOLEAN no ejecutable", - "008-Error en la creación del archivo de eco para consola remota", - "009-Error en la lectura del archivo temporal de intercambio", - "010-Error al ejecutar la llamada a la interface de administración", - "011-La información retornada por la interface de administración excede de la longitud permitida", - "012-Error en el envío de fichero por la red", - "013-Error en la creación del proceso hijo", - "014-Error de escritura en destino", - "015-Sin Cache en el Cliente", - "016-No hay espacio en la cache para almacenar fichero-imagen", - "017-Error al Reducir el Sistema Archivos", - "018-Error al Expandir el Sistema Archivos", - "019-Valor fuera de rango o no válido.", - "020-Sistema de archivos desconocido o no se puede montar", - "021-Error en partición de caché local", - "022-El disco indicado no contiene una particion GPT", - "023-Error no definido", - "024-Error no definido", - "025-Error no definido", - "026-Error no definido", - "027-Error no definido", - "028-Error no definido", - "029-Error no definido", - "030-Error al restaurar imagen - Imagen mas grande que particion", - "031-Error al realizar el comando updateCache", - "032-Error al formatear", - "033-Archivo de imagen corrupto o de otra versión de partclone", - "034-Error no definido", - "035-Error no definido", - "036-Error no definido", - "037-Error no definido", - "038-Error no definido", - "039-Error no definido", - "040-Error imprevisto no definido", - "041-Error no definido", - "042-Error no definido", - "043-Error no definido", - "044-Error no definido", - "045-Error no definido", - "046-Error no definido", - "047-Error no definido", - "048-Error no definido", - "049-Error no definido", - "050-Error en la generación de sintaxis de transferenica unicast", - "051-Error en envio UNICAST de una particion", - "052-Error en envio UNICAST de un fichero", - "053-Error en la recepcion UNICAST de una particion", - "054-Error en la recepcion UNICAST de un fichero", - "055-Error en la generacion de sintaxis de transferenica Multicast", - "056-Error en envio MULTICAST de un fichero", - "057-Error en la recepcion MULTICAST de un fichero", - "058-Error en envio MULTICAST de una particion", - "059-Error en la recepcion MULTICAST de una particion", - "060-Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER", - "061-Error no definido", - "062-Error no definido", - "063-Error no definido", - "064-Error no definido", - "065-Error no definido", - "066-Error no definido", - "067-Error no definido", - "068-Error no definido", - "069-Error no definido", - "070-Error al montar una imagen sincronizada.", - "071-Imagen no sincronizable (es monolitica).", - "072-Error al desmontar la imagen.", - "073-No se detectan diferencias entre la imagen basica y la particion.", - "074-Error al sincronizar, puede afectar la creacion/restauracion de la imagen.", - "Error desconocido", - ] - def onDeactivation (self): """ Sends OGAgent stopping notification to OpenGnsys server diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index c76d867..d221f1b 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -58,6 +58,85 @@ class ThreadWithResult (threading.Thread): class ogLiveWorker(ServerWorker): thread_list = {} + tbErroresScripts = [ + "Se han generado errores desconocidos. No se puede continuar la ejecución de este módulo", ## 0 + "001-Formato de ejecución incorrecto.", + "002-Fichero o dispositivo no encontrado", + "003-Error en partición de disco", + "004-Partición o fichero bloqueado", + "005-Error al crear o restaurar una imagen", + "006-Sin sistema operativo", + "007-Programa o función BOOLEAN no ejecutable", + "008-Error en la creación del archivo de eco para consola remota", + "009-Error en la lectura del archivo temporal de intercambio", + "010-Error al ejecutar la llamada a la interface de administración", + "011-La información retornada por la interface de administración excede de la longitud permitida", + "012-Error en el envío de fichero por la red", + "013-Error en la creación del proceso hijo", + "014-Error de escritura en destino", + "015-Sin Cache en el Cliente", + "016-No hay espacio en la cache para almacenar fichero-imagen", + "017-Error al Reducir el Sistema Archivos", + "018-Error al Expandir el Sistema Archivos", + "019-Valor fuera de rango o no válido.", + "020-Sistema de archivos desconocido o no se puede montar", + "021-Error en partición de caché local", + "022-El disco indicado no contiene una particion GPT", + "023-Error no definido", + "024-Error no definido", + "025-Error no definido", + "026-Error no definido", + "027-Error no definido", + "028-Error no definido", + "029-Error no definido", + "030-Error al restaurar imagen - Imagen mas grande que particion", + "031-Error al realizar el comando updateCache", + "032-Error al formatear", + "033-Archivo de imagen corrupto o de otra versión de partclone", + "034-Error no definido", + "035-Error no definido", + "036-Error no definido", + "037-Error no definido", + "038-Error no definido", + "039-Error no definido", + "040-Error imprevisto no definido", + "041-Error no definido", + "042-Error no definido", + "043-Error no definido", + "044-Error no definido", + "045-Error no definido", + "046-Error no definido", + "047-Error no definido", + "048-Error no definido", + "049-Error no definido", + "050-Error en la generación de sintaxis de transferenica unicast", + "051-Error en envio UNICAST de una particion", + "052-Error en envio UNICAST de un fichero", + "053-Error en la recepcion UNICAST de una particion", + "054-Error en la recepcion UNICAST de un fichero", + "055-Error en la generacion de sintaxis de transferenica Multicast", + "056-Error en envio MULTICAST de un fichero", + "057-Error en la recepcion MULTICAST de un fichero", + "058-Error en envio MULTICAST de una particion", + "059-Error en la recepcion MULTICAST de una particion", + "060-Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER", + "061-Error no definido", + "062-Error no definido", + "063-Error no definido", + "064-Error no definido", + "065-Error no definido", + "066-Error no definido", + "067-Error no definido", + "068-Error no definido", + "069-Error no definido", + "070-Error al montar una imagen sincronizada.", + "071-Imagen no sincronizable (es monolitica).", + "072-Error al desmontar la imagen.", + "073-No se detectan diferencias entre la imagen basica y la particion.", + "074-Error al sincronizar, puede afectar la creacion/restauracion de la imagen.", + "Error desconocido", + ] + def notifier (self, result): logger.debug (f'notifier() called, result ({result})') res = self.REST.sendMessage ('/'.join ([self.name, 'callback']), result)