From 58b7f0d406ab43baa7ad139597d199d7f53d0239 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 15 Oct 2024 10:54:59 +0200 Subject: [PATCH 1/8] refs #945 put more info in ogAdmClient/status, make reply async --- .../modules/server/ogAdmClient/__init__.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 8e87d7a..c9e0344 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -306,15 +306,26 @@ class ogAdmClientWorker (ogLiveWorker): logger.info ('onActivation ok') - @check_secret - def process_status (self, path, get_params, post_params, server): + def do_status (self, post_params): + cfg = self.LeeConfiguracion() 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 + return { + 'nfn': 'RESPUESTA_status', + 'mac': '12:23:34:45:56:67', + 'ip': self.IPlocal, + 'cfg': cfg, + 'threads': thr_status, + } + + @check_secret + def process_status (self, path, get_params, post_params, server): + logger.debug ('in process_status, path "{}" get_params "{}" post_params "{}" server "{}"'.format (path, get_params, post_params, server)) + return self._long_running_job ('status', self.do_status, args=(post_params,)) @check_secret def process_popup (self, path, get_params, post_params, server): From 376dec466fe59eba9a3eb15b9bb1f94c216e1189 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 15 Oct 2024 11:18:37 +0200 Subject: [PATCH 2/8] refs #948 get MAC address --- .../modules/server/ogAdmClient/__init__.py | 2 +- src/opengnsys/workers/oglive_worker.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index c9e0344..74d7716 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -316,7 +316,7 @@ class ogAdmClientWorker (ogLiveWorker): } return { 'nfn': 'RESPUESTA_status', - 'mac': '12:23:34:45:56:67', + 'mac': self.mac, 'ip': self.IPlocal, 'cfg': cfg, 'threads': thr_status, diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index d221f1b..694eb8e 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -200,6 +200,15 @@ class ogLiveWorker(ServerWorker): logger.info ('local IP is "{}"'.format (self.IPlocal)) return True + def tomaMAClocal (self): + ## tomaIPlocal() calls interfaceAdm('getIpAddress') + ## getIpAddress runs 'ip addr show' and returns the IP address of every network interface except "lo" + ## (ie. breaks badly if there's more than one network interface) + ## let's make the same assumptions here + mac = subprocess.run (["ip -json link show |jq -r '.[] |select (.ifname != \"lo\") |.address'"], shell=True, capture_output=True, text=True) + self.mac = mac.stdout.strip() + return True + def enviaMensajeServidor (self, path, obj={}): obj['iph'] = self.IPlocal ## Ip del ordenador obj['ido'] = self.idordenador ## Identificador del ordenador @@ -272,6 +281,7 @@ class ogLiveWorker(ServerWorker): self.pathinterface = None self.IPlocal = None ## Ip del ordenador + self.mac = None ## MAC del ordenador self.idordenador = None ## Identificador del ordenador self.nombreordenador = None ## Nombre del ordenador self.cache = None @@ -294,6 +304,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') + if not self.tomaMAClocal(): + raise Exception ('Se han generado errores. No se puede continuar la ejecución de este módulo') + threading.Thread (name='monitoring_thread', target=self.mon, daemon=True).start() def _long_running_job (self, name, f, args): From a2df6afda70f5a9bac1650cc87d9e2ed7512d5f8 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 15 Oct 2024 11:26:05 +0200 Subject: [PATCH 3/8] refs #946 return cfg as json, not the legacy text string --- .../modules/server/ogAdmClient/__init__.py | 2 +- src/opengnsys/workers/oglive_worker.py | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 74d7716..94db8c3 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -318,7 +318,7 @@ class ogAdmClientWorker (ogLiveWorker): 'nfn': 'RESPUESTA_status', 'mac': self.mac, 'ip': self.IPlocal, - 'cfg': cfg, + 'cfg': self.cfg2obj (cfg), 'threads': thr_status, } diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index 694eb8e..5c99bd9 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -273,6 +273,30 @@ class ogLiveWorker(ServerWorker): logger.debug ('parametroscfg ({})'.format (parametroscfg)) return parametroscfg + def cfg2obj (self, cfg): + obj = [] + ptrPar = cfg.split ('\n') + for line in ptrPar: + elem = {} + ptrCfg = line.split ('\t') + + ## Si la 1ª línea solo incluye el número de serie del equipo; actualizar BD. + #if es_la_primera_iteracion and 1 == len (ptrCfg): + # elem['ser'] = ptrCfg[0].split ('=')[1] + # continue ## si hemos entrado en este if, entonces no hacemos todo lo demas de particiones y tal: iteramos el bucle de nuevo + + elem['disk'] = ptrCfg[0].split ('=')[1] ## Número de disco + elem['par'] = ptrCfg[1].split ('=')[1] ## Número de partición + elem['cpt'] = ptrCfg[2].split ('=')[1] or 0 ## Código de partición + elem['sfi'] = ptrCfg[3].split ('=')[1] ## Sistema de ficheros + elem['soi'] = ptrCfg[4].split ('=')[1] ## Nombre del S.O. instalado + elem['tam'] = ptrCfg[5].split ('=')[1] ## Tamaño de la partición + elem['uso'] = ptrCfg[6].split ('=')[1] ## Porcentaje de uso del S.F. + + obj.append (elem) + + return obj + def onActivation (self): if not os.path.exists ('/scripts/oginit'): ## no estamos en oglive, este modulo no debe cargarse From 0f5cf07aa01d7342515f17cdf118fa5fcfc17f77 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 15 Oct 2024 11:29:58 +0200 Subject: [PATCH 4/8] refs #946 simplify code, support "ser=text" --- src/opengnsys/workers/oglive_worker.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index 5c99bd9..80c5c69 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -280,18 +280,9 @@ class ogLiveWorker(ServerWorker): elem = {} ptrCfg = line.split ('\t') - ## Si la 1ª línea solo incluye el número de serie del equipo; actualizar BD. - #if es_la_primera_iteracion and 1 == len (ptrCfg): - # elem['ser'] = ptrCfg[0].split ('=')[1] - # continue ## si hemos entrado en este if, entonces no hacemos todo lo demas de particiones y tal: iteramos el bucle de nuevo - - elem['disk'] = ptrCfg[0].split ('=')[1] ## Número de disco - elem['par'] = ptrCfg[1].split ('=')[1] ## Número de partición - elem['cpt'] = ptrCfg[2].split ('=')[1] or 0 ## Código de partición - elem['sfi'] = ptrCfg[3].split ('=')[1] ## Sistema de ficheros - elem['soi'] = ptrCfg[4].split ('=')[1] ## Nombre del S.O. instalado - elem['tam'] = ptrCfg[5].split ('=')[1] ## Tamaño de la partición - elem['uso'] = ptrCfg[6].split ('=')[1] ## Porcentaje de uso del S.F. + for item in ptrCfg: + k, v = item.split ('=') + elem[k] = v obj.append (elem) From 9245bff31d3818694c34aa6645a9af94e176236e Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 15 Oct 2024 11:30:39 +0200 Subject: [PATCH 5/8] refs #944 release ogagent-1.4.2 --- linux/debian/changelog | 6 ++++++ src/VERSION | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/linux/debian/changelog b/linux/debian/changelog index 0ee968c..5efe64c 100644 --- a/linux/debian/changelog +++ b/linux/debian/changelog @@ -1,3 +1,9 @@ +ogagent (1.4.2-1) UNRELEASED; urgency=medium + + * Have ogAdmClient/status return information about network and disks + + -- OpenGnsys developers Tue, 15 Oct 2024 10:35:16 +0200 + ogagent (1.4.1-1) stable; urgency=medium * Bugfix: move data structure to the right class diff --git a/src/VERSION b/src/VERSION index 347f583..9df886c 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -1.4.1 +1.4.2 From c7b48a6c7054ac6423d2d1a3d7c455c42a452b78 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 15 Oct 2024 15:06:39 +0200 Subject: [PATCH 6/8] refs #946 return cfg as json everywhere, not only in inclusionCliente --- .../modules/server/CloningEngine/__init__.py | 12 ++++++------ src/opengnsys/modules/server/ogAdmClient/__init__.py | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/opengnsys/modules/server/CloningEngine/__init__.py b/src/opengnsys/modules/server/CloningEngine/__init__.py index 41e310f..b95bd23 100644 --- a/src/opengnsys/modules/server/CloningEngine/__init__.py +++ b/src/opengnsys/modules/server/CloningEngine/__init__.py @@ -167,11 +167,11 @@ class CloningEngineWorker (ogLiveWorker): cmd = { 'nfn': 'RESPUESTA_RestaurarImagen', - 'idi': idi, ## Identificador de la imagen - 'dsk': dsk, ## Número de disco - 'par': par, ## Número de partición - 'ifs': ifs, ## Identificador del perfil software - 'cfg': cfg, ## Configuración de discos + 'idi': idi, ## Identificador de la imagen + 'dsk': dsk, ## Número de disco + 'par': par, ## Número de partición + 'ifs': ifs, ## Identificador del perfil software + 'cfg': self.cfg2obj(cfg), ## Configuración de discos } return self.respuestaEjecucionComando (cmd, herror, ids) @@ -213,7 +213,7 @@ class CloningEngineWorker (ogLiveWorker): cmd = { 'nfn': 'RESPUESTA_Configurar', - 'cfg': cfg, + 'cfg': self.cfg2obj (cfg), } self.muestraMenu() return self.respuestaEjecucionComando (cmd, herror, ids) diff --git a/src/opengnsys/modules/server/ogAdmClient/__init__.py b/src/opengnsys/modules/server/ogAdmClient/__init__.py index 94db8c3..bc34112 100644 --- a/src/opengnsys/modules/server/ogAdmClient/__init__.py +++ b/src/opengnsys/modules/server/ogAdmClient/__init__.py @@ -174,7 +174,7 @@ class ogAdmClientWorker (ogLiveWorker): logger.warning ('Ha ocurrido algún problema en el proceso de inclusión del cliente') logger.error ('LeeConfiguracion() failed') return False - res = self.enviaMensajeServidor ('InclusionCliente', { 'cfg': cfg }) + res = self.enviaMensajeServidor ('InclusionCliente', { 'cfg': self.cfg2obj (cfg) }) logger.debug ('res ({})'.format (res)) ## RESPUESTA_InclusionCliente @@ -346,7 +346,7 @@ class ogAdmClientWorker (ogLiveWorker): cmd = { 'nfn': 'RESPUESTA_Actualizar', - 'cfg': cfg, + 'cfg': self.cfg2obj (cfg), } self.muestraMenu() return self.respuestaEjecucionComando (cmd, 0) @@ -502,7 +502,7 @@ class ogAdmClientWorker (ogLiveWorker): cmd = { 'nfn': 'RESPUESTA_EjecutarScript', - 'cfg': cfg, + 'cfg': self.cfg2obj (cfg), } self.muestraMenu() return self.respuestaEjecucionComando (cmd, herror, ids) From fcf9c5b2ba28dc2671facc9f62725e74b0d43569 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 15 Oct 2024 16:15:24 +0200 Subject: [PATCH 7/8] refs #932 help pyinstaller find all opengnsys modules --- src/OGAgent.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OGAgent.spec b/src/OGAgent.spec index 2dbcdc6..aaba3a8 100755 --- a/src/OGAgent.spec +++ b/src/OGAgent.spec @@ -13,7 +13,7 @@ ogausr_a = Analysis( # ('cfg', 'cfg'), ## add the entire directory ('img', 'img'), ## add the entire directory ], - hiddenimports=['win32timezone', 'socketserver', 'http.server', 'urllib'], + hiddenimports=['win32timezone', 'socketserver', 'http.server', 'urllib', 'opengnsys.modules.client.OpenGnSys', 'opengnsys.modules.server.CloningEngine', 'opengnsys.modules.server.ogAdmClient', 'opengnsys.modules.server.OpenGnSys'], hookspath=[], hooksconfig={}, runtime_hooks=[], @@ -26,7 +26,7 @@ ogasvc_a = Analysis( pathex=[], binaries=[], datas=[], - hiddenimports=['win32timezone', 'socketserver', 'http.server', 'urllib'], + hiddenimports=['win32timezone', 'socketserver', 'http.server', 'urllib', 'opengnsys.modules.client.OpenGnSys', 'opengnsys.modules.server.CloningEngine', 'opengnsys.modules.server.ogAdmClient', 'opengnsys.modules.server.OpenGnSys'], hookspath=[], hooksconfig={}, runtime_hooks=[], From bf099333b50dd8523aa73e33ff1c1416d6fd704d Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Tue, 15 Oct 2024 16:39:22 +0200 Subject: [PATCH 8/8] refs #932 prevent python from dying on windows --- src/opengnsys/modules/server/OpenGnSys/__init__.py | 2 +- src/opengnsys/service.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opengnsys/modules/server/OpenGnSys/__init__.py b/src/opengnsys/modules/server/OpenGnSys/__init__.py index a6b2493..d152306 100644 --- a/src/opengnsys/modules/server/OpenGnSys/__init__.py +++ b/src/opengnsys/modules/server/OpenGnSys/__init__.py @@ -189,7 +189,7 @@ class OpenGnSysWorker(ServerWorker): if os.path.isfile(new_hosts_file): shutil.copyfile(new_hosts_file, hosts_file) - logger.info ('onActivation ok') + logger.debug ('onActivation ok') def onDeactivation(self): """ diff --git a/src/opengnsys/service.py b/src/opengnsys/service.py index e7da465..d13f686 100644 --- a/src/opengnsys/service.py +++ b/src/opengnsys/service.py @@ -158,7 +158,7 @@ class CommonService(object): validMods.append(mod) except Exception as e: logger.exception() - logger.error("Activation of {} failed: {}".format(mod.name, exceptionToMessage(e))) + logger.debug("Activation of {} failed: {}".format(mod.name, exceptionToMessage(e))) self.modules[:] = validMods # copy instead of assignment