pvl/syslog/fifo.py
author Tero Marttila <terom@paivola.fi>
Sun, 13 Jan 2013 03:11:25 +0200
changeset 125 9925ef5258f1
parent 122 f742c866c765
child 138 e10e473902cb
permissions -rw-r--r--
pvl.syslog.fifo: refactor read
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Non-blocking fifo reads.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
import os
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import errno
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
     7
import fcntl
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import logging
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
77
05d6cfa9efac fix pvl.verkko-dhcp + pvl.syslog.fifo
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
    11
log = logging.getLogger('pvl.syslog.fifo')
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    13
class Pipe (object) :
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
    """
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    15
        A pipe from a fd.
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
        Supports reading lines in a non-blocking fashion.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    20
    @classmethod
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    21
    def file (cls, file) :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    22
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    23
            Create Pipe from file, e.g. sys.stdin.
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    25
            Puts fd into nonblocking mode, which means that the given file will stop working!
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    26
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    27
        
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    28
        fd = file.fileno()
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    30
        log.debug("%s: %s", file, fd)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    31
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    32
        fl = fcntl.fcntl(fd, fcntl.F_GETFL)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    33
        fl |= os.O_NONBLOCK
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    34
        fcntl.fcntl(fd, fcntl.F_SETFL, fl)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    35
        
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    36
        return cls(fd)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    37
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    38
    def __init__ (self, fd) :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    39
        self._fd = fd
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    40
        self._buf = ''
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    41
        
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    42
        log.debug("pipe: %d", fd)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    43
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    44
    def fileno (self) :
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            Fetch the internal fd, failing if we are not open..
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        if self._fd is None :
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    50
            raise ValueError("I/O operation on closed pipe: %s" % (self, ))
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
        else :
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    52
            return self._fd
125
9925ef5258f1 pvl.syslog.fifo: refactor read
Tero Marttila <terom@paivola.fi>
parents: 122
diff changeset
    53
    
9925ef5258f1 pvl.syslog.fifo: refactor read
Tero Marttila <terom@paivola.fi>
parents: 122
diff changeset
    54
    # XXX: this is almost identical to pvl.socket.ReadStream
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    def read (self, n=512) :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
            Read up to n bytes.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
            
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
            Returns None if we would block.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
            Raises EOFError on EOF.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        try :
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    64
            buf = os.read(self.fileno(), n)
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
        except OSError as ex :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
            # block?
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
            if ex.errno == errno.EAGAIN :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
                # empty
125
9925ef5258f1 pvl.syslog.fifo: refactor read
Tero Marttila <terom@paivola.fi>
parents: 122
diff changeset
    70
                buf = None
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
            else :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
                raise
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
125
9925ef5258f1 pvl.syslog.fifo: refactor read
Tero Marttila <terom@paivola.fi>
parents: 122
diff changeset
    75
        log.debug("%s: %s", self, buf)
9925ef5258f1 pvl.syslog.fifo: refactor read
Tero Marttila <terom@paivola.fi>
parents: 122
diff changeset
    76
9925ef5258f1 pvl.syslog.fifo: refactor read
Tero Marttila <terom@paivola.fi>
parents: 122
diff changeset
    77
        if buf is None :
9925ef5258f1 pvl.syslog.fifo: refactor read
Tero Marttila <terom@paivola.fi>
parents: 122
diff changeset
    78
            return None
9925ef5258f1 pvl.syslog.fifo: refactor read
Tero Marttila <terom@paivola.fi>
parents: 122
diff changeset
    79
        elif buf :
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    80
            return buf
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
    81
        else :
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
            raise EOFError()
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    def readline (self) :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
            Read and return next waiting line from input.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
            Line is returned without trailing '\n'.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
            Returns None if there is no line available.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
            Raises EOFError if the fifo write end was closed.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        while '\n' not in self._buf :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
            # read chunk
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
            read = self.read()
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
            if read is None :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
                return None
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
            
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
            self._buf += read
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
        
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        # split out one line
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
        line, self._buf = self._buf.split('\n', 1)
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   106
        log.debug("%s", line)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   107
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        return line
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
    def readlines (self) :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
            Read any available input, yielding lines.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
            
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
            Re-opens the FIFO on EOF.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
            Returns None if there was no more input available, or the fifo was re-opened after EOF.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
        while True :
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   120
            # pull line
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   121
            line = self.readline()
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   123
            if line :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   124
                yield line
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   125
            else :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   126
                return # block
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   127
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   128
    __iter__ = readlines
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   129
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   130
    def __str__ (self) :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   131
        return "pipe:{self._fd}".format(self=self)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   132
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   133
class Fifo (Pipe) :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   134
    """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   135
        A named pipe(7) on the filesystem.
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   136
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   137
        Supports reading lines in a non-blocking fashion, and re-opening on EOF.
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   138
    """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   139
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   140
    def __init__ (self, path) :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   141
        self.path = path
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   142
        Pipe.__init__(self, self._open())
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   143
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   144
    def _open (self) :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   145
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   146
            Open the internal fd (nonblocking).
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   147
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   148
        
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   149
        fd = os.open(self.path, os.O_RDONLY | os.O_NONBLOCK)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   150
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   151
        log.debug("%s: open: %s", self, fd)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   152
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   153
        return fd
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   154
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   155
    def _close (self, fd) :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   156
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   157
            Close.
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   158
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   159
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   160
        os.close(fd)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   161
    
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   162
    def _reopen (self) :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   163
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   164
            Re-open the FIFO in case the writing end was closed, and read gave EOF.
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   165
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   166
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   167
        self._close(self._fd)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   168
        self._fd = None
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   169
        self._fd = self._open()
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   170
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   171
    def readlines (self) :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   172
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   173
            Read any available input, yielding lines.
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   174
            
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   175
            Re-opens the FIFO on EOF.
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   176
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   177
            Returns None if there was no more input available, or the fifo was re-opened after EOF.
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   178
        """
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   179
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   180
        while True :
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
            try :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
                # pull line
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
                line = self.readline()
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
            except EOFError :
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   186
                log.debug("%s: EOF: reopen", self)
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
                # reopen and go back to waiting
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
                self._reopen()
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
                return
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
            
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
            if line is None :
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   194
                log.debug("%s: EOF: wait", self)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   195
                return # wait
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   196
            else :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   197
                yield line
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   198
    
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
    __iter__ = readlines
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
    def close (self) :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
            Close the fifo.
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   206
        self._close(self.fileno())
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   207
        self._fd = None
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
    def __del__ (self) :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
            Cleanup
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
        """
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
122
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   214
        if self._fd is not None :
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   215
            self._close(self._fd)
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   216
            self._fd = None
f742c866c765 pvl.syslog.fifo: separate Pipe/Fifo
Tero Marttila <terom@paivola.fi>
parents: 77
diff changeset
   217