Source code for insights.parsers.sysctl

"""
Kernel system control information
=================================

Shared parsers for parsing file ``/etc/sysctl.conf`` and command ``sysctl -a``.

Parsers included in this module are:

Sysctl - command ``sysctl -a``
------------------------------

SysctlConf - file ``/etc/sysctl.conf``
--------------------------------------

SysctlDConfEtc - file ``/etc/sysctl.d/*.conf``
----------------------------------------------

SysctlDConfUsr - file ``/usr/lib/sysctl.d/*.conf``
--------------------------------------------------

SysctlConfInitramfs - command ``lsinitrd``
------------------------------------------
"""
from collections import OrderedDict

from insights.core import CommandParser, TextFileOutput, Parser
from insights.core.plugins import parser
from insights.parsers import split_kv_pairs
from insights.specs import Specs


[docs] class SysctlBase(Parser, dict): """ Parse sysctl conf files, and sysctl command output. Sample input:: # sysctl.conf sample # kernel.domainname = example.com ; this one has a space which will be written to the sysctl! kernel.modprobe = /sbin/mod probe Attributes: data (OrderedDict): Dictionary containing key/value pairs for the lines in the configuration file. Dictionary is in order keywords first appear in the lines. Examples: >>> sysctl_conf.data['kernel.domainname'] 'example.com' >>> sysctl_conf.data['kernel.modprobe'] '/sbin/mod probe' """
[docs] def parse_content(self, content): # Valid comments are both # and ; so remove one locally, # other comments and blank lines are removed by split_kv_pairs. lines = [l for l in content if not l.strip().startswith(';')] self.update(split_kv_pairs(lines, ordered=True))
@property def data(self): return OrderedDict(self)
[docs] @parser(Specs.sysctl_conf) class SysctlConf(SysctlBase): """ Parse `/etc/sysctl.conf` file. .. note:: Please refer to its base class :class:`SysctlBase` for the sample data and examples. """ pass
[docs] @parser(Specs.sysctl_d_conf_etc) class SysctlDConfEtc(SysctlBase): """ Parse `/etc/sysctl.d/*.conf` files. .. note:: Please refer to its base class :class:`SysctlBase` for the sample data and examples. """ pass
[docs] @parser(Specs.sysctl_d_conf_usr) class SysctlDConfUsr(SysctlBase): """ Parse `/usr/lib/sysctl.d/*.conf` files. .. note:: Please refer to its base class :class:`SysctlBase` for the sample data and examples. """ pass
[docs] @parser(Specs.sysctl) class Sysctl(SysctlBase): """ Parse the output of `sysctl -a` command. .. note:: Please refer to its base class :class:`SysctlBase` for the sample data and examples. """ pass
[docs] @parser(Specs.sysctl_conf_initramfs) class SysctlConfInitramfs(CommandParser, TextFileOutput): """Shared parser for the output of ``lsinitrd`` applied to kdump initramfs images to view ``sysctl.conf`` and ``sysctl.d`` configurations. The file is treated as raw lines (as a ``TextFileOutput`` parser, as no serialial parsing result is required for this spec for now. .. note:: Please refer to its super-class :class:`insights.core.TextFileOutput` Sample input:: initramfs:/etc/sysctl.conf ======================================================================== # sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/. # # Vendors settings live in /usr/lib/sysctl.d/. # To override a whole file, create a new file with the same in # /etc/sysctl.d/ and put new settings there. To override # only specific settings, add a file with a lexically later # name in /etc/sysctl.d/ and put new settings there. # # For more information, see sysctl.conf(5) and sysctl.d(5). fs.inotify.max_user_watches=524288 ======================================================================== initramfs:/etc/sysctl.d/*.conf ======================================================================== Examples: >>> type(sysctl_initramfs) <class 'insights.parsers.sysctl.SysctlConfInitramfs'> >>> sysctl_initramfs.get('max_user_watches')[0]['raw_line'] 'fs.inotify.max_user_watches=524288' """
[docs] def parse_content(self, content): # Remove all blank lines and comment lines prior to parsing valid_lines = [] for line in content: line = line.strip() if line and not (line.startswith('#') or line.startswith(';')): valid_lines.append(line) super(SysctlConfInitramfs, self).parse_content(valid_lines)