pvl/irk.py
author Tero Marttila <terom@paivola.fi>
Sun, 20 Jan 2013 15:40:37 +0200
changeset 145 a72b6aca2619
parent 134 99a8987fc424
permissions -rw-r--r--
pvl.irk: raise IrkError if send EOF's
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
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
     5
import pvl.syslog.file # for stdin
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
     6
import pvl.socket # for tcp
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
     7
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
import optparse, sys
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
80
231d3de7081a pvl.verkko-syslog: renamed pvl.irk
Tero Marttila <terom@paivola.fi>
parents: 79
diff changeset
    10
import logging; log = logging.getLogger('pvl.irk')
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    12
import json
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    13
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
def parser (parser, connect='tcp://localhost/', target=None) :
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
        Optparse option group.
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
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    irker = optparse.OptionGroup(parser, 'Irker output')
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    
72
7bb07131c2b5 pvl.irker: drop --irker-target arg
Tero Marttila <terom@paivola.fi>
parents: 71
diff changeset
    21
    irker.add_option('--irker', metavar='URL',  default=connect,
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
            help="Irker daemon URL")
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
    24
    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
    25
            help="Use irker NOTICE")
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
    26
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
    27
    irker.add_option('--irker-part',            action='store_true',
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
    28
            help="Use irker PART")
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
    29
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    return irker
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
72
7bb07131c2b5 pvl.irker: drop --irker-target arg
Tero Marttila <terom@paivola.fi>
parents: 71
diff changeset
    32
def apply (options) :
48
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
        Return Irker (XXX: target) from options.
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    37
    # None -> stdout
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
    38
    return Irker(options.irker, options) # options.irker_*
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
145
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
    40
class IrkError (Exception) :
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
    41
    """
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
    42
        Irk write error.
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
    43
    """
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
    44
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
class Irk (object) :
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    """
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    47
        Irker JSON connection speaks JSON over a stream.
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    48
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    49
        TODO: timeouts?
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    """
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
    PORT = 6659
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    54
    @classmethod
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    55
    def connect (cls, url) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    56
        """
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    57
            Connect to given URL string, or None -> stdout
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    58
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    59
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    60
        if not url :
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    61
            # no read
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    62
            return cls(pvl.syslog.file.File(sys.stdout), recv=False)
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    63
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    64
        else :
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    65
            sock = pvl.socket.connect(url, port=cls.PORT)
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    66
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    67
            # just to make things a bit more exciting... and we really don't want to be blocking on our output..
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    68
            sock.setblocking(False)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    69
            
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    70
            return cls(
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    71
                    pvl.socket.WriteStream(sock, buffer=None),
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    72
                    pvl.socket.ReadStream(sock)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    73
            )
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    74
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    75
    def __init__ (self, send, recv=None) :
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    76
        """
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    77
            Use given file-like object (write, flush, fileno) for output.
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    78
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    79
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    80
        self.send = send
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    81
        self.recv = recv
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    82
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    83
        log.debug("%s <-> %s", send, recv)
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    84
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    85
    def fileno (self) :
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    86
        """
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    87
            Return fd. Useful for detecting error conditions (connection lost).
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    88
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    89
            Only valid if self.recv is True.
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    90
        """
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    91
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    92
        return self.recv.fileno()
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
    93
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
    94
    def __call__ (self, **opts) :
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
    95
        """
145
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
    96
            Send given json.
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
    97
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
    98
            Raises IrkError on write EOF.
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
    99
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   100
            XXX: Raises socket.error/IOError on write errors?
79
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
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   103
        log.debug("%s", opts)
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   104
        
145
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   105
        try :
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   106
            # write line + flush
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   107
            self.send(json.dumps(opts))
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   108
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   109
        except EOFError as ex :
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   110
            # XXX: also socket.error etc?
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   111
            raise IrkError("%s: send eof: %s" % (self, ex))
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   112
        
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   113
        # XXX: self.send.flush()
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   114
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   115
    def __iter__ (self) :
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   116
        """
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   117
            Yield JSON inputs from source.
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   118
        """
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   119
121
4f16bf6365f1 pvl.irker-syslog: fix not-polling on irk
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   120
        if not self.recv :
4f16bf6365f1 pvl.irker-syslog: fix not-polling on irk
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   121
            # never going to be anything
4f16bf6365f1 pvl.irker-syslog: fix not-polling on irk
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   122
            return
4f16bf6365f1 pvl.irker-syslog: fix not-polling on irk
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   123
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   124
        for line in self.recv :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   125
            # XXX: error handling?
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   126
            yield json.loads(line)
111
4b96c153c113 pvl.irk: crude support for reading lines from Irk
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   127
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   128
class IrkerTarget (object) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   129
    """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   130
        A channel on an Irk connection.
