Skip to content

Commit

Permalink
NAS-133548 / 24.10.2 / Remove modified files whitelist in /usr (by …
Browse files Browse the repository at this point in the history
…themylogin) (#257)

* Revert "remove file exclusion from ixdiagnose on enterprise systems (#218)"

This reverts commit 2ec4efb.

(cherry picked from commit bde7e13)

* Revert "Exclude nvidia-related changes from `/usr` daatset diff (#208)"

This reverts commit fe4fd3a.

(cherry picked from commit 4329c87)

* Bring back the good part of fe4fd3a

(cherry picked from commit 2257100)

---------

Co-authored-by: themylogin <[email protected]>
  • Loading branch information
bugclerk and themylogin authored Jan 14, 2025
1 parent 2e43dfe commit f913a96
Show file tree
Hide file tree
Showing 3 changed files with 1 addition and 117 deletions.
1 change: 0 additions & 1 deletion ixdiagnose/plugins/metrics/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ def execute_impl(self) -> Tuple[List, str]:
cmd_context = []
metric_report = []
for cmd in self.cmds:
cmd.execution_context = self.execution_context
start_time = time.time()
cp = cmd.execute()
report = {
Expand Down
112 changes: 1 addition & 111 deletions ixdiagnose/plugins/system_state.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import contextlib
import fnmatch
import json
import os

from ixdiagnose.utils.command import Command
from ixdiagnose.utils.middleware import MiddlewareCommand
Expand Down Expand Up @@ -53,121 +51,13 @@ def get_root_ds(client: None, resource_type: str) -> dict:
return report


class UsrPostprocess:
def __init__(self):
self.is_enterprise = None

def __call__(self, execution_context, lines: str) -> str:
if self.is_enterprise is None:
self.is_enterprise = execution_context['middleware_client'].call('system.is_enterprise')

if self.is_enterprise:
return lines

result = []
for line in lines.splitlines():
try:
filename = line.split(maxsplit=1)[1].strip()
except IndexError:
pass
else:
if can_be_modified(filename):
continue

result.append(line)

return "\n".join(result)


def can_be_modified(filename: str) -> bool:
patterns = (
# Modified by `middlewared.utils.rootfs.ReadonlyRootfsManager`
"/usr/bin/apt",
"/usr/bin/apt-config",
"/usr/bin/apt-key",
"/usr/bin/dpkg",
"/usr/local/bin/apt",
"/usr/local/bin/apt-config",
"/usr/local/bin/apt-key",
"/usr/local/bin/dpkg",
# nvidia drivers and its dependencies
"/usr/bin/cpp*",
"/usr/bin/mesa-overlay-control.py",
"/usr/bin/nvidia-*",
"/usr/bin/x86_64-linux-gnu-cpp*",
"/usr/include/*",
"/usr/lib64/xorg/modules/*",
"/usr/lib/cpp",
"/usr/lib/firmware/nvidia/*",
"/usr/lib/gcc/*",
"/usr/lib/libGL*",
"/usr/lib/modules/*",
"/usr/lib/modules/*/kernel/drivers/video",
"/usr/lib/modules/*/kernel/drivers/video/nvidia*",
"/usr/lib/modules/*/modules.*",
"/usr/lib/nvidia/*",
"/usr/lib/systemd/system/nvidia-*",
"/usr/lib/systemd/system-sleep/nvidia",
"/usr/lib/x86_64-linux-gnu/gbm/*",
"/usr/lib/x86_64-linux-gnu/libcuda*",
"/usr/lib/x86_64-linux-gnu/libEGL*",
"/usr/lib/x86_64-linux-gnu/libGL*",
"/usr/lib/x86_64-linux-gnu/libisl*",
"/usr/lib/x86_64-linux-gnu/libLLVM*",
"/usr/lib/x86_64-linux-gnu/libmpc*",
"/usr/lib/x86_64-linux-gnu/libnvcuvid*",
"/usr/lib/x86_64-linux-gnu/libnvidia*",
"/usr/lib/x86_64-linux-gnu/libnvoptix*",
"/usr/lib/x86_64-linux-gnu/libOpenCL*",
"/usr/lib/x86_64-linux-gnu/libOpenGL*",
"/usr/lib/x86_64-linux-gnu/libvdpau*",
"/usr/lib/x86_64-linux-gnu/libVkLayer*",
"/usr/lib/x86_64-linux-gnu/libvulkan*",
"/usr/lib/x86_64-linux-gnu/libwayland*",
"/usr/lib/x86_64-linux-gnu/libX11*",
"/usr/lib/x86_64-linux-gnu/libxcb*",
"/usr/lib/x86_64-linux-gnu/libxshmfence.so*",
"/usr/lib/x86_64-linux-gnu/pkgconfig",
"/usr/lib/x86_64-linux-gnu/vdpau/*",
"/usr/share/applications/nvidia-settings.desktop",
"/usr/share/bug/mesa-vulkan-drivers/*",
"/usr/share/doc/*",
"/usr/share/drirc.d/*",
"/usr/share/egl/*",
"/usr/share/gdb/*",
"/usr/share/glvnd/*",
"/usr/share/icons/hicolor/*",
"/usr/share/keyrings/*",
"/usr/share/lintian/overrides/*",
"/usr/share/locale/*",
"/usr/share/man/man*",
"/usr/share/nvidia/*",
"/usr/share/pkgconfig",
"/usr/share/vulkan/*",
"/usr/src/nvidia-*",
)
return any(should_exclude(filename, pattern) for pattern in patterns)


def should_exclude(filename: str, pattern: str) -> bool:
if fnmatch.fnmatch(filename, pattern):
return True

if os.path.commonprefix((f"{filename}/", pattern)) == f"{filename}/":
return True

return False


class SystemState(Plugin):
name = 'system_state'
metrics = [
CommandMetric(f'{ds.split("/")[-1]}_dataset_diff', [
Command(
['zfs', 'diff', f'{ds}@pristine'],
f'changes of {ds} dataset',
serializable=False,
postprocess=UsrPostprocess() if ds.split('/')[-1] == 'usr' else None,
f'changes of {ds} dataset', serializable=False,
)],
)
for ds in get_ds_list()
Expand Down
5 changes: 0 additions & 5 deletions ixdiagnose/utils/command.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from collections.abc import Callable
import subprocess
from typing import Any, Optional, Union

Expand All @@ -10,22 +9,18 @@ class Command:
def __init__(
self, command: Union[str, list], description: str, serializable: bool = True,
safe_returncodes: list = None, env: Optional[dict] = None, max_lines: Optional[int] = None,
postprocess: Optional[Callable[[Any, str], str]] = None,
):
self.command: Union[str, list] = command
self.description: str = description
self.env: Optional[dict] = env
self.max_lines: Optional[int] = max_lines
self.serializable: bool = serializable
self.safe_returncodes: list = safe_returncodes or [0]
self.postprocess = postprocess
self.execution_context: Any = None

def execute(self) -> subprocess.CompletedProcess:
cp = run(self.command, check=False, env=self.env)
if cp.returncode in self.safe_returncodes:
if self.postprocess:
cp.stdout = self.postprocess(self.execution_context, cp.stdout)
if self.max_lines:
cp.stdout = "\n".join(cp.stdout.splitlines()[:self.max_lines])
return cp

0 comments on commit f913a96

Please sign in to comment.