feat: device by-id

This commit is contained in:
Daniel Langbein 2023-10-05 16:54:56 +02:00
parent d6b4af9d6a
commit b2de44b26f
Signed by: langfingaz
GPG Key ID: 6C47C753F0823002
3 changed files with 46 additions and 32 deletions

View File

@ -2,11 +2,11 @@
dir = /var/log/de-p1st-monitor/ dir = /var/log/de-p1st-monitor/
[filesystem.1] [filesystem.1]
; NVME ; 256GB2
mountpoint = / mountpoint = /
warn_if_above = 0.75 warn_if_above = 0.75
[filesystem.2] [filesystem.2]
; NVME ; 256GB2
mountpoint = /boot mountpoint = /boot
warn_if_above = 0.75 warn_if_above = 0.75
[filesystem.3] [filesystem.3]
@ -14,8 +14,8 @@ warn_if_above = 0.75
uuid = c385a436-0288-486f-a2b9-c64c2db667e7 uuid = c385a436-0288-486f-a2b9-c64c2db667e7
warn_if_above = 0.66 warn_if_above = 0.66
[filesystem.4] [filesystem.4]
; 3TB1 and 3TB2 ; 3TB1, 3TB2 and 4TB1
uuid = a454430b-dee3-4b6b-8325-f7bdb9435ed1 uuid = 1f560eeb-a375-457b-84a6-93d771a5ba5f
warn_if_above = 0.85 warn_if_above = 0.85
unmounted_ok = true unmounted_ok = true
@ -54,25 +54,28 @@ warn_if_above = 60
network_interface = enp0s31f6 network_interface = enp0s31f6
[drive.1] [drive.1]
; NVME /dev/nvme0n1p3 ; NVMe 256GB2
; TODO NVME 49 warn, 55 limit ; TODO NVMe 49 warn, 55 limit
uuid = b8ef1da9-d76d-44b4-86d4-71c82c888b6f id = nvme-WDC_PC_SN520_SDAPNUW-256G-1002_183873801941
warn_if_above = 50 warn_if_above = 50
[drive.2] [drive.2]
; HDD 12TB1 ; HDD 12TB1
; TODO HDD 39 warn, 45 limit ; TODO HDD 39 warn, 45 limit
uuid = 68c349e8-5118-4773-9fd5-5dbad9acee4e id = ata-TOSHIBA_MG07ACA12TE_X1E0A0WKF95G
warn_if_above = 40 warn_if_above = 40
[drive.3] [drive.3]
; HDD 3TB1 ; HDD 3TB1
uuid = 20d86155-30d4-404c-95e8-c701cfb16ca5 id = ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N1173157
warn_if_above = 40 warn_if_above = 40
[drive.4] [drive.4]
; HDD 3TB2 ; HDD 3TB2
uuid = 4651c3f1-e4b8-45aa-a823-df762530a307 id = ata-WDC_WD30EFRX-68EUZN0_WD-WMC4N0564095
warn_if_above = 40
; HDD 4TB1
id = ata-WDC_WD40EFRX-68N32N0_WD-WCC7K0CPF0N1
warn_if_above = 40 warn_if_above = 40
[sensor_script.1] ; [sensor_script.1]
cmd = ["digitemp_DS9097", "-q", "-c", "/home/yoda/.digitemprc", "-t", "0"] ; cmd = ["digitemp_DS9097", "-q", "-c", "/home/yoda/.digitemprc", "-t", "0"]
name = room-temp ; name = room-temp
warn_if_above = 32 ; warn_if_above = 32

View File

