uzbl/bin/uzbl-event-manager
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 19 Apr 2012 08:35:05 +0000
changeset 30 39fbc84d4033
parent 12 48db03aa2650
permissions -rwxr-xr-x
- WebKitRenderer added: #KEY_PRESS: #KEY_RELEASE: #SCROLL_HORIZ: #SCROLL_VERT:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
#!/usr/bin/env python
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
# Event Manager for Uzbl
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
# Copyright (c) 2009-2010, Mason Larobina <mason.larobina@gmail.com>
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
# Copyright (c) 2009, Dieter Plaetinck <dieter@plaetinck.be>
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
#
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
# This program is free software: you can redistribute it and/or modify
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
# it under the terms of the GNU General Public License as published by
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
# the Free Software Foundation, either version 3 of the License, or
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
# (at your option) any later version.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
#
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
# This program is distributed in the hope that it will be useful,
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
# GNU General Public License for more details.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
#
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
# You should have received a copy of the GNU General Public License
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
E V E N T _ M A N A G E R . P Y
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
===============================
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
Event manager for uzbl written in python.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
import atexit
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
import imp
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
import logging
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
import os
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
import socket
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
import sys
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
import time
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
import weakref
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
import re
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
from collections import defaultdict
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
from functools import partial
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
from glob import glob
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
from itertools import count
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
from optparse import OptionParser
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
from select import select
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
from signal import signal, SIGTERM, SIGINT
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
from socket import socket, AF_UNIX, SOCK_STREAM
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
from traceback import format_exc
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
def xdghome(key, default):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
    '''Attempts to use the environ XDG_*_HOME paths if they exist otherwise
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
    use $HOME and the default path.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
    xdgkey = "XDG_%s_HOME" % key
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
    if xdgkey in os.environ.keys() and os.environ[xdgkey]:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
        return os.environ[xdgkey]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
    return os.path.join(os.environ['HOME'], default)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
# `make install` will put the correct value here for your system
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
PREFIX = '/usr/local/'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
# Setup xdg paths.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
DATA_DIR = os.path.join(xdghome('DATA', '.local/share/'), 'uzbl/')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
CACHE_DIR = os.path.join(xdghome('CACHE', '.cache/'), 'uzbl/')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
# Define some globals.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
SCRIPTNAME = os.path.basename(sys.argv[0])
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
def get_exc():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
    '''Format `format_exc` for logging.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
    return "\n%s" % format_exc().rstrip()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
def expandpath(path):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
    '''Expand and realpath paths.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
    return os.path.realpath(os.path.expandvars(path))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
def ascii(u):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
    '''Convert unicode strings into ascii for transmission over
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
    ascii-only streams/sockets/devices.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
    return u.encode('utf-8')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
def daemonize():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
    '''Daemonize the process using the Stevens' double-fork magic.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
    logger.info('entering daemon mode')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
    try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
        if os.fork():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
            os._exit(0)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
    except OSError:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
        logger.critical(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
        sys.exit(1)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
    os.chdir('/')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
    os.setsid()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
    os.umask(0)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
    try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
        if os.fork():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
            os._exit(0)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
    except OSError:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
        logger.critical(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
        sys.exit(1)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
    if sys.stdout.isatty():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
        sys.stdout.flush()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
        sys.stderr.flush()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
    devnull = '/dev/null'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
    stdin = file(devnull, 'r')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
    stdout = file(devnull, 'a+')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
    stderr = file(devnull, 'a+', 0)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
    os.dup2(stdin.fileno(), sys.stdin.fileno())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
    os.dup2(stdout.fileno(), sys.stdout.fileno())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
    os.dup2(stderr.fileno(), sys.stderr.fileno())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
    logger.info('entered daemon mode')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
def make_dirs(path):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
    '''Make all basedirs recursively as required.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
    try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
        dirname = os.path.dirname(path)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
        if not os.path.isdir(dirname):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
            logger.debug('creating directories %r' % dirname)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
            os.makedirs(dirname)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
    except OSError:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
        logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
