Este es el quinto sexto de la saga de tutoriales sobre Opengnsys 2 referentes a cómo implementar plugins para la Consola Web. Puedes acceder a la [que lista todos los tutoriales] o al tutorial anterior: Tutorial 5: Acciones avanzadas en el Panel Contextual.
Este sexto tutorial se basa en el Tutorial 4: Envío de trabajos a los clientes, por tanto es preciso haberlo comprendido para poder continuar. En dicho tutorial conseguimos enviar el comando uptime a un cliente y recibir y procesar la respuesta en la consola web.
En este sexto tutorial modificaremos el código del tutorial 4 para poder ejecutar el comando uptime sobre una unidad organizativa, enviándose a todos los ordenadores dentro de la misma. Para ello crearemos un Job padre que agrupe la tarea conjunta, y un job hijo para cada ordenador donde se vaya a ejecutar el comando.
Modificaremos el código del tutorial 4 para que la acción uptime aparezca también en las unidades organizativas:
#!python
'''
Jobs plugin example
'''
from ..pluginbase import PluginBase
from view import UptimeView
class Plugin(PluginBase):
'''
'''
def enable(self):
self.actions_for_url = ('navigator/(computer|ou)/(.*)', 'get_uptime')
self.urls = ('self.get_action_url('get_uptime')', UptimeView)
Y el código de la vista para que tenga en cuenta que debe comprobar si estamos tratando con un ordenador o una unidad organizativa, y crear y el job correspondiente:
#!python
import web
import datetime
from jobs import GetUptimeJob
from decorators import pi18n
class UptimeView:
@pi18n
def GET(self, entity_type, entity_name):
orm = web.ctx.orm
if entity_type == 'computer':
computer = orm.query(Computer).filter(Computer.name == name).first()
if not computer:
self.error(_('Computer "%s" not found') % name)
if not computer.online:
# makes no sense to send uptime to an offline computer
self.error(_('Computer "%s" not online') % name)
parent_job = GetUptimeJob(computer)
paren_job.send()
elif entity_type == 'ou':
ou = orm.query(OrganizativeUnit).filter(OrganizativeUnit.name == name).first()
if not ou:
self.error(_('Organizative Unit "%s" not found') % name)
parent_job = Job()
for computer in ou.get_all_descendant_computers():
# makes no sense to send uptime to an offline computer
if not computer.online:
continue
parent_job.children.append(GetUptimeJob(computer))
parent_job.send()
else:
self.error(_('This command is only for computers or ous'))
web.ctx.notify(_('Uptime command sent to %s') % name, 'notification')
raise web.seeother('/jobs/%s' % parent_job.id)
El !GetUptimeJob no varía: sigue siendo aplicable sólo a un ordenador y por tanto es exactamente el mismo del anterior tutorial. No obstante para el caso de las unidades organizativas hemos creado un job padre, y luego hemos ido añadiéndole job hijos. Posteriormente enviamos el job padre, que automáticamente envía los trabajos de sus hijos a los ordenadores correspondientes.