feat: FreeBSD and OpenBSD drivers, read side
FreeBSDDriver (`freebsd`) and OpenBSDDriver (`openbsd`) on a shared BsdDriver, for the BSD VMs netOrk provisions and BSD hosts added by hand (NetOrk/netork#798). - SSH over exec channels (napalm-device-types' run_on_transport): no PTY, stdout and stderr apart, real exit codes; run_command()/open_stream() are public. Root through `sudo -S` with the password on stdin, or `sudo -n` without one. - Facts: hostname, release and running kernel (freebsd-version / uname), hardware from SMBIOS (kenv) or hw.* sysctls, uptime from kern.boottime. - Interfaces and addresses (ifconfig -a: ether/lladdr, hex netmasks, scoped IPv6), routes (netstat -rn, OpenBSD's abbreviated networks written out, host/broadcast/loopback entries left out), ARP (FreeBSD's sentences, OpenBSD's table), users and groups, processes (lstart read as one five-word field), cron jobs (system crontab and the login user's). - Parsers are pure functions, tested on output recorded from FreeBSD 15.1 (hand-installed and cloud image) and OpenBSD 7.9 (NetOrk/netork#793), with internal addresses replaced by documentation ranges.
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
"""OpenBSD: hw.* sysctls for the hardware, uname for release and kernel."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from napalm_device_types import FingerprintRule
|
||||
|
||||
from napalm_bsd.base import BsdDriver
|
||||
|
||||
|
||||
class OpenBSDDriver(BsdDriver):
|
||||
"""NAPALM driver for OpenBSD hosts, over SSH."""
|
||||
|
||||
TYPE_LABEL = "OpenBSD"
|
||||
VENDOR = "OpenBSD"
|
||||
DRIVER_NAME = "openbsd"
|
||||
# OpenBSD's SSH banner names no OS; its sysDescr does ("OpenBSD host 7.9 GENERIC.MP#449").
|
||||
SNMP_FINGERPRINT = [FingerprintRule("openbsd", weight=5.0)]
|
||||
|
||||
OS_VERSION_COMMAND = "uname -sr"
|
||||
# The kernel's build, e.g. GENERIC.MP#449; the release is in uname -r.
|
||||
KERNEL_COMMAND = "uname -v"
|
||||
# A sysctl node the machine lacks fails on its own and prints nothing.
|
||||
PLATFORM_COMMAND = (
|
||||
"for k in vendor product serialno; do "
|
||||
'printf "%s=%s\\n" "$k" "$(sysctl -n hw.$k 2>/dev/null)"; done'
|
||||
)
|
||||
|
||||
def _hardware(self) -> tuple[str, str, str]:
|
||||
hw = self._platform()
|
||||
return hw.get("vendor", ""), hw.get("product", ""), hw.get("serialno", "")
|
||||
Reference in New Issue
Block a user