class EventHandler(object):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
    '''Event handler class. Used to store args and kwargs which are merged
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
    come time to call the callback with the event args and kwargs.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   140
    nextid = count().next
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
    def __init__(self, plugin, event, callback, args, kwargs):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   143
        self.id = self.nextid()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
        self.plugin = plugin
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
        self.event = event
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
        self.callback = callback
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
        self.args = args
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
        self.kwargs = kwargs
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   150
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   151
    def __repr__(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   152
        elems = ['id=%d' % self.id, 'event=%s' % self.event,
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   153
            'callback=%r' % self.callback]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
        if self.args:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
            elems.append('args=%s' % repr(self.args))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   157
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   158
        if self.kwargs:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   159
            elems.append('kwargs=%s' % repr(self.kwargs))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   160
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   161
        elems.append('plugin=%s' % self.plugin.name)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   162
        return u'<handler(%s)>' % ', '.join(elems)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   163
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   164
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   165
    def call(self, uzbl, *args, **kwargs):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   166
        '''Execute the handler function and merge argument lists.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   167
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   168
        args = args + self.args
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   169
        kwargs = dict(self.kwargs.items() + kwargs.items())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   170
        self.callback(uzbl, *args, **kwargs)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   171
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   172
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   173
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   174
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   175
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   176
class Plugin(object):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   177
    '''Plugin module wrapper object.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   178
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   179
    # Special functions exported from the Plugin instance to the
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   180
    # plugin namespace.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   181
    special_functions = ['require', 'export', 'export_dict', 'connect',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   182
            'connect_dict', 'logger', 'unquote', 'splitquoted']
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   183
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   184
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   185
    def __init__(self, parent, name, path, plugin):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   186
        self.parent = parent
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   187
        self.name = name
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   188
        self.path = path
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   189
        self.plugin = plugin
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   190
        self.logger = get_logger('plugin.%s' % name)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   191
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   192
        # Weakrefs to all handlers created by this plugin
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   193
        self.handlers = set([])
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   195
        # Plugins init hook
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   196
        init = getattr(plugin, 'init', None)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   197
        self.init = init if callable(init) else None
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   198
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   199
        # Plugins optional after hook
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   200
        after = getattr(plugin, 'after', None)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   201
        self.after = after if callable(after) else None
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   202
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   203
        # Plugins optional cleanup hook
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   204
        cleanup = getattr(plugin, 'cleanup', None)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   205
        self.cleanup = cleanup if callable(cleanup) else None
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   206
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   207
        assert init or after or cleanup, "missing hooks in plugin"
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   208
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   209
        # Export plugin's instance methods to plugin namespace
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   210
        for attr in self.special_functions:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   211
            plugin.__dict__[attr] = getattr(self, attr)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   212
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   213
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   214
    def __repr__(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   215
        return u'<plugin(%r)>' % self.plugin
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   216
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   217
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   218
    def export(self, uzbl, attr, object, prepend=True):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   219
        '''Attach `object` to `uzbl` instance. This is the preferred method
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   220
        of sharing functionality, functions, data and objects between
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   221
        plugins.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   222
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   223
        If the object is callable you may wish to turn the callable object
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   224
        in to a meta-instance-method by prepending `uzbl` to the call stack.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   225
        You can change this behaviour with the `prepend` argument.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   226
        '''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   227
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   228
        assert attr not in uzbl.exports, "attr %r already exported by %r" %\
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   229
            (attr, uzbl.exports[attr][0])
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   230
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   231
        prepend = True if prepend and callable(object) else False
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   232
        uzbl.__dict__[attr] = partial(object, uzbl) if prepend else object
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   233
        uzbl.exports[attr] = (self, object, prepend)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   234
        uzbl.logger.info('exported %r to %r by plugin %r, prepended %r'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   235
            % (object, 'uzbl.%s' % attr, self.name, prepend))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   236
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   237
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   238
    def export_dict(self, uzbl, exports):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   239
        for (attr, object) in exports.items():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   240
            self.export(uzbl, attr, object)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   241
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   242
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   243
    def find_handler(self, event, callback, args, kwargs):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   244
        '''Check if a handler with the identical callback and arguments
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   245
        exists and return it.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   246
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   247
        # Remove dead refs
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   248
        self.handlers -= set(filter(lambda ref: not ref(), self.handlers))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   249
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   250
        # Find existing identical handler
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   251
        for handler in [ref() for ref in self.handlers]:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   252
            if handler.event == event and handler.callback == callback \
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   253
              and handler.args == args and handler.kwargs == kwargs:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   254
                return handler
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   255
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   256
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   257
    def connect(self, uzbl, event, callback, *args, **kwargs):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   258
        '''Create an event handler object which handles `event` events.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   259
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   260
        Arguments passed to the connect function (`args` and `kwargs`) are
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   261
        stored in the handler object and merged with the event arguments
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   262
        come handler execution.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   263
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   264
        All handler functions must behave like a `uzbl` instance-method (that
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   265
        means `uzbl` is prepended to the callback call arguments).'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   266
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   267
        # Sanitise and check event name
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   268
        event = event.upper().strip()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   269
        assert event and ' ' not in event
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   270
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   271
        assert callable(callback), 'callback must be callable'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   272
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   273
        # Check if an identical handler already exists
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   274
        handler = self.find_handler(event, callback, args, kwargs)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   275
        if not handler:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   276
            # Create a new handler
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   277
            handler = EventHandler(self, event, callback, args, kwargs)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   278
            self.handlers.add(weakref.ref(handler))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   279
            self.logger.info('new %r' % handler)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   280
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   281
        uzbl.handlers[event].append(handler)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   282
        uzbl.logger.info('connected %r' % handler)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   283
        return handler
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   284
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   285
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   286
    def connect_dict(self, uzbl, connects):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   287
        for (event, callback) in connects.items():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   288
            self.connect(uzbl, event, callback)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   289
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   290
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   291
    def require(self, plugin):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   292
        '''Check that plugin with name `plugin` has been loaded. Use this to
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   293
        ensure that your plugins dependencies have been met.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   294
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   295
        assert plugin in self.parent.plugins, self.logger.critical(
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   296
            'plugin %r required by plugin %r' (plugin, self.name))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   297
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   298
    @classmethod
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   299
    def unquote(cls, s):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   300
        '''Removes quotation marks around strings if any and interprets
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   301
        \\-escape sequences using `string_escape`'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   302
        if s and s[0] == s[-1] and s[0] in ['"', "'"]:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   303
            s = s[1:-1]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   304
        return s.encode('utf-8').decode('string_escape').decode('utf-8')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   305
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   306
    _splitquoted = re.compile("( |\"(?:\\\\.|[^\"])*?\"|'(?:\\\\.|[^'])*?')")
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   307
    @classmethod
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   308
    def splitquoted(cls, text):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   309
        '''Splits string on whitespace while respecting quotations'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   310
        return [cls.unquote(p) for p in cls._splitquoted.split(text) if p.strip()]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   311
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   312
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   313
class Uzbl(object):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   314
    def __init__(self, parent, child_socket):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   315
        self.opts = opts
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   316
        self.parent = parent
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   317
        self.child_socket = child_socket
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   318
        self.time = time.time()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   319
        self.pid = None
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   320
        self.name = None
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   321
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   322
        # Flag if the instance has raised the INSTANCE_START event.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   323
        self.instance_start = False
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   324
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   325
        # Use name "unknown" until name is discovered.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   326
        self.logger = get_logger('uzbl-instance[]')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   327
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   328
        # Track plugin event handlers and exported functions.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   329
        self.exports = {}
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   330
        self.handlers = defaultdict(list)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   331
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   332
        # Internal vars
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   333
        self._depth = 0
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   334
        self._buffer = ''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   335
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   336
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   337
    def __repr__(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   338
        return '<uzbl(%s)>' % ', '.join([
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   339
            'pid=%s' % (self.pid if self.pid else "Unknown"),
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   340
            'name=%s' % ('%r' % self.name if self.name else "Unknown"),
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   341
            'uptime=%f' % (time.time()-self.time),
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   342
            '%d exports' % len(self.exports.keys()),
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   343
            '%d handlers' % sum([len(l) for l in self.handlers.values()])])
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   344
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   345
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   346
    def init_plugins(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   347
        '''Call the init and after hooks in all loaded plugins for this
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   348
        instance.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   349
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   350
        # Initialise each plugin with the current uzbl instance.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   351
        for plugin in self.parent.plugins.values():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   352
            if plugin.init:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   353
                self.logger.debug('calling %r plugin init hook' % plugin.name)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   354
                plugin.init(self)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   355
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   356
        # Allow plugins to use exported features of other plugins by calling an
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   357
        # optional `after` function in the plugins namespace.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   358
        for plugin in self.parent.plugins.values():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   359
            if plugin.after:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   360
                self.logger.debug('calling %r plugin after hook'%plugin.name)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   361
                plugin.after(self)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   362
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   363
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   364
    def send(self, msg):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   365
        '''Send a command to the uzbl instance via the child socket
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   366
        instance.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   367
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   368
        msg = msg.strip()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   369
        assert self.child_socket, "socket inactive"
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   370
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   371
        if opts.print_events:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   372
            print ascii(u'%s<-- %s' % ('  ' * self._depth, msg))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   373
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   374
        self.child_socket.send(ascii("%s\n" % msg))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   375
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   376
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   377
    def read(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   378
        '''Read data from the child socket and pass lines to the parse_msg
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   379
        function.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   380
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   381
        try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   382
            raw = unicode(self.child_socket.recv(8192), 'utf-8', 'ignore')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   383
            if not raw:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   384
                self.logger.debug('read null byte')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   385
                return self.close()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   386
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   387
        except:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   388
            self.logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   389
            return self.close()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   390
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   391
        lines = (self._buffer + raw).split('\n')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   392
        self._buffer = lines.pop()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   393
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   394
        for line in filter(None, map(unicode.strip, lines)):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   395
            try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   396
                self.parse_msg(line.strip())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   397
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   398
            except:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   399
                self.logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   400
                self.logger.error('erroneous event: %r' % line)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   401
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   402
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   403
    def parse_msg(self, line):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   404
        '''Parse an incoming message from a uzbl instance. Event strings
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   405
        will be parsed into `self.event(event, args)`.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   406
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   407
        # Split by spaces (and fill missing with nulls)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   408
        elems = (line.split(' ', 3) + ['',]*3)[:4]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   409
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   410
        # Ignore non-event messages.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   411
        if elems[0] != 'EVENT':
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   412
            logger.info('non-event message: %r' % line)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   413
            if opts.print_events:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   414
                print '--- %s' % ascii(line)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   415
            return
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   416
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   417
        # Check event string elements
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   418
        (name, event, args) = elems[1:]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   419
        assert name and event, 'event string missing elements'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   420
        if not self.name:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   421
            self.name = name
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   422
            self.logger = get_logger('uzbl-instance%s' % name)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   423
            self.logger.info('found instance name %r' % name)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   424
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   425
        assert self.name == name, 'instance name mismatch'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   426
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   427
        # Handle the event with the event handlers through the event method
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   428
        self.event(event, args)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   429
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   430
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   431
    def event(self, event, *args, **kargs):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   432
        '''Raise an event.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   433
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   434
        event = event.upper()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   435
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   436
        if not opts.daemon_mode and opts.print_events:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   437
            elems = [event,]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   438
            if args: elems.append(unicode(args))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   439
            if kargs: elems.append(unicode(kargs))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   440
            print ascii(u'%s--> %s' % ('  ' * self._depth, ' '.join(elems)))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   441
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   442
        if event == "INSTANCE_START" and args:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   443
            assert not self.instance_start, 'instance already started'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   444
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   445
            self.pid = int(args[0])
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   446
            self.logger.info('found instance pid %r' % self.pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   447
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   448
            self.init_plugins()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   449
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   450
        elif event == "INSTANCE_EXIT":
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   451
            self.logger.info('uzbl instance exit')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   452
            self.close()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   453
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   454
        if event not in self.handlers:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   455
            return
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   456
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   457
        for handler in self.handlers[event]:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   458
            self._depth += 1
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   459
            try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   460
                handler.call(self, *args, **kargs)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   461
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   462
            except:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   463
                self.logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   464
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   465
            self._depth -= 1
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   466
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   467
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   468
    def close_connection(self, child_socket):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   469
        '''Close child socket and delete the uzbl instance created for that
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   470
        child socket connection.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   471
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   472
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   473
    def close(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   474
        '''Close the client socket and call the plugin cleanup hooks.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   475
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   476
        self.logger.debug('called close method')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   477
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   478
        # Remove self from parent uzbls dict.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   479
        if self.child_socket in self.parent.uzbls:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   480
            self.logger.debug('removing self from uzbls list')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   481
            del self.parent.uzbls[self.child_socket]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   482
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   483
        try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   484
            if self.child_socket:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   485
                self.logger.debug('closing child socket')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   486
                self.child_socket.close()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   487
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   488
        except:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   489
            self.logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   490
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   491
        finally:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   492
            self.child_socket = None
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   493
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   494
        # Call plugins cleanup hooks.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   495
        for plugin in self.parent.plugins.values():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   496
            if plugin.cleanup:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   497
                self.logger.debug('calling %r plugin cleanup hook'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   498
                    % plugin.name)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   499
                plugin.cleanup(self)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   500
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   501
        logger.info('removed %r' % self)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   502
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   503
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   504
class UzblEventDaemon(object):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   505
    def __init__(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   506
        self.opts = opts
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   507
        self.server_socket = None
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   508
        self._quit = False
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   509
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   510
        # Hold uzbl instances
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   511
        # {child socket: Uzbl instance, ..}
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   512
        self.uzbls = {}
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   513
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   514
        # Hold plugins
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   515
        # {plugin name: Plugin instance, ..}
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   516
        self.plugins = {}
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   517
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   518
        # Register that the event daemon server has started by creating the
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   519
        # pid file.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   520
        make_pid_file(opts.pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   521
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   522
        # Register a function to clean up the socket and pid file on exit.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   523
        atexit.register(self.quit)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   524
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   525
        # Add signal handlers.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   526
        for sigint in [SIGTERM, SIGINT]:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   527
            signal(sigint, self.quit)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   528
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   529
        # Load plugins into self.plugins
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   530
        self.load_plugins(opts.plugins)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   531
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   532
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   533
    def load_plugins(self, plugins):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   534
        '''Load event manager plugins.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   535
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   536
        for path in plugins:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   537
            logger.debug('loading plugin %r' % path)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   538
            (dir, file) = os.path.split(path)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   539
            name = file[:-3] if file.lower().endswith('.py') else file
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   540
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   541
            info = imp.find_module(name, [dir,])
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   542
            module = imp.load_module(name, *info)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   543
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   544
            # Check if the plugin has a callable hook.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   545
            hooks = filter(callable, [getattr(module, attr, None) \
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   546
                for attr in ['init', 'after', 'cleanup']])
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   547
            assert hooks, "no hooks in plugin %r" % module
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   548
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   549
            logger.debug('creating plugin instance for %r plugin' % name)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   550
            plugin = Plugin(self, name, path, module)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   551
            self.plugins[name] = plugin
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   552
            logger.info('new %r' % plugin)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   553
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   554
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   555
    def create_server_socket(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   556
        '''Create the event manager daemon socket for uzbl instance duplex
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   557
        communication.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   558
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   559
        # Close old socket.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   560
        self.close_server_socket()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   561
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   562
        sock = socket(AF_UNIX, SOCK_STREAM)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   563
        sock.bind(opts.server_socket)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   564
        sock.listen(5)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   565
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   566
        self.server_socket = sock
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   567
        logger.debug('bound server socket to %r' % opts.server_socket)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   568
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   569
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   570
    def run(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   571
        '''Main event daemon loop.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   572
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   573
        logger.debug('entering main loop')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   574
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   575
        # Create and listen on the server socket
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   576
        self.create_server_socket()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   577
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   578
        if opts.daemon_mode:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   579
            # Daemonize the process
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   580
            daemonize()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   581
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   582
            # Update the pid file
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   583
            make_pid_file(opts.pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   584
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   585
        try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   586
            # Accept incoming connections and listen for incoming data
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   587
            self.listen()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   588
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   589
        except:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   590
            if not self._quit:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   591
                logger.critical(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   592
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   593
        # Clean up and exit
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   594
        self.quit()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   595
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   596
        logger.debug('exiting main loop')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   597
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   598
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   599
    def listen(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   600
        '''Accept incoming connections and constantly poll instance sockets
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   601
        for incoming data.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   602
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   603
        logger.info('listening on %r' % opts.server_socket)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   604
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   605
        # Count accepted connections
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   606
        connections = 0
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   607
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   608
        while (self.uzbls or not connections) or (not opts.auto_close):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   609
            socks = [self.server_socket] + self.uzbls.keys()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   610
            reads, _, errors = select(socks, [], socks, 1)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   611
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   612
            if self.server_socket in reads:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   613
                reads.remove(self.server_socket)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   614
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   615
                # Accept connection and create uzbl instance.
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   616
                child_socket = self.server_socket.accept()[0]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   617
                self.uzbls[child_socket] = Uzbl(self, child_socket)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   618
                connections += 1
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   619
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   620
            for uzbl in [self.uzbls[s] for s in reads]:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   621
                uzbl.read()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   622
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   623
            for uzbl in [self.uzbls[s] for s in errors]:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   624
                uzbl.logger.error('socket read error')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   625
                uzbl.close()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   626
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   627
        logger.info('auto closing')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   628
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   629
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   630
    def close_server_socket(self):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   631
        '''Close and delete the server socket.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   632
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   633
        try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   634
            if self.server_socket:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   635
                logger.debug('closing server socket')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   636
                self.server_socket.close()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   637
                self.server_socket = None
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   638
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   639
            if os.path.exists(opts.server_socket):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   640
                logger.info('unlinking %r' % opts.server_socket)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   641
                os.unlink(opts.server_socket)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   642
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   643
        except:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   644
            logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   645
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   646
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   647
    def quit(self, sigint=None, *args):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   648
        '''Close all instance socket objects, server socket and delete the
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   649
        pid file.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   650
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   651
        if sigint == SIGTERM:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   652
            logger.critical('caught SIGTERM, exiting')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   653
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   654
        elif sigint == SIGINT:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   655
            logger.critical('caught SIGINT, exiting')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   656
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   657
        elif not self._quit:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   658
            logger.debug('shutting down event manager')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   659
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   660
        self.close_server_socket()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   661
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   662
        for uzbl in self.uzbls.values():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   663
            uzbl.close()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   664
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   665
        del_pid_file(opts.pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   666
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   667
        if not self._quit:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   668
            logger.info('event manager shut down')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   669
            self._quit = True
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   670
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   671
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   672
def make_pid_file(pid_file):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   673
    '''Creates a pid file at `pid_file`, fails silently.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   674
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   675
    try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   676
        logger.debug('creating pid file %r' % pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   677
        make_dirs(pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   678
        pid = os.getpid()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   679
        fileobj = open(pid_file, 'w')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   680
        fileobj.write('%d' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   681
        fileobj.close()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   682
        logger.info('created pid file %r with pid %d' % (pid_file, pid))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   683
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   684
    except:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   685
        logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   686
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   687
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   688
def del_pid_file(pid_file):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   689
    '''Deletes a pid file at `pid_file`, fails silently.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   690
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   691
    if os.path.isfile(pid_file):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   692
        try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   693
            logger.debug('deleting pid file %r' % pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   694
            os.remove(pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   695
            logger.info('deleted pid file %r' % pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   696
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   697
        except:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   698
            logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   699
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   700
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   701
def get_pid(pid_file):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   702
    '''Reads a pid from pid file `pid_file`, fails None.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   703
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   704
    try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   705
        logger.debug('reading pid file %r' % pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   706
        fileobj = open(pid_file, 'r')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   707
        pid = int(fileobj.read())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   708
        fileobj.close()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   709
        logger.info('read pid %d from pid file %r' % (pid, pid_file))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   710
        return pid
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   711
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   712
    except (IOError, ValueError):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   713
        logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   714
        return None
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   715
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   716
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   717
def pid_running(pid):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   718
    '''Checks if a process with a pid `pid` is running.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   719
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   720
    try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   721
        os.kill(pid, 0)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   722
    except OSError:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   723
        return False
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   724
    else:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   725
        return True
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   726
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   727
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   728
def term_process(pid):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   729
    '''Asks nicely then forces process with pid `pid` to exit.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   730
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   731
    try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   732
        logger.info('sending SIGTERM to process with pid %r' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   733
        os.kill(pid, SIGTERM)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   734
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   735
    except OSError:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   736
        logger.error(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   737
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   738
    logger.debug('waiting for process with pid %r to exit' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   739
    start = time.time()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   740
    while True:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   741
        if not pid_running(pid):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   742
            logger.debug('process with pid %d exit' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   743
            return True
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   744
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   745
        if (time.time()-start) > 5:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   746
            logger.warning('process with pid %d failed to exit' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   747
            logger.info('sending SIGKILL to process with pid %d' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   748
            try:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   749
                os.kill(pid, SIGKILL)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   750
            except:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   751
                logger.critical(get_exc())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   752
                raise
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   753
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   754
        if (time.time()-start) > 10:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   755
            logger.critical('unable to kill process with pid %d' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   756
            raise OSError
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   757
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   758
        time.sleep(0.25)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   759
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   760
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   761
def stop_action():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   762
    '''Stop the event manager daemon.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   763
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   764
    pid_file = opts.pid_file
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   765
    if not os.path.isfile(pid_file):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   766
        logger.error('could not find running event manager with pid file %r'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   767
            % opts.pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   768
        return
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   769
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   770
    pid = get_pid(pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   771
    if not pid_running(pid):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   772
        logger.debug('no process with pid %r' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   773
        del_pid_file(pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   774
        return
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   775
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   776
    logger.debug('terminating process with pid %r' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   777
    term_process(pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   778
    del_pid_file(pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   779
    logger.info('stopped event manager process with pid %d' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   780
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   781
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   782
def start_action():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   783
    '''Start the event manager daemon.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   784
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   785
    pid_file = opts.pid_file
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   786
    if os.path.isfile(pid_file):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   787
        pid = get_pid(pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   788
        if pid_running(pid):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   789
            logger.error('event manager already started with pid %d' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   790
            return
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   791
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   792
        logger.info('no process with pid %d' % pid)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   793
        del_pid_file(pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   794
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   795
    UzblEventDaemon().run()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   796
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   797
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   798
def restart_action():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   799
    '''Restart the event manager daemon.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   800
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   801
    stop_action()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   802
    start_action()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   803
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   804
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   805
def list_action():
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   806
    '''List all the plugins that would be loaded in the current search
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   807
    dirs.'''
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   808
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   809
    names = {}
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   810
    for plugin in opts.plugins:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   811
        (head, tail) = os.path.split(plugin)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   812
        if tail not in names:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   813
            names[tail] = plugin
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   814
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   815
    for plugin in sorted(names.values()):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   816
        print plugin
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   817
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   818
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   819
if __name__ == "__main__":
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   820
    parser = OptionParser('usage: %prog [options] {start|stop|restart|list}')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   821
    add = parser.add_option
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   822
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   823
    add('-v', '--verbose',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   824
        dest='verbose', default=2, action='count',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   825
        help='increase verbosity')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   826
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   827
    add('-d', '--plugin-dir',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   828
        dest='plugin_dirs', action='append', metavar="DIR", default=[],
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   829
        help='add extra plugin search dir, same as `-l "DIR/*.py"`')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   830
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   831
    add('-l', '--load-plugin',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   832
        dest='load_plugins', action='append', metavar="PLUGIN", default=[],
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   833
        help='load plugin, loads before plugins in search dirs')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   834
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   835
    socket_location = os.path.join(CACHE_DIR, 'event_daemon')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   836
    add('-s', '--server-socket',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   837
        dest='server_socket', metavar="SOCKET", default=socket_location,
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   838
        help='server AF_UNIX socket location')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   839
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   840
    add('-p', '--pid-file',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   841
        metavar="FILE", dest='pid_file',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   842
        help='pid file location, defaults to server socket + .pid')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   843
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   844
    add('-n', '--no-daemon',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   845
        dest='daemon_mode', action='store_false', default=True,
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   846
        help='do not daemonize the process')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   847
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   848
    add('-a', '--auto-close',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   849
        dest='auto_close', action='store_true', default=False,
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   850
        help='auto close after all instances disconnect')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   851
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   852
    add('-i', '--no-default-dirs',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   853
        dest='default_dirs', action='store_false', default=True,
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   854
        help='ignore the default plugin search dirs')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   855
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   856
    add('-o', '--log-file',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   857
        dest='log_file', metavar='FILE',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   858
        help='write logging output to a file, defaults to server socket +'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   859
        ' .log')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   860
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   861
    add('-q', '--quiet-events',
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   862
        dest='print_events', action="store_false", default=True,
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   863
        help="silence the printing of events to stdout")
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   864
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   865
    (opts, args) = parser.parse_args()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   866
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   867
    opts.server_socket = expandpath(opts.server_socket)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   868
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   869
    # Set default pid file location
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   870
    if not opts.pid_file:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   871
        opts.pid_file = "%s.pid" % opts.server_socket
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   872
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   873
    else:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   874
        opts.pid_file = expandpath(opts.pid_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   875
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   876
    # Set default log file location
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   877
    if not opts.log_file:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   878
        opts.log_file = "%s.log" % opts.server_socket
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   879
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   880
    else:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   881
        opts.log_file = expandpath(opts.log_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   882
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   883
    # Logging setup
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   884
    log_level = logging.CRITICAL - opts.verbose*10
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   885
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   886
    # Console logging handler
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   887
    ch = logging.StreamHandler()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   888
    ch.setLevel(max(log_level+10, 10))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   889
    ch.setFormatter(logging.Formatter(
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   890
        '%(name)s: %(levelname)s: %(message)s'))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   891
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   892
    # File logging handler
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   893
    fh = logging.FileHandler(opts.log_file, 'w', 'utf-8', 1)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   894
    fh.setLevel(max(log_level, 10))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   895
    fh.setFormatter(logging.Formatter(
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   896
        '[%(created)f] %(name)s: %(levelname)s: %(message)s'))
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   897
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   898
    # logging.getLogger wrapper which sets the levels and adds the
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   899
    # file and console handlers automagically
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   900
    def get_logger(name):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   901
        handlers = [ch, fh]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   902
        level = [max(log_level, 10),]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   903
        logger = logging.getLogger(name)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   904
        logger.setLevel(level[0])
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   905
        for handler in handlers:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   906
            logger.addHandler(handler)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   907
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   908
        return logger
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   909
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   910
    # Get main logger
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   911
    logger = get_logger(SCRIPTNAME)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   912
    logger.info('logging to %r' % opts.log_file)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   913
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   914
    plugins = {}
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   915
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   916
    # Load all `opts.load_plugins` into the plugins list
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   917
    for path in opts.load_plugins:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   918
        path = expandpath(path)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   919
        matches = glob(path)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   920
        if not matches:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   921
            parser.error('cannot find plugin(s): %r' % path)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   922
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   923
        for plugin in matches:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   924
            (head, tail) = os.path.split(plugin)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   925
            if tail not in plugins:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   926
                logger.debug('found plugin: %r' % plugin)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   927
                plugins[tail] = plugin
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   928
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   929
            else:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   930
                logger.debug('ignoring plugin: %r' % plugin)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   931
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   932
    # Add default plugin locations
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   933
    if opts.default_dirs:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   934
        logger.debug('adding default plugin dirs to plugin dirs list')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   935
        opts.plugin_dirs += [os.path.join(DATA_DIR, 'plugins/'),
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   936
            os.path.join(PREFIX, 'share/uzbl/examples/data/plugins/')]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   937
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   938
    else:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   939
        logger.debug('ignoring default plugin dirs')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   940
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   941
    # Load all plugins in `opts.plugin_dirs` into the plugins list
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   942
    for dir in opts.plugin_dirs:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   943
        dir = expandpath(dir)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   944
        logger.debug('searching plugin dir: %r' % dir)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   945
        for plugin in glob(os.path.join(dir, '*.py')):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   946
            (head, tail) = os.path.split(plugin)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   947
            if tail not in plugins:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   948
                logger.debug('found plugin: %r' % plugin)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   949
                plugins[tail] = plugin
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   950
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   951
            else:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   952
                logger.debug('ignoring plugin: %r' % plugin)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   953
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   954
    plugins = plugins.values()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   955
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   956
    # Check all the paths in the plugins list are files
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   957
    for plugin in plugins:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   958
        if not os.path.isfile(plugin):
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   959
            parser.error('plugin not a file: %r' % plugin)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   960
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   961
    if opts.auto_close: logger.debug('will auto close')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   962
    else: logger.debug('will not auto close')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   963
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   964
    if opts.daemon_mode: logger.debug('will daemonize')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   965
    else: logger.debug('will not daemonize')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   966
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   967
    opts.plugins = plugins
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   968
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   969
    # init like {start|stop|..} daemon actions
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   970
    daemon_actions = {'start': start_action, 'stop': stop_action,
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   971
        'restart': restart_action, 'list': list_action}
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   972
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   973
    if len(args) == 1:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   974
        action = args[0]
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   975
        if action not in daemon_actions:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   976
            parser.error('invalid action: %r' % action)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   977
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   978
    elif not args:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   979
        logger.warning('no daemon action given, assuming %r' % 'start')
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   980
        action = 'start'
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   981
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   982
    else:
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   983
        parser.error('invalid action argument: %r' % args)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   984
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   985
    logger.info('daemon action %r' % action)
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   986
    # Do action
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   987
    daemon_actions[action]()
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   988
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   989
    logger.debug('process CPU time: %f' % time.clock())
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   990
48db03aa2650 Added uzbl source code
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   991
# vi: set et ts=4: