pvl/irker.py
author Tero Marttila <terom@fixme.fi>
Sat, 05 Jan 2013 01:36:30 +0200
changeset 71 11b267e1b2b0
parent 48 40ccb8d3c96e
child 72 7bb07131c2b5
permissions -rw-r--r--
pvl.irker: log.info on output
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
import optparse, sys
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
import logging; log = logging.getLogger('pvl.irker')
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
# proto
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
import socket, json
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
def parser (parser, connect='tcp://localhost/', target=None) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
        Optparse option group.
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    irker = optparse.OptionGroup(parser, 'Irker output')
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    irker.add_option('--irker-connect', metavar='URL',  default=connect,
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
            help="Irker daemon URL")
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    irker.add_option('--irker-target', metavar='IRC',   default=target,
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
            help="Irker target URL")
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    return irker
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
def apply (options, target=None) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        Return Irker (XXX: target) from options.
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    # XXX: None -> stdout
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    irk = Irker(options.irker_connect)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    if options.irker_target :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        target = options.irker_target
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    if target :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        target = irk.target(target)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    return irk, target
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
def connect (host=None, port=None, family=socket.AF_UNSPEC, socktype=socket.SOCK_STREAM) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    for af, st, proto, name, addr in socket.getaddrinfo(host, port, family, socktype) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        try :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
            s = socket.socket(af, st, proto)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        except socket.error as error :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
            log.warning("%s:%s: socket: %s", host, port, error)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        log.info("%s", name)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        try :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
            s.connect(addr)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        except socket.error as error :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
            log.warning("%s:%s: connect: %s", host, port, error)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        return s
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    else :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        raise Exception("Unable to connect: %s:%s" % (host, port))
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
class Irk (object) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        Irker connection.
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    PORT = 6659
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    @classmethod
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    def socket (cls, socket) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        return cls(socket.makefile('w'))
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    def __init__ (self, file) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        self.file = file
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        log.debug("%s", file)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    def send (self, **opts) :
71
11b267e1b2b0 pvl.irker: log.info on output
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    77
        log.debug("%s", opts)
11b267e1b2b0 pvl.irker: log.info on output
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    78
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        json.dump(opts, self.file)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
        self.file.write('\n')
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        self.file.flush()
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    def join (self, to) :
71
11b267e1b2b0 pvl.irker: log.info on output
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    84
        log.info("%s", to)
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        self.send(to=to, privmsg='')
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    def privmsg (self, to, *args) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        for arg in args :
71
11b267e1b2b0 pvl.irker: log.info on output
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    89
            log.info("%s: %s", to, arg)
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
            self.send(to=to, privmsg=arg)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
import urlparse
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
import functools
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
class Irker (object) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        Reconnecting irker.
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        XXX: reconnect with state, or just crash and burn to be restarted?
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    SCHEME = {
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        'tcp':  (socket.AF_INET, socket.SOCK_STREAM),
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        'udp':  (socket.AF_INET, socket.SOCK_DGRAM),
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        'unix': (socket.AF_UNIX, socket.SOCK_DGRAM),
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    }
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
    def __init__ (self, url=None) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        if url :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
            self.url = urlparse.urlparse(url)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
        else :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
            self.url = None
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        self.targets = {}
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
        
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        self.irk = self.connect()
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    def connect (self) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        if not self.url :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
            # XXX: not here, do this in apply()?
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
            return Irk(sys.stdout)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
        family, socktype = self.SCHEME[self.url.scheme]
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        if family == socket.AF_UNIX :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
            raise Exception("unix:// is not supported")
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        else :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
            # inet
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
            s = connect(self.url.hostname, self.url.port or Irk.PORT, family=family, socktype=socktype)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
        
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
        irk = Irk.socket(s)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        # rejoin
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        for target in self.targets :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
            irk.join(target)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
        return irk
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
    
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
    def _target (self, target, *args) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        try :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
            for msg in args :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
                self.irk.send(to=target, privmsg=msg)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        except IOError as ex :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
            log.warning("lost irk: %s", ex)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
            # XXX: reconnect?
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
            self.irk = self.connect()
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
    def target (self, target) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
            Bind to given target URL, returning a callable for sending messages.
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
        """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        if target in self.targets :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
            _target = self.targets[target]
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        else :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
            self.irk.join(target)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
            _target = self.targets[target] = functools.partial(self._target, target)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
        
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
        return _target
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162