mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-24 09:36:31 +00:00
Udev - move away form depricated callback / increase buffer (#2502)
* Use new callback from udev / only forward * minimize loop * Udev - move away form depricated callback / increase buffer * code cleanup
This commit is contained in:
parent
a3555c74e8
commit
184eeb7f49
@ -1,5 +1,4 @@
|
||||
"""Supervisor Hardware monitor based on udev."""
|
||||
from contextlib import suppress
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from pprint import pformat
|
||||
@ -31,7 +30,14 @@ class HwMonitor(CoreSysAttributes):
|
||||
"""Start hardware monitor."""
|
||||
try:
|
||||
self.monitor = pyudev.Monitor.from_netlink(self.context, "kernel")
|
||||
self.observer = pyudev.MonitorObserver(self.monitor, self._udev_events)
|
||||
self.monitor.set_receive_buffer_size(32 * 1024 * 1024)
|
||||
|
||||
self.observer = pyudev.MonitorObserver(
|
||||
self.monitor,
|
||||
callback=lambda x: self.sys_loop.call_soon_threadsafe(
|
||||
self._async_udev_events, x
|
||||
),
|
||||
)
|
||||
except OSError:
|
||||
self.sys_resolution.unhealthy = UnhealthyReason.PRIVILEGED
|
||||
_LOGGER.critical("Not privileged to run udev monitor!")
|
||||
@ -47,29 +53,20 @@ class HwMonitor(CoreSysAttributes):
|
||||
self.observer.stop()
|
||||
_LOGGER.info("Stopped Supervisor hardware monitor")
|
||||
|
||||
def _udev_events(self, action: str, kernel: pyudev.Device):
|
||||
"""Incomming events from udev.
|
||||
|
||||
This is inside a observe thread and need pass into our eventloop.
|
||||
"""
|
||||
_LOGGER.debug("Hardware monitor: %s - %s", action, pformat(kernel))
|
||||
udev = None
|
||||
with suppress(pyudev.DeviceNotFoundAtPathError):
|
||||
udev = pyudev.Devices.from_sys_path(self.context, kernel.sys_path)
|
||||
|
||||
self.sys_loop.call_soon_threadsafe(
|
||||
self._async_udev_events, action, kernel, udev
|
||||
)
|
||||
|
||||
def _async_udev_events(
|
||||
self, action: str, kernel: pyudev.Device, udev: Optional[pyudev.Device]
|
||||
):
|
||||
def _async_udev_events(self, kernel: pyudev.Device):
|
||||
"""Incomming events from udev into loop."""
|
||||
# Update device List
|
||||
if not kernel.device_node or self.sys_hardware.helper.hide_virtual_device(
|
||||
kernel
|
||||
):
|
||||
return
|
||||
_LOGGER.debug("Hardware monitor: %s - %s", kernel.action, pformat(kernel))
|
||||
|
||||
# Lookup udev device data
|
||||
try:
|
||||
udev = pyudev.Devices.from_sys_path(self.context, kernel.sys_path)
|
||||
except pyudev.DeviceNotFoundAtPathError:
|
||||
udev = None
|
||||
|
||||
hw_action = None
|
||||
device = None
|
||||
@ -77,7 +74,7 @@ class HwMonitor(CoreSysAttributes):
|
||||
##
|
||||
# Remove
|
||||
if (
|
||||
action in (UdevKernelAction.REMOVE, UdevKernelAction.UNBIND)
|
||||
kernel.action in (UdevKernelAction.REMOVE, UdevKernelAction.UNBIND)
|
||||
and udev is None
|
||||
):
|
||||
try:
|
||||
@ -90,7 +87,10 @@ class HwMonitor(CoreSysAttributes):
|
||||
|
||||
##
|
||||
# Add
|
||||
if action in (UdevKernelAction.ADD, UdevKernelAction.BIND) and udev is not None:
|
||||
if (
|
||||
kernel.action in (UdevKernelAction.ADD, UdevKernelAction.BIND)
|
||||
and udev is not None
|
||||
):
|
||||
device = Device(
|
||||
udev.sys_name,
|
||||
Path(udev.device_node),
|
||||
|
Loading…
x
Reference in New Issue
Block a user