# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ### Security - The SSH host key is verified (NetOrk/netork#1167). `open()` takes the key to expect from `optional_args["ssh_host_key"]` and refuses any other one before it logs in (`SshHostKeyMismatch`); without one it accepts the first key. Every key it sees goes to `optional_args["ssh_host_key_observer"]`. Replaces paramiko's `AutoAddPolicy`. Requires napalm-device-types 4.19.0; version 0.4.0. ## [0.3.0] - 2026-10-17 ### Changed - **Breaking:** `run_device_action("fix_snmp")` is gone. The drivers implement napalm-device-types 4.13's `configure_snmp_agent(settings)` template instead, and the caller supplies every value: one `rocommunity` line per allowed source, contact and location as given. No community, contact or location of an application is built in any more. pf and ipfw rules are left to the operator. Requires napalm-device-types 4.13.0 or later. - `get_snmp_config` no longer assumes the community `public` when the file names none. ### Added - `get_management_peer()`: the address the host sees the SSH connection come from. - `ensure_package(name)` from the base package. ## [0.2.1] - 2026-10-16 ### Fixed - A sudo password no longer ends up in `snmpd.conf`. `run_command` sent the password and the data on the same stdin, and a sudo that does not prompt (NOPASSWD, a cached timestamp) left the password for `cat`, which wrote it as the first line of a file then made world-readable (#8). `run_command` now refuses stdin to a privileged command while a sudo password is set, and `fix_snmp` stages the configuration without privilege before root installs it, without following a symlink at the target. ## [0.2.0] - 2026-10-13 ### Changed - `get_users` is now `get_os_users`, as napalm-device-types 4.7 names it on `OSDriver`; the return shape is unchanged. NAPALM's own `get_users` has another shape and a stub on every driver, so a poll asking `hasattr` could not tell the two apart. Requires napalm-device-types 4.7.1 or later. ## [0.1.0] ### Added - `FreeBSDDriver` (`freebsd`) and `OpenBSDDriver` (`openbsd`) on a shared `BsdDriver`: SSH over exec channels (no PTY, real exit codes), root through `sudo -S` with the password on stdin. - Read side (NetOrk/netork#798): facts (SMBIOS through `kenv` on FreeBSD, `hw.*` sysctls on OpenBSD; uptime from `kern.boottime`), interfaces and their addresses (`ifconfig -a`), routes (`netstat -rn`), ARP (`arp -an`), users and groups, processes (`ps … lstart`), cron jobs (system crontab and the login user's). - `get_listening_sockets()` in the shape of `ListeningSocketsMixin`: FreeBSD through `sockstat`, OpenBSD through `fstat` as root and `netstat -an` without, which the reading reports as `attributed: False`. - Packages: `get_packages`, `install_package`, `uninstall_package`. FreeBSD's install bootstraps pkg on a classic system that never had it. - Updates: `get_available_updates`, with VuXML's verdict as `security` on FreeBSD and base-system patches as one `base-system` entry (OpenBSD `syspatch`, classic FreeBSD `freebsd-update`). A reader that cannot read raises instead of returning no updates (#4). - Services: `get_services` and `manage_service` (start, stop, restart, enable, disable) through `service` and `rcctl`. - SNMP: `run_device_action("fix_snmp")` installs net-snmp, writes the same configuration netOrk uses on Linux, starts the agent and asks it for sysDescr; `get_snmp_config` reports a running agent's community and port. - `get_host_status` (napalm-device-types' `HostStatusMixin`): on FreeBSD, "reboot required" when the installed kernel differs from the running one. - `first_boot_pending()`: whether a FreeBSD host is still in its first boot (`/firstboot`), so netOrk can wait before setting up a new VM (NetOrk/netork#795). - Parsers tested on output recorded from FreeBSD 15.1 (hand-installed and cloud image) and OpenBSD 7.9 (NetOrk/netork#793).