feat: DeviceTypeDriver base class mit FingerprintRule und PortSpec

Neue Zwischenschicht zwischen NetworkDriver und den typ-spezifischen
Basisklassen (FirewallDriver, SwitchDriver, …). Definiert das
Fingerprinting-Interface für den Discovery-Subsystem:

- FingerprintRule (NamedTuple): pattern, weight, mandatory, negative
- PortSpec (NamedTuple): scheme, port, paths, weight, mandatory
- DeviceTypeDriver: VENDOR, DRIVER_NAME, PORT_SPECS, SNMP_OBJECT_ID_PREFIX,
  SNMP_FINGERPRINT, SSH_FINGERPRINT, HTTP_FINGERPRINT

Alle *Driver-Klassen erben jetzt von DeviceTypeDriver statt NetworkDriver.
Transitiv ist NetworkDriver weiterhin in der MRO (keine Breaking Change).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-24 14:29:41 +02:00
co-authored by Claude Sonnet 4.6
parent 95f8771824
commit 0f6734e6da
10 changed files with 240 additions and 14 deletions
+4
View File
@@ -30,6 +30,7 @@ Also provided:
drivers.
"""
from napalm_device_types.base import DeviceTypeDriver, FingerprintRule, PortSpec
from napalm_device_types.access_point import AccessPointDriver
from napalm_device_types.config_lifecycle import ConfigLifecycleMixin
from napalm_device_types.firewall import FirewallDriver
@@ -42,9 +43,12 @@ from napalm_device_types.switch import SwitchDriver
__all__ = [
"AccessPointDriver",
"ConfigLifecycleMixin",
"DeviceTypeDriver",
"FingerprintRule",
"FirewallDriver",
"HypervisorDriver",
"OSDriver",
"PortSpec",
"ResidentialGatewayDriver",
"StorageDriver",
"SwitchDriver",
+2 -2
View File
@@ -11,7 +11,7 @@ Usage::
"""
from typing import Any, Dict, List
from napalm.base import NetworkDriver
from napalm_device_types.base import DeviceTypeDriver
from napalm_device_types._ucd_metrics import IF_SKIP_DEFAULT, collect_ucd_metrics
from napalm_device_types.models import (
Dot1XConfigDict,
@@ -31,7 +31,7 @@ from napalm_device_types.models import (
)
class AccessPointDriver(NetworkDriver):
class AccessPointDriver(DeviceTypeDriver):
TYPE_LABEL: str = "Access Point"
"""
Abstract intermediate driver for wireless access points.
+77
View File
@@ -0,0 +1,77 @@
"""
DeviceTypeDriver — common base for all netOrk device-type drivers.
Provides the fingerprinting contract used by the discovery subsystem to
identify devices from SNMP / SSH / HTTP probe data without requiring a
live connection.
"""
from __future__ import annotations
from typing import NamedTuple
from napalm.base import NetworkDriver
class FingerprintRule(NamedTuple):
"""Single pattern-matching rule for device fingerprinting.
pattern — substring matched against lowercased probe data
weight — evidence added to the driver's score on match
mandatory — pattern absent → driver immediately disqualified
negative — pattern present → weight subtracted instead of added
"""
pattern: str
weight: float = 1.0
mandatory: bool = False
negative: bool = False
class PortSpec(NamedTuple):
"""Port to probe during discovery and its fingerprinting contribution.
scheme — "http", "https", or "ssh"
port — TCP port number
paths — URL paths to try (http/https only; ignored for ssh)
weight — evidence added to score when this port responds
mandatory — port silent → driver immediately disqualified
"""
scheme: str
port: int
paths: tuple[str, ...] = ("/",)
weight: float = 5.0
mandatory: bool = False
class DeviceTypeDriver(NetworkDriver):
"""Common base for all netOrk device-type drivers.
Sits between napalm.base.NetworkDriver and the type-specific abstract
classes (FirewallDriver, SwitchDriver, …). Adds the fingerprinting
interface consumed by the discovery subsystem; does not implement any
NAPALM abstract methods.
Override these class attributes in each concrete driver:
VENDOR Human-readable vendor name ("AVM", "OPNsense", …).
DRIVER_NAME NAPALM entry-point key ("fritzbox", "opnsense", …).
PORT_SPECS Non-standard ports to probe beyond 80/443/22.
None = no driver-specific ports expected.
SNMP_OBJECT_ID_PREFIX OID prefix for sysObjectID (1.3.6.1.2.1.1.2.0).
Match → +15.0 score; set but no match → disqualified.
SNMP_FINGERPRINT Rules matched against sysDescr (lowercased).
SSH_FINGERPRINT Rules matched against SSH version string +
pre-auth banner (lowercased, space-joined).
HTTP_FINGERPRINT Rules matched against page title + Server header +
body snippet (lowercased, whitespace-normalised).
"""
VENDOR: str = ""
DRIVER_NAME: str = ""
PORT_SPECS: list[PortSpec] | None = None
SNMP_OBJECT_ID_PREFIX: str | None = None
SNMP_FINGERPRINT: list[FingerprintRule] = []
SSH_FINGERPRINT: list[FingerprintRule] = []
HTTP_FINGERPRINT: list[FingerprintRule] = []
+2 -2
View File
@@ -11,7 +11,7 @@ Usage::
"""
from typing import Any, Dict, List
from napalm.base import NetworkDriver
from napalm_device_types.base import DeviceTypeDriver
from napalm_device_types._ucd_metrics import IF_SKIP_DEFAULT, collect_ucd_metrics
from napalm_device_types.models import (
HealthMetricsDict,
@@ -23,7 +23,7 @@ from napalm_device_types.models import (
)
class FirewallDriver(NetworkDriver):
class FirewallDriver(DeviceTypeDriver):
TYPE_LABEL: str = "Firewall"
"""
Abstract intermediate driver for firewall/security devices.
+2 -2
View File
@@ -11,7 +11,7 @@ Usage::
"""
from typing import Any, Dict, List
from napalm.base import NetworkDriver
from napalm_device_types.base import DeviceTypeDriver
from napalm_device_types._ucd_metrics import IF_SKIP_DEFAULT, collect_ucd_metrics
from napalm_device_types.models import (
HealthMetricsDict,
@@ -24,7 +24,7 @@ from napalm_device_types.models import (
)
class HypervisorDriver(NetworkDriver):
class HypervisorDriver(DeviceTypeDriver):
TYPE_LABEL: str = "Hypervisor"
"""
Abstract intermediate driver for hypervisors and virtualisation platforms
+2 -2
View File
@@ -12,7 +12,7 @@ Usage::
import re
from typing import List, Optional
from napalm.base import NetworkDriver
from napalm_device_types.base import DeviceTypeDriver
from napalm_device_types._ucd_metrics import IF_SKIP_DEFAULT, collect_ucd_metrics
from napalm_device_types.models import (
ApplyUpdatesResultDict,
@@ -29,7 +29,7 @@ from napalm_device_types.models import (
)
class OSDriver(NetworkDriver):
class OSDriver(DeviceTypeDriver):
TYPE_LABEL: str = "OS"
"""
Abstract intermediate driver for general-purpose operating systems
+2 -2
View File
@@ -19,7 +19,7 @@ Usage::
"""
from typing import Dict, List
from napalm.base import NetworkDriver
from napalm_device_types.base import DeviceTypeDriver
from napalm_device_types._ucd_metrics import IF_SKIP_DEFAULT, collect_ucd_metrics
from napalm_device_types.models import (
HealthMetricsDict,
@@ -34,7 +34,7 @@ from napalm_device_types.models import (
)
class ResidentialGatewayDriver(NetworkDriver):
class ResidentialGatewayDriver(DeviceTypeDriver):
TYPE_LABEL: str = "Gateway"
"""
Abstract intermediate driver for residential gateways (router + firewall + AP).
+2 -2
View File
@@ -11,7 +11,7 @@ Usage::
"""
from typing import Any, Dict, List
from napalm.base import NetworkDriver
from napalm_device_types.base import DeviceTypeDriver
from napalm_device_types.models import (
DiskPoolDict,
LogicalVolumeDict,
@@ -25,7 +25,7 @@ from napalm_device_types.models import (
)
class StorageDriver(NetworkDriver):
class StorageDriver(DeviceTypeDriver):
TYPE_LABEL: str = "Storage"
"""
Abstract intermediate driver for storage appliances and NAS/SAN devices
+2 -2
View File
@@ -11,7 +11,7 @@ Usage::
"""
from typing import Dict, List
from napalm.base import NetworkDriver
from napalm_device_types.base import DeviceTypeDriver
from napalm_device_types.models import (
Dot1XPortDict,
HealthMetricsDict,
@@ -24,7 +24,7 @@ from napalm_device_types.models import (
)
class SwitchDriver(NetworkDriver):
class SwitchDriver(DeviceTypeDriver):
TYPE_LABEL: str = "Switch"
"""
Abstract intermediate driver for Ethernet switches.