pvl/dhcp/config.py
author Tero Marttila <terom@paivola.fi>
Sat, 26 Jul 2014 13:52:51 +0300
changeset 422 56ba4bef5016
parent 256 63b285ceae41
permissions -rw-r--r--
version: 0.7.0

* pvl.hosts: location = ... field
* pvl.hosts: support extension:foo = ... fields
* pvl.hosts: down = ...
* pvl.hosts-snmp: gather host links from snmp using lldp/fdb/vlan info
* pvl.hosts-graph: graph host links
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Simple parser for ISC dhcpd config files.
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
import logging; log = logging.getLogger('pvl.dhcp.config')
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
class DHCPConfigParser (object) :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
    """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
        Simplistic parser for a dhcpd.leases file.
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
        Doesn't implement the full spec, but a useful approximation.
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
    """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
    14
    @classmethod
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
    15
    def load (cls, file) :
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
    16
        return cls().parse_file(file)
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
    17
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    def __init__ (self) :
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
    19
        self.stack = []
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
        self.block = None
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
        self.items = []
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
    22
        self.blocks = []
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    @classmethod
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    def split (cls, line) :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
            Split given line-data.
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
            
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
    29
            >>> split = DHCPConfigParser.split
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
            >>> split('foo bar')
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
            ['foo', 'bar']
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
            >>> split('"foo"')
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
            ['foo']
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
            >>> split('foo "asdf quux" bar')
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
            ['foo', 'asdf quux', 'bar']
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
            >>> split('foo "asdf quux"')
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
            ['foo', 'asdf quux']
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        # parse out one str
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        if '"' in line :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
            log.debug("%s", line)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
            # crude
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
            pre, line = line.split('"', 1)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
            data, post = line.rsplit('"', 1)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
            return pre.split() + [data] + post.split()
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        else :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
            return line.split()
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    @classmethod
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
    def lex (self, line) :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
            Yield tokens from the given lines.
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
    57
            >>> lex = DHCPConfigParser.lex
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
            >>> list(lex('foo;'))
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
            [('item', ['foo'])]
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
            >>> list(item for line in ['foo {', ' bar;', '}'] for item in lex(line))
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
            [('open', ['foo']), ('item', ['bar']), ('close', None)]
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
        log.debug("%s", line)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        # comments?
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
        if '#' in line :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
            line, comment = line.split('#', 1)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        else :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
            comment = None
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        # clean?
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        line = line.strip()
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
        # parse
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        if not line :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
            # ignore, empty/comment
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
            return
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
        
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        elif line.startswith('uid') :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
            # XXX: too hard to parse properly
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
            return
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        elif '{' in line :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
            decl, line = line.split('{', 1)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
            # we are in a new decl
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
            yield 'open', self.split(decl)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
       
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        elif ';' in line :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
            param, line = line.split(';', 1)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
            
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
            # a stanza
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
            yield 'item', self.split(param)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
        
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        elif '}' in line :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
            close, line = line.split('}', 1)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
            if close.strip() :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
                log.warn("Predata on close: %s", close)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
            # end
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
            yield 'close', None
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
    
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        else :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
            log.warn("Unknown line: %s", line)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
            return
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
        # got the whole line?
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        if line.strip() :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
            log.warn("Data remains: %s", line)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
    def push_block (self, block) :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
            Open new block.
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        """
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   118
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   119
        self.stack.append((self.block, self.items, self.blocks))
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
        self.block = block
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
        self.items = []
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   123
        self.blocks = []
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   125
    def feed_item (self, item) :
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
            Add item to block
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
        self.items.append(item)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
    def pop_block (self) :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
            Close block. Returns
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
                (block, [items])
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
        assert self.block
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   140
        block = (self.block, self.items, self.blocks)
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   142
        self.block, self.items, self.blocks = self.stack.pop(-1)
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   144
        self.blocks.append(block)
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   146
        return block
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   147
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   148
    def parse_line (self, line) :
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
            Parse given line, yielding any complete blocks that come out.
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
            Yields (block, [ lines ]) tuples.
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   154
            >>> parser = DHCPConfigParser()
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
            >>> list(parser.parse_lines(['foo {', ' bar;', ' quux asdf;', '}']))
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   156
            [(['foo'], [['bar'], ['quux', 'asdf']], [])]
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   158
            >>> parser = DHCPConfigParser()
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   159
            >>> list(parser.parse_line('foo {'))
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
            []
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
            >>> list(parser.parse_lines([' bar;', ' quux asdf;']))
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
            []
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   163
            >>> list(parser.parse_line('}'))
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   164
            [(['foo'], [['bar'], ['quux', 'asdf']], [])]
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        for token, args in self.lex(line) :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
            #log.debug("%s: %s [block=%s]", token, args, self.block)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
            if token == 'open' :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
                # open new block
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
                block = args
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
                if self.block :
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   175
                    log.debug("nested block: %s > %s", self.block, block)
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   176
                else :
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   177
                    log.debug("open block: %s", block)
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   178
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
                self.push_block(block)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
            
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
            elif token == 'close' :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
                log.debug("close block: %s", self.block)
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
                # collected block items
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
                yield self.pop_block()
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
            # must be within block!
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
            elif token == 'item' :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
                item = args
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
                log.debug("block %s item: %s", self.block, item)
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   192
                self.feed_item(item)
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
            else :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
                # ???
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
                raise KeyError("Unknown token: {0}: {1}".format(token, args))
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
    
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
    def parse_lines (self, lines) :
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
            Trivial wrapper around parse to parse multiple lines.
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
        """
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
        for line in lines :
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   204
            for item in self.parse_line(line) :
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
                yield item
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   207
    def parse_file (self, file) :
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   208
        """
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   209
            Parse an entire file, returning (items, blocks) lists.
255
d14eda12d966 split pvl.dhcp.config.DHCPConfigParser
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
256
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   211
            >>> DHCPConfigParser().parse_file(['foo;', 'barfoo {', 'bar;', '}'])
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   212
            ([['foo']], [(['barfoo'], [['bar']], [])])
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   213
        """
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   214
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   215
        for line in file :
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   216
            for item in self.parse_line(line) :
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   217
                log.debug("%s", item)
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   218
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   219
        assert not self.block
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   220
63b285ceae41 pvl.dhcp.config: nested blocks
Tero Marttila <terom@paivola.fi>
parents: 255
diff changeset
   221
        return self.items, self.blocks