Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FEAT: Add new parser Env #4196

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/shared_parsers_catalog/env.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.. automodule:: insights.parsers.env
:members:
:show-inheritance:
39 changes: 39 additions & 0 deletions insights/parsers/env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
"""
Env - command ``/usr/bin/env``
==============================
"""

from insights.core import CommandParser
from insights.core.exceptions import SkipComponent
from insights.core.plugins import parser
from insights.specs import Specs


@parser(Specs.env)
class Env(CommandParser, list):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use dict?

"""
Reads the output of env

Example output::

XDG_SESSION_ID=3
HOSTNAME=rhel7.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=100000

Examples::
>>> type(env)
<class 'insights.parsers.env.Env'>
>>> env[0] == 'XDG_SESSION_ID=3'
True
"""
def parse_content(self, content):
for line in content:
line = line.strip()
if line:
self.append(line)

if not self:
raise SkipComponent
1 change: 1 addition & 0 deletions insights/specs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ class Specs(SpecSet):
engine_config_all = RegistryPoint()
engine_db_query_vdsm_version = RegistryPoint()
engine_log = RegistryPoint(filterable=True)
env = RegistryPoint(filterable=True)
etc_journald_conf = RegistryPoint()
etc_journald_conf_d = RegistryPoint(multi_output=True)
etc_machine_id = RegistryPoint(no_obfuscate=['hostname', 'ip'])
Expand Down
1 change: 1 addition & 0 deletions insights/specs/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ class DefaultSpecs(Specs):
duplicate_machine_id = machine_ids.dup_machine_id_info
eap_json_reports = foreach_collect(eap_reports.eap_report_files, "%s")
engine_log = simple_file("/var/log/ovirt-engine/engine.log")
env = simple_command("/usr/bin/env")
Copy link
Contributor

@xiangce xiangce Aug 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The insights core doesn't inherit the ENV variables set by default, you need to use the inherit_env explicitly to make the collect process get the specific ENV var being passed from os.environ to the subprocess.

env = simple_command("/usr/bin/env", inherit_env=["LD_LIBRARY_PATH"])

etc_journald_conf = simple_file(r"etc/systemd/journald.conf")
etc_journald_conf_d = glob_file(r"etc/systemd/journald.conf.d/*.conf")
etc_machine_id = simple_file("/etc/machine-id")
Expand Down
45 changes: 45 additions & 0 deletions insights/tests/parsers/test_env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import doctest
from insights.tests import context_wrap
from insights.parsers import env
from insights.parsers.env import Env


ENV_CONTENT = r"""
XDG_SESSION_ID=3
HOSTNAME=rhel7.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=100000
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=vagrant
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
MAIL=/var/spool/mail/vagrant
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin
PWD=/home/vagrant
LANG=en_US.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/home/vagrant
LOGNAME=vagrant
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/1000
_=/usr/bin/env
""".strip()


def test_env():
result = Env(context_wrap(ENV_CONTENT))
assert len(result) == 22
assert result[0] == "XDG_SESSION_ID=3"
assert result[-2] == "XDG_RUNTIME_DIR=/run/user/1000"


def test_env_doc_examples():
env_result = {
'env': Env(context_wrap(ENV_CONTENT)),
}
failed, total = doctest.testmod(env, globs=env_result)
assert failed == 0
Loading