Files
ssh-netbox-wrapper/CHANGELOG.md
Sebastian UnterschützandClaude Opus 5.5 dbb99bdded test: add a local Docker test environment for all features
testenv/ starts two real NetBox 4.7 instances (v2 and v1 token), SSH
targets on public, mgmt, and prod networks, a jump host, an IPv6-only
host, a static host, and a client with ssh, sftp, scp, tmux, zellij,
bash, zsh, and fish. A seed script fills NetBox through the REST API.

141 end-to-end checks cover cache and refresh filters, connecting,
all resolver strategies, multiple instances, shortcuts and rewrites,
SSH options and rules, static hosts, sftp/scp incl. IPv6 and jump
hosts, tunnels, local notes and NetBox comments, completion and shell
hooks, the TUI (driven through tmux), the configurator, and uninstall.

Local only: testenv/up.sh, test.sh, shell.sh, down.sh. Not part of
CI/CD.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-14 12:30:24 +01:00

125 lines
9.4 KiB
Markdown

# Changelog
## Unreleased
- Fix the `interface_name` resolver strategy: it sent filter names that NetBox ignores and therefore returned the host's first IP address instead of the named interface's. It now uses NetBox's `interface` and `vminterface` filters; a missing interface falls through to the next strategy.
- Fix `netssh sftp` and `netssh scp` with instance-qualified hosts (`prod/web01:/path`), which were taken for local paths.
- Fix shell aliases of instance-qualified hosts ignoring anchored rewrite rules (`fsn_fsn1-pve1` instead of `fsn_fsnpve1`).
- Add `testenv/`, a local Docker environment with two NetBox instances, SSH targets, a jump host, tmux, zellij, and bash/zsh/fish, and 141 end-to-end checks of all features (`testenv/up.sh`, `testenv/test.sh`). Not part of CI/CD.
## v0.0.23
- `netssh configure` now covers every setting: after the instances, a menu opens with SSH defaults, SSH options (jump host, host key checking, connection target, address family, extra arguments, `-o` options), SSH rules (add, edit, remove by tag, instance, kind, name pattern), resolver & cache (including the cache file), shortcuts & command alias, and completion (`max_results`). SSH options can also be set per NetBox instance from the instance list.
- Fix `netssh configure` dropping global SSH options, `ssh.rules`, and `completion.max_results` from the config file when saving.
- The configurator validates SSH options and rules before writing the config.
- Add `shortcuts.rewrites`: regex rules that shorten hostnames, e.g. `^([a-z]+)[0-9]+-` → `$1` turns `fsn1-bx1.hoster.de` into `fsnbx1`. Shortcuts work for connecting, shell aliases, and Tab completion (offered when the full name does not match), and can be edited in `netssh configure`.
- Add `netssh alias --test HOSTNAME` to show the shortcut of a name and the cached hosts it matches.
- Add `netssh sftp` and `netssh scp`: host lookup, shortcuts, instances, default user and port, SSH options and rules, jump host, `--dry-run`, and completion work as for ssh. IPv6 addresses are bracketed for host:path.
- Add named port forwards (`ssh.forwards` globally, per instance, and per rule), `netssh tunnel HOST NAME|SPEC...` (ssh -N with ExitOnForwardFailure), and `netssh --forward NAME`. Forwards are editable in `netssh configure` and completed in the shell.
- TUI: `Ctrl+O` opens SFTP, `Ctrl+T` starts a tunnel with configured or ad hoc forwards.
- Add the `hostname` resolver strategy: connect by the NetBox name (plus optional `resolver.hostname_domain`) instead of an IP, always or as a fallback after `primary_ip`.
- Add static hosts (`hosts:`) for machines that are not in NetBox, with user, port, tags, and SSH options, managed with `netssh hosts list|add|remove` and in `netssh configure`. They are found before NetBox, work offline and without any NetBox, and support shortcuts, rules (`kind: static`), completion, aliases, sftp, scp, tunnels, and the TUI.
- Fix options added by netssh landing after `--` (`netssh --no-jump -- host`), where ssh read them as the destination.
## v0.0.22
- Fix shell completion with multiple NetBox instances: typing a hostname without an instance prefix (`fsn1-bx1<Tab>`) found nothing in bash and zsh, because only `prod/…` was offered. Hostnames that are unique across all instances are now offered without the prefix; connecting to them still checks every instance for ambiguous names.
- zsh also accepts instance-qualified matches for the typed hostname, so names that exist in several instances are offered as `prod/…` and `stg/…`.
## v0.0.21
- Ship a zsh completion script built for large caches: 5000 hosts complete in under 0.1 s instead of hanging for seconds with Cobra's generated script.
- Add `completion.max_results` to limit the number of hostnames offered per completion.
- Register zsh completion in the managed `.zshrc` block (`fpath` and `compdef`), also when `compinit` already ran, e.g. with oh-my-zsh. The installer reports which completions it set up.
- Add `netssh uninstall [--keep-config] [--dry-run] [--yes]` to remove the binary, profile entries of all versions, completions, cache, and config (with a private backup).
- Write marked `# >>> netssh >>>` blocks from `netssh hook install` and the wizard, replacing unmarked entries of older versions instead of appending.
- Add jump host support: `ssh.proxy_jump` globally, per NetBox instance, and per rule, plus `--jump HOST` and `--no-jump`.
- Add `ssh.host_key_checking` (`strict`, `accept-new`, `off`) for netssh connections only.
- Add `ssh.target: name|hostname` so `~/.ssh/config` host patterns apply and known_hosts entries belong to the device, and `ssh.address_family`.
- Add `ssh.options` and `ssh.extra_args`, and `ssh.rules` that match by tag, instance, kind, or name pattern.
- Add `netssh --version` / `netssh version` and `netssh --dry-run` to print the final ssh command.
## v0.0.20
- Configure multiple named NetBox instances and search them together in parallel.
- Add, edit, and remove instances in the interactive setup wizard while retaining legacy single-instance configuration support.
- Display instance-qualified hostnames and support `instance/hostname` for SSH, completion, aliases, and notes.
- Keep credentials, IP resolution, comments, cache entries, and local notes tied to the correct instance.
- Preserve partial interactive search results with an outage warning; reject incomplete full refreshes and ambiguous direct connections.
- Add `cache refresh --instance NAME` and isolate caches when configured endpoints change.
- Add regression tests covering duplicate names and IDs across instances, outages, SSH routing, notes, aliases, and configuration round trips.
## v0.0.19
- Update Ultraviolet to commit `a45b7c8`.
## v0.0.18
- Require Go 1.27.3 and migrate Bubbles, Bubble Tea, Huh, and Lip Gloss to their v2 modules under `charm.land`.
- Update TUI rendering and keyboard events for Bubble Tea v2 while preserving alternate-screen behavior.
- Route paste events to the focused editor, size input fields explicitly, and keep host lists within the terminal height.
- Reject ambiguous cached shortcuts and skip duplicate hostnames during cache refresh.
- Use paginated, unambiguous host lookups for SSH connections.
- Accept shortcut domains with or without a leading dot during cold lookups.
- Parse combined SSH options and preserve explicit users and ports supplied through `-o`.
- Merge cache changes under a file lock to preserve updates from concurrent processes.
- Honor configured resolver strategies during refresh and remove entries that no longer resolve safely.
- Check the host kind before reusing a cached IP for a TUI selection.
## v0.0.17
- Update Go module dependencies to the latest versions within their existing module paths, including used transitive test dependencies.
- Remove obsolete indirect requirements and refresh module checksums with `go mod tidy`.
## v0.0.16
- Enable Bash, Zsh, and Fish completion for the configured command alias, such as `j`.
- Update or remove generated alias completion files when the command alias changes.
## v0.0.15
- Use `https://git.zb-server.de` for release download links and API requests instead of the runner's internal Gitea service URL.
## v0.0.14
- Enable Renovate updates for indirect Go modules as well as direct dependencies and CI actions.
- Enable Go version updates and keep Go module metadata tidy after dependency updates.
- Correct direct and indirect dependency declarations in `go.mod`.
- Include `install.sh` as a downloadable release asset.
- Include the installer in `checksums.txt` alongside the platform binaries.
- Link the installation command in release notes directly to the release's installer asset.
- Generate a change list from commits since the previous version tag for every release.
## v0.0.13
- Translate the remaining German setup message and test example into English.
- Correct the connection editor comment to reference `Ctrl+E`.
## v0.0.12
- Support updating an existing installation by running the installer again.
- Remove the installer's Python dependency.
- Require valid SHA-256 checksums before replacing the binary.
- Check required programs before downloading and list missing dependencies.
- Check for `sudo` before downloading when the installation directory requires elevated permissions.
- Consolidate legacy shell hooks and aliases in Bash, Zsh, and Fish profiles.
- Back up changed profiles and preserve symlinks and file permissions.
- Regenerate aliases and completions during installation and updates.
- Add a configurable command alias, such as `j`, to the setup wizard.
- Refresh or remove the generated command alias when its configuration changes.
## v0.0.11
- Add multiline local server notes and optional NetBox comments in the TUI.
- Add CLI commands to show, replace, and append server notes.
- Keep local notes separate from the host cache, with private permissions and atomic writes.
- Use NetBox ETags for comment conflict protection when supported by the server.
- Correct authentication for NetBox v2 tokens.
- Fix environment variable overrides for configuration keys.
- Preserve usage history when refreshing cached hosts.
- Discard stale TUI search results and use `Ctrl+E` for connection editing.
- Validate port overrides and preserve an explicit port 22.
- Resolve stale and live TUI selections through the configured resolver chain.
- Reject incomplete full cache refreshes and avoid marking filtered refreshes as full refreshes.
- Stop interpreting remote command flags as SSH options when applying defaults.