@ -79,11 +79,12 @@ def get_loggers() -> tuple[list[Logger], list[LoggerArgEx]]:
def drive(cfg_: configparser.SectionProxy) -> Logger: def drive(cfg_: configparser.SectionProxy) -> Logger:
uuid = cfg_.get('uuid', None) uuid = cfg_.get('uuid', None)
id_ = cfg_.get('id', None)
device = Path(cfg_.get('device')) if 'device' in cfg_ else None device = Path(cfg_.get('device')) if 'device' in cfg_ else None
warn_if_above = int(cfg_['warn_if_above']) if 'warn_if_above' in cfg_ else None warn_if_above = int(cfg_['warn_if_above']) if 'warn_if_above' in cfg_ else None
warn_threshold = int(cfg_.get('warn_threshold', '1')) warn_threshold = int(cfg_.get('warn_threshold', '1'))
warn_data_range = int(cfg_.get('warn_data_range', '1')) warn_data_range = int(cfg_.get('warn_data_range', '1'))
return DriveLogger(uuid, device, warn_if_above, warn_threshold, warn_data_range) return DriveLogger(uuid, id_, device, warn_if_above, warn_threshold, warn_data_range)
def memory(cfg_: configparser.SectionProxy) -> Logger: def memory(cfg_: configparser.SectionProxy) -> Logger:
warn_if_above = float(cfg_.get('warn_if_above', '1.0')) warn_if_above = float(cfg_.get('warn_if_above', '1.0'))

View File

@ -16,7 +16,9 @@ class BlkidException(Exception):
class DriveLogger(Logger): class DriveLogger(Logger):
def __init__(self, uuid: str = None, def __init__(self,
uuid: str = None,
id_: str = None,
device: Path = None, device: Path = None,
warn_if_above: int = None, warn_if_above: int = None,
warn_threshold: int = 1, warn_threshold: int = 1,
@ -30,20 +32,21 @@ class DriveLogger(Logger):
critical_if_above critical_if_above
) )
if uuid is None and device is None: if uuid is None and id_ is None and device is None:
raise LoggerArgEx('uuid or device required') raise LoggerArgEx('uuid, id_ or device required')
# `device` might be `None`.
if uuid is not None:
device = self.get_partition_from_uuid(uuid)
if id_ is not None:
device = self.get_partition_from_id(id_)
# `device` is not `None`, `uuid` might be `None`.
if uuid is None: if uuid is None:
try: try:
self.uuid = self.get_partition_uuid(device) self.uuid = self.get_uuid_from_partition(device)
except BlkidException as e: except BlkidException as e:
raise LoggerArgEx(getattr(e, 'message', e)) raise LoggerArgEx(getattr(e, 'message', e))
else: # Store as attributes.
self.uuid = uuid self.uuid = uuid
if device is None:
self.device = self.get_partition_path(uuid)
else:
self.device = device self.device = device
self.warn_if_above = warn_if_above self.warn_if_above = warn_if_above
@ -72,17 +75,24 @@ class DriveLogger(Logger):
# #
@classmethod @classmethod
def get_partition_path(cls, uuid: str) -> Path: def get_partition_from_uuid(cls, uuid: str) -> Path:
""" """
:return: Partition path, e.g. /dev/sda1 :return: Partition path, e.g. /dev/sda1
""" """
return Path(f'/dev/disk/by-uuid/{uuid}').resolve() return Path(f'/dev/disk/by-uuid/{uuid}').resolve()
@classmethod @classmethod
def get_partition_uuid(cls, device: Path) -> str: def get_partition_from_id(cls, id_: str) -> Path:
""" """
:param device: E.g. /dev/sda1 :return: Partition path, e.g. /dev/sda1
:return: UUID of e.g. partition /dev/sda1 """
return Path(f'/dev/disk/by-id/{id_}').resolve()
@classmethod
def get_uuid_from_partition(cls, device: Path) -> str:
"""
:param device: Partition path, e.g. /dev/sda1
:return: UUID of given partition
:raise BlkidException: If UUID could not be determined. :raise BlkidException: If UUID could not be determined.
""" """
returncode, stdout, stderr = execute_capture(['blkid', '-s', 'UUID', '-o', 'value', f'{device}']) returncode, stdout, stderr = execute_capture(['blkid', '-s', 'UUID', '-o', 'value', f'{device}'])
@ -95,7 +105,7 @@ class DriveLogger(Logger):
@classmethod @classmethod
def get_temp_from_device(cls, device: Path) -> int: def get_temp_from_device(cls, device: Path) -> int:
""" """
:param device: For example `/dev/sda` or `/dev/disk/by-uuid/<uuid>` :param device: Partition path, e.g. `/dev/sda`
:return: Temperature in celsius :return: Temperature in celsius
""" """