pvl/irk.py
author Tero Marttila <terom@paivola.fi>
Fri, 11 Jan 2013 17:32:35 +0200
changeset 83 1cb48f2ba1e9
parent 80 231d3de7081a
child 111 4b96c153c113
permissions -rw-r--r--
pvl.irker/irk: implement support for NOTICE
80
231d3de7081a pvl.verkko-syslog: renamed pvl.irk
Tero Marttila <terom@paivola.fi>
parents: 79
diff changeset
     1
"""
231d3de7081a pvl.verkko-syslog: renamed pvl.irk
Tero Marttila <terom@paivola.fi>
parents: 79
diff changeset
     2
    Irker client.
231d3de7081a pvl.verkko-syslog: renamed pvl.irk
Tero Marttila <terom@paivola.fi>
parents: 79
diff changeset
     3
"""
231d3de7081a pvl.verkko-syslog: renamed pvl.irk
Tero Marttila <terom@paivola.fi>
parents: 79
diff changeset
     4
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
import optparse, sys
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
80
231d3de7081a pvl.verkko-syslog: renamed pvl.irk
Tero Marttila <terom@paivola.fi>
parents: 79
diff changeset
     7
import logging; log = logging.getLogger('pvl.irk')
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
# proto
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
import socket, json
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
def parser (parser, connect='tcp://localhost/', target=None) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
        Optparse option group.
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    irker = optparse.OptionGroup(parser, 'Irker output')
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    
72
7bb07131c2b5 pvl.irker: drop --irker-target arg
Tero Marttila <terom@paivola.fi>
parents: 71
diff changeset
    19
    irker.add_option('--irker', metavar='URL',  default=connect,
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
            help="Irker daemon URL")
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
    22
    irker.add_option('--irker-notice',          action='store_true',
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
    23
            help="Use irker NOTICE")
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
    24
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    return irker
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
72
7bb07131c2b5 pvl.irker: drop --irker-target arg
Tero Marttila <terom@paivola.fi>
parents: 71
diff changeset
    27
def apply (options) :
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        Return Irker (XXX: target) from options.
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
    
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    32
    # None -> stdout
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
    33
    return Irker(options.irker, options.irker_notice)
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
def connect (host=None, port=None, family=socket.AF_UNSPEC, socktype=socket.SOCK_STREAM) :
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    36
    """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    37
        Return a TCP/UDP socket connected to the given host/port using getaddrinfo.
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    38
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    39
        TODO: timeout?
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    40
    """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    41
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    42
    log.debug("%s:%s: %s/%s", host, port, family, socktype)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    43
    
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    44
    if host :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    45
        flags = socket.AI_CANONNAME
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    46
    else :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    47
        flags = 0
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    48
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    49
    addrinfo = socket.getaddrinfo(host, port, family, socktype, 0, flags)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    50
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    51
    if not addrinfo :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    52
        raise Exception("getaddrinfo: %s:%s: no results" % (host, port))
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    53
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    54
    for af, st, proto, name, addr in addrinfo :
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        try :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
            s = socket.socket(af, st, proto)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        except socket.error as error :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
            log.warning("%s:%s: socket: %s", host, port, error)
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    60
            continue
48
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
        try :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
            s.connect(addr)
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
        except socket.error as error :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
            log.warning("%s:%s: connect: %s", host, port, error)
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    67
            continue
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    68
        
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    69
        log.info("%s", name)
48
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
        return s
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    else :
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    74
        raise Exception("Unable to connect: %s:%s: %s" % (host, port, error))
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    75
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    76
import urlparse
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
class Irk (object) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    """
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    80
        Irker JSON connection.
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    81
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    82
        TODO: timeout?
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    PORT = 6659
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
    SCHEME = {
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        'tcp':  (socket.AF_INET, socket.SOCK_STREAM),
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        'udp':  (socket.AF_INET, socket.SOCK_DGRAM),
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
        'unix': (socket.AF_UNIX, socket.SOCK_DGRAM),
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
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    93
    @classmethod
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    94
    def connect (cls, url) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    95
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    96
            Connect to given urllib URL, or None -> stdout
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    97
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    98
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    99
        if not url :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   100
            return cls(sys.stdout)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   101
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   102
        family, socktype = cls.SCHEME[url.scheme]
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   103
        
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   104
        if family == socket.AF_UNIX :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   105
            raise Exception("unix:// is not supported")
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   106
        else :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   107
            # inet
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   108
            sock = connect(url.hostname, url.port or cls.PORT, family=family, socktype=socktype)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   109
        
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   110
        return cls(sock.makefile('w'))
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   111
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   112
    def __init__ (self, file) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   113
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   114
            Use given file-like object for output.
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   115
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   116
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   117
        self.file = file
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   118
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   119
        log.debug("%s", file)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   120
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   121
    def send (self, **opts) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   122
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   123
            Raises IOError on write errors.
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   124
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   125
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   126
        log.debug("%s", opts)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   127
        
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   128
        # write line + flush
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   129
        json.dump(opts, self.file)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   130
        self.file.write('\n')
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   131
        self.file.flush()
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   132
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   133
class IrkerTarget (object) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   134
    """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   135
        A channel on an Irk connection.
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   136
    """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   137
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   138
    def __init__ (self, irker, target, notice=False) :
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   139
        self.irker = irker
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   140
        self.target = target
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   141
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   142
        self._notice = notice
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   143
        
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   144
    def join (self) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   145
        log.info("%s", self)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   146
        self.irker.send(to=str(self), privmsg='')
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   147
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   148
    def privmsg (self, *args) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   149
        for arg in args :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   150
            log.info("%s: %s", self, arg)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   151
            self.irker.send(to=str(self), privmsg=arg)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   152
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   153
    def notice (self, *args) :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   154
        for arg in args :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   155
            log.info("%s: %s", self, arg)
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   156
            self.irker.send(to=str(self), notice=arg)
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   157
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   158
    def __call__ (self, *args) :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   159
        # default msg policy
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   160
        if self._notice :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   161
            return self.notice(*args)
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   162
        else :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   163
            return self.privmsg(*args)
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   164
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   165
    def __str__ (self) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   166
        return self.target
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   167
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   168
class Irker (object) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   169
    """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   170
        Reconnecting irker.
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   171
    """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   172
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   173
    def __init__ (self, url=None, notice=False) :
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
        if url :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
            self.url = urlparse.urlparse(url)
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        else :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
            self.url = None
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
        self.targets = {}
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   180
        self.notice = notice
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
        
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   182
        self.connect()
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
    
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
    def connect (self) :
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   185
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   186
            Connect, and fix up our targets.
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   187
        """
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   189
        self.irk = Irk.connect(self.url)
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
        # rejoin
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   192
        for target in self.targets.itervalues() :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   193
            target.join()
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
    
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   195
    def send (self, **opts) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   196
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   197
            Send on current irker connection.
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   199
            TODO: handle errors and reconnect?
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   200
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   201
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   202
        self.irk.send(**opts)
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    def target (self, target) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
        """
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   206
            Bind to given target URL, returning an IrkerTarget for sending messages.
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
        """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   209
        if target not in self.targets :
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   210
            self.targets[target] = IrkerTarget(self, target, notice=self.notice)
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   211
            self.targets[target].join()
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   212
            
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   213
        return self.targets[target]
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   215
    __getitem__ = target