CI / test (3.10) (push) Successful in 30s
CI / test (3.11) (push) Successful in 31s
CI / test (3.12) (push) Successful in 36s
CI / test (3.10) (pull_request) Successful in 40s
CI / test (3.11) (pull_request) Successful in 31s
CI / test (3.12) (pull_request) Successful in 33s
The driver accepted any SSH host key. It now verifies through napalm-device-types' HostKeyCheck (>= 4.19.0): with a known key in optional_args["ssh_host_keys"] any other key is refused before login, and every key seen is reported to optional_args["ssh_host_key_observer"]. Without either argument it connects as before (first use).
8.1 KiB
8.1 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
Security
- The SSH host key is verified (NetOrk/netork#1167).
open()hands netmiko the key the caller expects for the port inoptional_args["ssh_host_keys"](as aknown_hostsfile that exists only while it connects, withssh_strict), so any other key is refused before the login (SshHostKeyMismatch); without one netmiko accepts the first key. Every key seen goes tooptional_args["ssh_host_key_observer"]. OpenMediaVault and QNAP get this throughLinuxDriver.open(). Requires napalm-device-types 4.19.0; version 0.11.0.
Changed
- Breaking:
get_device_warningsis gone, and with it theapt_proxy_urlargument. The driver reports facts and the application names warnings (napalm-device-types 4.14):get_package_proxy()says which proxy apt fetches through; pending updates were always inget_available_updates(). Requires napalm-device-types 4.14.0; version 0.9.0.
Changed
- Breaking:
run_device_actionis gone, withfix_snmp,fix_apt_proxy,fix_docker_permissionsand the unusedapt_update_upgrade. The driver implements napalm-device-types 4.13's fix templates instead, and the caller supplies every value:configure_snmp_agent(settings)(onerocommunityline per allowed source, udp/161 opened in ufw or iptables for those sources only, each step judged by its exit status),configure_package_proxy(url),grant_container_engine_access(user)andensure_package(name). No community, contact, location or address of an application is built in any more. Requires napalm-device-types 4.13.0 or later; version 0.8.0. - The sudo hint names no application's settings.
Fixed
- The type annotations resolve:
Dict,ListandOptionalwere used without an import (#29).
Added
get_system_identity()(napalm-device-types 4.9SystemIdentityMixin): the host's SMBIOS system UUID, product serial and board serial, read as root on an exec channel, vendor placeholders empty. netOrk matches a server to its BMC on these. Requires napalm-device-types 4.9.0 or later; version 0.7.0.
Changed
- Requires napalm-device-types 4.7.1 or later; version 0.6.0.
- Breaking:
get_users()is nowget_os_users(), following napalm-device-types 4.7, which renamedOSDriver.get_usersbecause NAPALM's ownget_usershas another shape. The return value is unchanged (a list ofUserDict).get_users()is NAPALM's again and raisesNotImplementedError.
Fixed
- Listing updates on yum hosts (RHEL 7, CentOS 7) no longer fails with
napalm-device-types 4.7: its
parse_dnf_securityneeds the__DNF_RC=<status>lineDNF_SECURITY_COMMANDprints, and the yum security query had none, so it raisedValueError. The yum query now prints that marker the same way ({ ...; echo __DNF_RC=$?; } | cat). A yum or dnf security query that failed, or whose output was cut short before the marker, still leavessecurityunknown (None) instead of reporting no advisories.
Security
run_command(privileged=True, stdin=...)raisesValueErrorwhile a sudo password is set.sudo -Sreads the password from stdin, and a sudo that does not prompt (NOPASSWD, a cached timestamp) left it for the command, which read it as the first line of the data: netOrk wrote it into a file that way (NetOrk/netork#1029). Stage the data without privilege and have root install that file. Without a sudo password (sudo -n) or for a root login, stdin still goes to the command.- The sudo password is no longer typed into the interactive shell
(NetOrk/netork#1039). Every privileged command ran there as
echo '<password>' | sudo -S -p "" <command>: bash kept it in its history, so each poll wrote the password into the login user's~/.bash_history, and while the command ran it was in the process list for every local user. Privileged commands (_sudo,_sudo_status, and_run_privilegedwith a sudo password) now run on an exec channel likerun_command(privileged=True): the password reachessudo -Son stdin, there is no PTY to echo it, and the whole command runs as root in onesh -c(before, only the part up to the first;,&&or|did, somv … && chown root:root …failed its chown). The interactive session also switches its history off before its first command (unset HISTFILE; set +o history). History files written before this version may still hold the sudo password: remove those lines from the login user's~/.bash_historyon your hosts and consider changing the password._sudo_statustakes the exit status from the channel; it isNoneonly when the channel closed without one. - The snmpd and apt proxy fixes no longer stage their files at a fixed path in
/tmp (
/tmp/netork_snmpd.conf,/tmp/netork_00proxy) and thenmv,chownandchmodthem as root. Another local user could create that path first as a symlink, for example to/etc/shadow, and root'schown/chmodfollowed it. The content now goes to a freshmktempfile underumask 077, written without privilege, and rootinstalls it as a new file owned by root (mode 644) next to the target and renames it into place (_install_file_as_root). Nothing runs as root when staging failed. get_vpn_tunnels()without a sudo password no longer writeswg show all dump(which includes the interfaces' private keys) to the predictable/tmp/.netork_wg_<hash>; the dump comes straight from the exec channel.
[0.4.0] – 2026-10-08
Added
get_virtual_ips()through napalm-device-types'VirtualIpsMixin(4.2.0): the addresses vip-manager and keepalived configuration lets float onto this host, whether or not it holds them right now (NetOrk/netork#829). The command goes on the exec channel (run_command): with its awk filter it is about 4 kB, past the line the PTY reliably takes. Root first, then without it.
[0.3.0] – 2026-10-08
Removed
get_docker_info(),get_docker_outdated(),reconstruct_docker_run()and the_docker_bin()hook, with the image-ID helpers they used. netOrk reads and handles containers itself over the Engine API, throughopen_container_engine()(NetOrk/netork#765), and no longer calls them.run_device_action("fix_docker_permissions")stays: letting the login user use Docker is an OS action.
[0.2.0] – 2026-10-07
Added
run_command()andopen_stream(), the public command channel from napalm-device-types 2.6.0: an exec channel on the existing SSH transport, so no PTY, separate stderr and a real exit code.privileged=Trueruns as root directly, throughsudo -Swith the password on stdin (never on the command line), or throughsudo -n, which fails instead of prompting.ContainerEngineMixin:container_engines()andopen_container_engine(), whoseopen_api()streams the Docker Engine API overdocker system dial-stdio(NetOrk/netork#765). The existing Docker methods are unchanged.
Changed
- Requires napalm-device-types >= 2.6.0.
0.1.0 – 2026-05-29
Added
- Initial release
LinuxDriverinheriting fromnapalm_device_types.OSDriver- SSH transport via Netmiko
linuxdevice type - Auto-detection of package manager:
apt,dnf,yum,apk,pacman - Standard NAPALM methods:
get_facts(),get_interfaces(),get_interfaces_ip(),get_arp_table(),get_config(),ping() - OS-specific methods:
get_packages(),get_pending_updates(),apply_updates(),get_services(),get_users(),get_processes(),get_cron_jobs() apply_updates()validates all package names against^[a-zA-Z0-9_\-\+\.]+$to prevent shell injection before passing them to the package manager- SysV fallback for
get_services()on non-systemd systems - Unit tests with mocked SSH connections