summaryrefslogtreecommitdiff
path: root/ironic_python_agent/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'ironic_python_agent/utils.py')
-rw-r--r--ironic_python_agent/utils.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/ironic_python_agent/utils.py b/ironic_python_agent/utils.py
index 66f6819f..bcf9a0a4 100644
--- a/ironic_python_agent/utils.py
+++ b/ironic_python_agent/utils.py
@@ -18,6 +18,7 @@ import copy
import errno
import glob
import io
+import json
import os
import re
import shutil
@@ -33,6 +34,7 @@ from oslo_log import log as logging
from oslo_serialization import base64
from oslo_serialization import jsonutils
from oslo_utils import units
+import pyudev
import requests
import tenacity
@@ -530,6 +532,42 @@ def gzip_and_b64encode(io_dict=None, file_list=None):
return base64.encode_as_text(fp.getvalue())
+def _collect_udev(io_dict):
+ """Collect device properties from udev."""
+ try:
+ out, _e = ironic_utils.execute('lsblk', '-no', 'KNAME')
+ except processutils.ProcessExecutionError as exc:
+ LOG.warning('Could not list block devices: %s', exc)
+ return
+
+ context = pyudev.Context()
+
+ for kname in out.splitlines():
+ kname = kname.strip()
+ if not kname:
+ continue
+
+ name = os.path.join('/dev', kname)
+
+ try:
+ udev = pyudev.Devices.from_device_file(context, name)
+ except Exception as e:
+ LOG.warning("Device %(dev)s is inaccessible, skipping... "
+ "Error: %(error)s", {'dev': name, 'error': e})
+ continue
+
+ try:
+ props = dict(udev.properties)
+ except AttributeError: # pyudev < 0.20
+ props = dict(udev)
+
+ fp = io.TextIOWrapper(io.BytesIO(), encoding='utf-8')
+ json.dump(props, fp)
+ buf = fp.detach()
+ buf.seek(0)
+ io_dict[f'udev/{kname}'] = buf
+
+
def collect_system_logs(journald_max_lines=None):
"""Collect system logs.
@@ -568,6 +606,11 @@ def collect_system_logs(journald_max_lines=None):
for name, cmd in COLLECT_LOGS_COMMANDS.items():
try_get_command_output(io_dict, name, cmd)
+ try:
+ _collect_udev(io_dict)
+ except Exception:
+ LOG.exception('Unexpected error when collecting udev properties')
+
return gzip_and_b64encode(io_dict=io_dict, file_list=file_list)