Source code for insights.parsers.luksmeta

"""
luksmeta - command ``luksmeta show -d <device_name>``
=====================================================
This class provides parsing for the output of luksmeta <device_name>.
"""

from insights import parser, CommandParser
from insights.specs import Specs


[docs] class KeyslotSpecification: """ Class ``KeyslotSpecification`` describes information about a keyslot collected by the ``luksmeta show`` command. Attributes: index (int): the index of the described keyslot state (str): the state of the described keyslot metadata (str): the UUID of the application that stored metadata into the described keyslot """ def __init__(self, index, state, metadata): self.index = index self.state = state self.metadata = metadata def __repr__(self): ret = "Keyslot on index " + str(self.index) + " is '" + self.state + "' " if self.metadata: ret += "with metadata stored by application with UUID '" + self.metadata + "'" else: ret += "with no embedded metadata" return ret
[docs] @parser(Specs.luksmeta) class LuksMeta(CommandParser, dict): """ Class ``LuksMeta`` parses the output of the ``luksmeta show -d <device>`` command. This command prints information if the device has custom user-defined metadata embedded in the keyslots (used e.g. by clevis). If the device was not initialized using ``luksmeta``, the parser raises SkipComponent. The parser can be indexed by the keyslot index (in the range 0-7). A KeyslotSpecification object is returned, which describes every LUKS keyslot. The KeyslotSpecification contains the ``index``, ``state`` and ``metadata`` fileds. Metadata field stores the UUID of the application that has stored metadata in the keyslot. Sample input data is in the format:: 0 active empty 1 active cb6e8904-81ff-40da-a84a-07ab9ab5715e 2 active empty 3 active empty 4 inactive empty 5 active empty 6 active cb6e8904-81ff-40da-a84a-07ab9ab5715e 7 active cb6e8904-81ff-40da-a84a-07ab9ab5715e Examples: >>> type(parsed_result) <class 'insights.parsers.luksmeta.LuksMeta'> >>> parsed_result[0].index 0 >>> parsed_result[0].state 'active' >>> parsed_result[4].state 'inactive' >>> parsed_result[0].metadata is None True >>> parsed_result[1].metadata 'cb6e8904-81ff-40da-a84a-07ab9ab5715e' """ # noqa BAD_LINES = [ "device is not initialized", "luksmeta data appears corrupt", "unknown error", "invalid slot", "is not a luksv1 device", "invalid argument", "unable to read luksv1 header" ] def __init__(self, context): super(LuksMeta, self).__init__(context, LuksMeta.BAD_LINES)
[docs] def parse_content(self, content): filename_split = self.file_name.split(".") if len(filename_split) >= 4 and filename_split[-4] == "dev" and filename_split[-3] == "disk" and filename_split[-2] == "by-uuid": self["device_uuid"] = self.file_name.split(".")[-1] if self.file_name else None for line in content: index, state, metadata = line.split() index = int(index) metadata = None if metadata == "empty" else metadata self[index] = KeyslotSpecification(index, state, metadata)