= Tutorial 6: Subjobs = == Introducción == 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 [[Version2|página que lista todos los tutoriales]] o al tutorial anterior: [wiki:Version2/Tutoriales/Consola_Web/Tutorial_5_Acciones_avanzadas_en_Panel_Contextual Tutorial 5: Acciones avanzadas en el Panel Contextual]. Este sexto tutorial se basa en el [wiki:Version2/Tutoriales/Consola_Web/Tutorial_4_Jobs 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. == Las acciones == 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.