Source code for insights.parsers.multipath_conf

"""
multipath.conf file content
===========================

MultipathConfTree - file ``/etc/multipath.conf``
------------------------------------------------

MultipathConfTreeInitramfs - command ``lsinitrd -f /etc/multipath.conf``
------------------------------------------------------------------------
"""
import string

from insights.core import ConfigParser, CommandParser
from insights.core.plugins import parser
from insights.parsr import (EOF, Forward, LeftCurly, Lift, LineEnd, Literal,
                            Many, Number, OneLineComment, PosMarker, QuotedString,
                            RightCurly, String, WS, WSChar, skip_none)
from insights.parsr.query import Entry
from insights.specs import Specs


def parse_doc(content, ctx):
    def to_entry(name, rest):
        if isinstance(rest, list):
            return Entry(name=name.value, children=rest, lineno=name.lineno, src=ctx)
        return Entry(name=name.value, attrs=[rest], lineno=name.lineno, src=ctx)

    Stmt = Forward()
    Num = Number & (WSChar | LineEnd)
    NULL = Literal("none", value=None)
    Comment = (WS >> OneLineComment("#").map(lambda x: None))
    BeginBlock = (WS >> LeftCurly << WS)
    EndBlock = (WS >> RightCurly << WS)
    Bare = String(set(string.printable) - (set(string.whitespace) | set("#{}'\"")))
    Name = WS >> PosMarker(String(string.ascii_letters + "_")) << WS
    Value = WS >> (Num | NULL | QuotedString | Bare) << WS
    EmptyString = String('"\'', min_length=2)
    Value = WS >> (Num | NULL | QuotedString | EmptyString | Bare) << WS
    Block = BeginBlock >> Many(Stmt).map(skip_none) << EndBlock
    Stanza = (Lift(to_entry) * Name * (Block | Value)) | Comment
    Stmt <= WS >> Stanza << WS
    Doc = Many(Stmt).map(skip_none)
    Top = Doc + EOF

    return Entry(children=Top(content)[0])


[docs] @parser(Specs.multipath_conf) class MultipathConfTree(ConfigParser): """ Exposes multipath configuration through the parsr query interface. See the :py:class:`insights.core.ConfigComponent` class for example usage. """ def parse_doc(self, content): return parse_doc("\n".join(content), ctx=self)
[docs] def get_tree(root=None): """ This is a helper function to get a multipath configuration component for your local machine or an archive. It's for use in interactive sessions. """ from insights import run return run(MultipathConfTree, root=root).get(MultipathConfTree)
[docs] @parser(Specs.multipath_conf_initramfs) class MultipathConfTreeInitramfs(ConfigParser, CommandParser): """ Exposes the multipath configuration from initramfs image through the parsr query interface. See the :py:class:`insights.core.ConfigComponent` class for example usage. """ bad_lines = [ 'no <initramfs file> specified and the default image' ] def __init__(self, context): super(MultipathConfTreeInitramfs, self).__init__( context, extra_bad_lines=self.bad_lines) def parse_doc(self, content): return parse_doc("\n".join(content), ctx=self)
[docs] def get_tree_from_initramfs(root=None): """ This is a helper function to get a multipath configuration(from initramfs image) component for your local machine or an archive. It's for use in interactive sessions. """ from insights import run return run(MultipathConfTreeInitramfs, root=root).get(MultipathConfTreeInitramfs)