feat: add notnet crate and YubikeySource, thread Tailscale into notstrap

- New crates/notnet: TailscaleOptions, ensure_connected(), auth key chain
  (TS_AUTHKEY env → YubiKey PIV 9d → interactive prompt), install via
  apt/brew/pacman or official install.sh, peer reachability verification
- notsecrets: YubikeySource implementing IdentitySource, reads age key from
  PIV slot 9c; gated behind optional `yubikey` feature
- notstrap: Tailscale step inserted between prerequisites and clone;
  BootstrapOptions.tailscale controls override/skip; NotstrapConfig gains
  optional [tailscale] section; dotfiles_repo is now Option<String> (Tailscale
  gitea_url takes precedence); identity chain adds YubikeySource before
  Bitwarden
- Updated workspace Cargo.toml: notnet added to members and workspace deps
- Integration tests: tailscale: Some(None) to skip Tailscale in all test opts
This commit is contained in:
Joseph O'Brien
2026-04-17 00:01:50 -04:00
parent dfdd9ca6d3
commit c7c074d48b
20 changed files with 797 additions and 6 deletions

View File

@@ -69,6 +69,7 @@ fn make_opts(env: &TestEnv, force: bool) -> BootstrapOptions {
force,
key_file: Some(env.key_file.clone()),
dotfiles: Some(env.dotfiles.path().to_path_buf()),
tailscale: Some(None), // skip Tailscale in tests
check_prereqs: None,
env_injector: None,
}
@@ -216,6 +217,7 @@ fn test_bootstrap_fails_fast_on_bad_key() {
force: false,
key_file: Some(PathBuf::from("/nonexistent/no-such-key.age")),
dotfiles: Some(d.to_path_buf()),
tailscale: Some(None), // skip Tailscale in tests
check_prereqs: None,
env_injector: None,
};