ogadmclient-status #11

Merged
nserrano merged 8 commits from ogadmclient-status into main 2024-10-15 17:12:56 +02:00
8 changed files with 62 additions and 17 deletions

View File

@ -1,3 +1,9 @@
ogagent (1.4.2-1) UNRELEASED; urgency=medium
* Have ogAdmClient/status return information about network and disks
-- OpenGnsys developers <info@opengnsys.es> Tue, 15 Oct 2024 10:35:16 +0200
ogagent (1.4.1-1) stable; urgency=medium ogagent (1.4.1-1) stable; urgency=medium
* Bugfix: move data structure to the right class * Bugfix: move data structure to the right class

View File

@ -13,7 +13,7 @@ ogausr_a = Analysis(
# ('cfg', 'cfg'), ## add the entire directory # ('cfg', 'cfg'), ## add the entire directory
('img', 'img'), ## 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=[], hookspath=[],
hooksconfig={}, hooksconfig={},
runtime_hooks=[], runtime_hooks=[],
@ -26,7 +26,7 @@ ogasvc_a = Analysis(
pathex=[], pathex=[],
binaries=[], binaries=[],
datas=[], 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=[], hookspath=[],
hooksconfig={}, hooksconfig={},
runtime_hooks=[], runtime_hooks=[],

View File

@ -1 +1 @@
1.4.1 1.4.2

View File

@ -167,11 +167,11 @@ class CloningEngineWorker (ogLiveWorker):
cmd = { cmd = {
'nfn': 'RESPUESTA_RestaurarImagen', 'nfn': 'RESPUESTA_RestaurarImagen',
'idi': idi, ## Identificador de la imagen 'idi': idi, ## Identificador de la imagen
'dsk': dsk, ## Número de disco 'dsk': dsk, ## Número de disco
'par': par, ## Número de partición 'par': par, ## Número de partición
'ifs': ifs, ## Identificador del perfil software 'ifs': ifs, ## Identificador del perfil software
'cfg': cfg, ## Configuración de discos 'cfg': self.cfg2obj(cfg), ## Configuración de discos
} }
return self.respuestaEjecucionComando (cmd, herror, ids) return self.respuestaEjecucionComando (cmd, herror, ids)
@ -213,7 +213,7 @@ class CloningEngineWorker (ogLiveWorker):
cmd = { cmd = {
'nfn': 'RESPUESTA_Configurar', 'nfn': 'RESPUESTA_Configurar',
'cfg': cfg, 'cfg': self.cfg2obj (cfg),
} }
self.muestraMenu() self.muestraMenu()
return self.respuestaEjecucionComando (cmd, herror, ids) return self.respuestaEjecucionComando (cmd, herror, ids)

View File

@ -189,7 +189,7 @@ class OpenGnSysWorker(ServerWorker):
if os.path.isfile(new_hosts_file): if os.path.isfile(new_hosts_file):
shutil.copyfile(new_hosts_file, hosts_file) shutil.copyfile(new_hosts_file, hosts_file)
logger.info ('onActivation ok') logger.debug ('onActivation ok')
def onDeactivation(self): def onDeactivation(self):
""" """

View File

@ -174,7 +174,7 @@ class ogAdmClientWorker (ogLiveWorker):
logger.warning ('Ha ocurrido algún problema en el proceso de inclusión del cliente') logger.warning ('Ha ocurrido algún problema en el proceso de inclusión del cliente')
logger.error ('LeeConfiguracion() failed') logger.error ('LeeConfiguracion() failed')
return False return False
res = self.enviaMensajeServidor ('InclusionCliente', { 'cfg': cfg }) res = self.enviaMensajeServidor ('InclusionCliente', { 'cfg': self.cfg2obj (cfg) })
logger.debug ('res ({})'.format (res)) logger.debug ('res ({})'.format (res))
## RESPUESTA_InclusionCliente ## RESPUESTA_InclusionCliente
@ -306,15 +306,26 @@ class ogAdmClientWorker (ogLiveWorker):
logger.info ('onActivation ok') logger.info ('onActivation ok')
@check_secret def do_status (self, post_params):
def process_status (self, path, get_params, post_params, server): cfg = self.LeeConfiguracion()
thr_status = {} thr_status = {}
for k in self.thread_list: for k in self.thread_list:
thr_status[k] = { thr_status[k] = {
'running': self.thread_list[k]['running'], 'running': self.thread_list[k]['running'],
'result': self.thread_list[k]['result'], 'result': self.thread_list[k]['result'],
} }
return thr_status return {
'nfn': 'RESPUESTA_status',
'mac': self.mac,
'ip': self.IPlocal,
'cfg': self.cfg2obj (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 @check_secret
def process_popup (self, path, get_params, post_params, server): def process_popup (self, path, get_params, post_params, server):
@ -335,7 +346,7 @@ class ogAdmClientWorker (ogLiveWorker):
cmd = { cmd = {
'nfn': 'RESPUESTA_Actualizar', 'nfn': 'RESPUESTA_Actualizar',
'cfg': cfg, 'cfg': self.cfg2obj (cfg),
} }
self.muestraMenu() self.muestraMenu()
return self.respuestaEjecucionComando (cmd, 0) return self.respuestaEjecucionComando (cmd, 0)
@ -491,7 +502,7 @@ class ogAdmClientWorker (ogLiveWorker):
cmd = { cmd = {
'nfn': 'RESPUESTA_EjecutarScript', 'nfn': 'RESPUESTA_EjecutarScript',
'cfg': cfg, 'cfg': self.cfg2obj (cfg),
} }
self.muestraMenu() self.muestraMenu()
return self.respuestaEjecucionComando (cmd, herror, ids) return self.respuestaEjecucionComando (cmd, herror, ids)

View File

@ -158,7 +158,7 @@ class CommonService(object):
validMods.append(mod) validMods.append(mod)
except Exception as e: except Exception as e:
logger.exception() 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 self.modules[:] = validMods # copy instead of assignment

View File

@ -200,6 +200,15 @@ class ogLiveWorker(ServerWorker):
logger.info ('local IP is "{}"'.format (self.IPlocal)) logger.info ('local IP is "{}"'.format (self.IPlocal))
return True 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={}): def enviaMensajeServidor (self, path, obj={}):
obj['iph'] = self.IPlocal ## Ip del ordenador obj['iph'] = self.IPlocal ## Ip del ordenador
obj['ido'] = self.idordenador ## Identificador del ordenador obj['ido'] = self.idordenador ## Identificador del ordenador
@ -264,6 +273,21 @@ class ogLiveWorker(ServerWorker):
logger.debug ('parametroscfg ({})'.format (parametroscfg)) logger.debug ('parametroscfg ({})'.format (parametroscfg))
return parametroscfg return parametroscfg
def cfg2obj (self, cfg):
obj = []
ptrPar = cfg.split ('\n')
for line in ptrPar:
elem = {}
ptrCfg = line.split ('\t')
for item in ptrCfg:
k, v = item.split ('=')
elem[k] = v
obj.append (elem)
return obj
def onActivation (self): def onActivation (self):
if not os.path.exists ('/scripts/oginit'): if not os.path.exists ('/scripts/oginit'):
## no estamos en oglive, este modulo no debe cargarse ## no estamos en oglive, este modulo no debe cargarse
@ -272,6 +296,7 @@ class ogLiveWorker(ServerWorker):
self.pathinterface = None self.pathinterface = None
self.IPlocal = None ## Ip del ordenador self.IPlocal = None ## Ip del ordenador
self.mac = None ## MAC del ordenador
self.idordenador = None ## Identificador del ordenador self.idordenador = None ## Identificador del ordenador
self.nombreordenador = None ## Nombre del ordenador self.nombreordenador = None ## Nombre del ordenador
self.cache = None self.cache = None
@ -294,6 +319,9 @@ class ogLiveWorker(ServerWorker):
if not self.tomaIPlocal(): if not self.tomaIPlocal():
raise Exception ('Se han generado errores. No se puede continuar la ejecución de este módulo') 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() threading.Thread (name='monitoring_thread', target=self.mon, daemon=True).start()
def _long_running_job (self, name, f, args): def _long_running_job (self, name, f, args):