145
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   131
            
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   132
        Raises IrkError if irk(..) fails.
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   133
    """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   134
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   135
    def __init__ (self, irker, target, notice=None, part=None) :
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   136
        self.irker = irker
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   137
        self.target = target
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   138
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   139
        self._notice = notice
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   140
        self._part = part
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   141
        
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   142
    def join (self) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   143
        log.info("%s", self)
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   144
        self.irker(to=str(self), privmsg='')
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   145
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   146
    def privmsg (self, *args) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   147
        for arg in args :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   148
            log.info("%s: %s", self, arg)
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   149
            self.irker(to=str(self), privmsg=arg)
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   150
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   151
    def notice (self, *args) :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   152
        for arg in args :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   153
            log.info("%s: %s", self, arg)
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   154
            self.irker(to=str(self), notice=arg)
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   155
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   156
    def part (self, msg='') :
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   157
        log.info("%s: %s", self, msg)
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   158
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   159
        if self._part :
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   160
            self.irker(to=str(self), part=msg)
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   161
        else :
130
4f8c465706be pvl.irk: typofix
Tero Marttila <terom@paivola.fi>
parents: 128
diff changeset
   162
            log.warn("%s: no --irker-part", self)
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   163
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   164
    def __call__ (self, *args) :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   165
        # default msg policy
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   166
        if self._notice :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   167
            return self.notice(*args)
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   168
        else :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 80
diff changeset
   169
            return self.privmsg(*args)
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   170
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   171
    def __str__ (self) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   172
        return self.target
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   173
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   174
class Irker (object) :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   175
    """
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   176
        Reconnecting Irk.
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   177
    """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   178
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   179
    def __init__ (self, url=None, options=None) :
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   180
        """
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   181
            url         - irker to connect to
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   182
            options     - irker_* configs
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   183
        """
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   184
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   185
        self.url = url
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
        self.targets = {}
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   187
        self.options = options
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.connect()
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
    def connect (self) :
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   192
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   193
            Connect, and fix up our targets.
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   194
        """
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   196
        self.irk = Irk.connect(self.url)
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
        # rejoin
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   199
        for target in self.targets.itervalues() :
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   200
            target.join()
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
    
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   202
    def __call__ (self, **opts) :
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   203
        """
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   204
            Send on current irker connection.
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
145
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   206
            Raises IrkError if irk(..) fails.
a72b6aca2619 pvl.irk: raise IrkError if send EOF's
Tero Marttila <terom@paivola.fi>
parents: 134
diff changeset
   207
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   208
            TODO: handle errors and reconnect?
134
99a8987fc424 pvl.irk: Irker.target(..., join=...)
Tero Marttila <terom@paivola.fi>
parents: 130
diff changeset
   209
            """
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   210
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents: 111
diff changeset
   211
        self.irk(**opts)
48
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
134
99a8987fc424 pvl.irk: Irker.target(..., join=...)
Tero Marttila <terom@paivola.fi>
parents: 130
diff changeset
   213
    def target (self, target, join=True) :
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
            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
   216
        """
40ccb8d3c96e pvl.verkko-syslog: syslog -> irker gateway
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   218
        if target not in self.targets :
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   219
            self.targets[target] = IrkerTarget(self, target, 
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   220
                    notice  = self.options and self.options.irker_notice,
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   221
                    part    = self.options and self.options.irker_part,
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   222
            )
134
99a8987fc424 pvl.irk: Irker.target(..., join=...)
Tero Marttila <terom@paivola.fi>
parents: 130
diff changeset
   223
99a8987fc424 pvl.irk: Irker.target(..., join=...)
Tero Marttila <terom@paivola.fi>
parents: 130
diff changeset
   224
            if join :
99a8987fc424 pvl.irk: Irker.target(..., join=...)
Tero Marttila <terom@paivola.fi>
parents: 130
diff changeset
   225
                self.targets[target].join()
79
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   226
            
530c2aa73a97 pvl.irker: refactor
Tero Marttila <terom@paivola.fi>
parents: 72
diff changeset
   227
        return self.targets[target]
134
99a8987fc424 pvl.irk: Irker.target(..., join=...)
Tero Marttila <terom@paivola.fi>
parents: 130
diff changeset
   228
    
99a8987fc424 pvl.irk: Irker.target(..., join=...)
Tero Marttila <terom@paivola.fi>
parents: 130
diff changeset
   229
    __getitem__ = target
128
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   230
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   231
    def __delitem__ (self, target) :
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   232
        """
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   233
            Unbind given target URL.
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   234
        """
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   235
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   236
        target = self.targets.pop(target)
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   237
        target.part()
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   238
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   239
    def __iter__ (self) :
42d4bd708373 pvl.irk: implement optional --irker-part for targets
Tero Marttila <terom@paivola.fi>
parents: 121
diff changeset
   240
        return iter(self.targets)