Example #1
0
def start_action():
    '''Start the event manager daemon.'''

    pid_file = opts.pid_file
    if os.path.isfile(pid_file):
        pid = get_pid(pid_file)
        if pid_running(pid):
            logger.error('event manager already started with pid %d', pid)
            return

        logger.info('no process with pid %d', pid)
        del_pid_file(pid_file)

    listener = Listener(opts.server_socket)
    listener.start()
    plugind = PluginDirectory()
    daemon = UzblEventDaemon(listener, plugind)
    daemon.run()
Example #2
0
def start_action():
    '''Start the event manager daemon.'''

    pid_file = opts.pid_file
    if os.path.isfile(pid_file):
        pid = get_pid(pid_file)
        if pid_running(pid):
            logger.error('event manager already started with pid %d', pid)
            return

        logger.info('no process with pid %d', pid)
        del_pid_file(pid_file)

    listener = Listener(opts.server_socket)
    listener.start()
    plugind = PluginDirectory()
    daemon = UzblEventDaemon(listener, plugind)
    daemon.run()
Example #3
0
def start_action(opts, config):
    """Start the event manager daemon."""

    pid_file = opts.pid_file
    if os.path.isfile(pid_file):
        pid = get_pid(pid_file)
        if pid is None:
            logger.error("unable to determine pid with pid file: %r", pid_file)
            return 1

        if pid_running(pid):
            logger.error("event manager already started with pid %d", pid)
            return 1

        logger.info("no process with pid %d", pid)
        del_pid_file(pid_file)

    listener = Listener(opts.server_socket)
    listener.start()
    plugind = PluginDirectory()
    daemon = UzblEventDaemon(listener, plugind, opts, config)
    daemon.run()

    return 0
Example #4
0
 def listen(self):
     '''Start listening on socket'''
     self.listener = Listener(self.server_socket)
     self.listener.target = self
     self.listener.start()
Example #5
0
class UzblEventDaemon(object):
    def __init__(self, plugind, config, server_socket, auto_close=False,
                 print_events=False):
        self.server_socket = server_socket
        self.auto_close = auto_close
        self.print_events = print_events
        self.plugind = plugind
        self.config = config
        self._plugin_instances = []
        self._quit = False

        # Hold uzbl instances
        # {child socket: Uzbl instance, ..}
        self.uzbls = {}

        self.plugins = {}

        # Scan plugin directory for plugins
        self.plugind.load()

        # Initialise global plugins with instances in self.plugins
        self.init_plugins()

    def init_plugins(self):
        '''Initialise event manager plugins.'''
        self.plugins = {}

        for plugin in self.plugind.global_plugins:
            pinst = plugin(self)
            self._plugin_instances.append(pinst)
            self.plugins[plugin] = pinst

    def listen(self):
        '''Start listening on socket'''
        self.listener = Listener(self.server_socket)
        self.listener.target = self
        self.listener.start()

    def run(self):
        '''Main event daemon loop.'''

        logger.debug('entering main loop')

        asyncore.loop()

        # Clean up and exit
        self.quit()

        logger.debug('exiting main loop')

    def add_instance(self, sock):
        proto = Protocol(sock)
        uzbl = Uzbl(self, proto, self.print_events)
        self.uzbls[sock] = uzbl
        for plugin in self.plugins.values():
            plugin.new_uzbl(uzbl)

    def remove_instance(self, sock):
        if sock in self.uzbls:
            for plugin in self.plugins.values():
                plugin.free_uzbl(self.uzbls[sock])
            del self.uzbls[sock]
        if not self.uzbls and self.auto_close:
            self.quit()

    def close_server_socket(self):
        '''Close and delete the server socket.'''

        try:
            self.listener.close()
        except:
            logger.error('failed to close server socket', exc_info=True)

    def get_plugin_config(self, name):
        if name not in self.config:
            self.config.add_section(name)
        return self.config[name]

    def quit(self, sigint=None, *args):
        '''Close all instance socket objects, server socket and delete the
        pid file.'''

        if not self._quit:
            logger.debug('shutting down event manager')

        self.close_server_socket()

        for uzbl in list(self.uzbls.values()):
            uzbl.close()

        if not self._quit:
            for plugin in self._plugin_instances:
                plugin.cleanup()
            del self.plugins  # to avoid cyclic links
            del self._plugin_instances

        if not self._quit:
            logger.info('event manager shut down')
            self._quit = True