Source code for insights.parsers.lspci

"""
LsPci - Command ``lspci -k``
============================

To parse the PCI device information gathered from the ``/sbin/lspci -k`` command.

"""
import re

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


[docs]@parser(Specs.lspci) class LsPci(CommandParser, LogFileOutput): """ Class to parse the PCI device information gathered from the ``/sbin/lspci -k`` command. Typical output of the ``lspci -k`` command is:: 00:00.0 Host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 13) Subsystem: Cisco Systems Inc Device 0101 00:01.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1 (rev 13) Kernel driver in use: pcieport Kernel modules: shpchp 00:02.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 2 (rev 13) Kernel driver in use: pcieport Kernel modules: shpchp 03:00.0 Network controller: Intel Corporation Centrino Advanced-N 6205 [Taylor Peak] (rev 34) Subsystem: Cisco Systems Inc Device 004a Kernel driver in use: ixgbe Kernel modules: ixgbe 06:00.0 Ethernet controller: Intel Corporation 82598EB 10-Gigabit AF Dual Port Network Connection (rev 01) Subsystem: Cisco Systems Inc Device 004a Kernel driver in use: ixgbe Kernel modules: ixgbe Examples: >>> type(lspci) <class 'insights.parsers.lspci.LsPci'> >>> lspci.get("Intel Corporation")[0]['raw_message'] '00:00.0 Host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 13)' >>> len(lspci.get("Network controller")) 1 >>> "Centrino Advanced-N 6205" in lspci True >>> "0d:00.0" in lspci False >>> sorted(lspci.pci_dev_list) ['00:00.0', '00:01.0', '00:02.0', '03:00.0', '06:00.0'] >>> lspci.pci_dev_details('00:00.0')['Subsystem'] 'Cisco Systems Inc Device 0101' >>> lspci.pci_dev_details('00:00.0')['Dev_Details'] 'Host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 13)' Attributes: data (dict): Dict where the keys are the device number and values are details of the device. lines (list): List of details of each listed device, the same to the values of `self.data` """
[docs] def parse_content(self, content): # Use all the defined scanners to search the log file, setting the # properties defined in the scanner. self.lines = [l for l in content if len(l) > 0 and l[0].isdigit()] for scanner in self.scanners: scanner(self) # Parse kernel driver lines self.data = {} bus_device_function = None bus_device_function_re = re.compile(r'[0-9a-f]+:[0-9a-f]+.[0-9a-f]+') fields = ["Subsystem", "Kernel driver in use", "Kernel modules"] for line in get_active_lines(content): parts = line.split() if bus_device_function_re.match(parts[0]): bus_device_function = parts[0] device_details = ' '.join(map(str, parts[1:])) self.data[bus_device_function] = {'Dev_Details': device_details.lstrip()} elif bus_device_function and (line.split(":")[0].strip() in fields): parts = line.split(':') self.data[bus_device_function][parts[0]] = parts[1].lstrip()
[docs] def pci_dev_details(self, dev_name): """ It will return the PCI device and it's details. Args: PCI Bus Device function number eg: '00:01:0' Returns: (dict): Returns device details along with 'Subsystem', 'Kernel Driver in Use', 'Kernel Modules'. Returns `None` if device doesn't exists """ return self.data.get(dev_name, None)
@property def pci_dev_list(self): """ The list of PCI devices. """ return self.data.keys()