wiki:Version2/Tutoriales/Consola_Web/Tutorial_6_Subjobs

Version 4 (modified by edulix, 13 years ago) (diff)

--

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 página 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.

Las acciones

Modificaremos el código del tutorial 4 para que la acción uptime aparezca también en las unidades organizativas:

'''
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:

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.