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,49 @@
|
||||
# napalm-bsd
|
||||
|
||||
NAPALM drivers for **FreeBSD** (`freebsd`) and **OpenBSD** (`openbsd`) hosts,
|
||||
over SSH, built on [napalm-device-types](https://git.netork.io/NAPALM/napalm-device-types)'
|
||||
`OSDriver`. Written for netOrk, which provisions and manages BSD VMs
|
||||
(NetOrk/netork#792).
|
||||
|
||||
## Design
|
||||
|
||||
- One shared `BsdDriver` (`napalm_bsd/base.py`) holds the SSH layer and every
|
||||
reader whose tools agree between the BSDs. `FreeBSDDriver` and
|
||||
`OpenBSDDriver` name only the commands that differ (hostname, release,
|
||||
kernel, hardware, `netstat -rnW` vs `-rn`).
|
||||
- Every command runs on its own SSH **exec channel** (`run_on_transport` from
|
||||
napalm-device-types): no PTY to parse a prompt from, stdout and stderr apart,
|
||||
a real exit status. `run_command()` / `open_stream()` are public
|
||||
(`CommandChannelMixin`).
|
||||
- Root comes from `sudo -S` with the sudo password on stdin (never on a command
|
||||
line), or `sudo -n` without one, as in napalm-linux. netOrk provisions `sudo`
|
||||
on BSD VMs for that reason; `doas` cannot read a password from stdin.
|
||||
- Parsing is in `napalm_bsd/parse.py`, pure functions tested on output recorded
|
||||
from real systems (`tests/fixtures/`, each directory's `COMMANDS.txt` lists
|
||||
what produced it).
|
||||
|
||||
## Supported getters
|
||||
|
||||
| Getter | FreeBSD | OpenBSD | Source |
|
||||
|---|---|---|---|
|
||||
| `get_facts` | ✓ | ✓ | `kern.hostname`/`hostname`, `freebsd-version`/`uname`, `kenv smbios.*`/`hw.*`, `kern.boottime` |
|
||||
| `get_interfaces`, `get_interfaces_ip` | ✓ | ✓ | `ifconfig -a` |
|
||||
| `get_route_to` | ✓ | ✓ | `netstat -rnW` / `netstat -rn` |
|
||||
| `get_arp_table` | ✓ | ✓ | `arp -an` |
|
||||
| `get_lldp_neighbors` | `{}` | `{}` | no LLDP daemon in either base system |
|
||||
| `get_users`, `get_processes`, `get_cron_jobs` | ✓ | ✓ | `/etc/passwd`+`/etc/group`, `ps … lstart`, system crontab + `crontab -l` |
|
||||
|
||||
Packages, services, updates (#799) and SNMP (#800) follow.
|
||||
|
||||
## Connection arguments
|
||||
|
||||
`optional_args`: `port` (22), `key_file`, `sudo_password`, `allow_agent`,
|
||||
`look_for_keys` (both off by default).
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
pip install "napalm-device-types @ git+https://git.netork.io/NAPALM/napalm-device-types.git"
|
||||
pip install -e ".[dev]"
|
||||
pytest
|
||||
```
|
||||
Reference in New Issue
Block a user