From 8ae28b34747d19b84a97f2753dbddeafedd47a54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Untersch=C3=BCtz?= Date: Sat, 23 May 2026 13:12:35 +0200 Subject: [PATCH] feat: persist token_version in config, auto-detect on load - NetBoxConfig.TokenVersion saved to netssh.yaml by the wizard - config.Load() auto-detects the version from the token prefix if the field is missing (backwards-compatible with existing configs) Co-Authored-By: Claude Sonnet 4.6 --- internal/config/config.go | 14 ++++++++++++-- internal/setup/wizard.go | 9 ++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 4c03a2c..78d1998 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path/filepath" + "strings" "github.com/spf13/viper" ) @@ -16,8 +17,9 @@ type Config struct { } type NetBoxConfig struct { - URL string `mapstructure:"url"` - Token string `mapstructure:"token"` + URL string `mapstructure:"url"` + Token string `mapstructure:"token"` + TokenVersion int `mapstructure:"token_version"` } type ResolverConfig struct { @@ -73,6 +75,14 @@ func Load() (*Config, error) { return nil, fmt.Errorf("parsing config: %w", err) } + if cfg.NetBox.TokenVersion == 0 && cfg.NetBox.Token != "" { + if strings.HasPrefix(cfg.NetBox.Token, "nbt_") { + cfg.NetBox.TokenVersion = 2 + } else { + cfg.NetBox.TokenVersion = 1 + } + } + if cfg.Cache.Path == "" { cacheDir, err := os.UserCacheDir() if err != nil { diff --git a/internal/setup/wizard.go b/internal/setup/wizard.go index 00920fe..f542e0b 100644 --- a/internal/setup/wizard.go +++ b/internal/setup/wizard.go @@ -103,7 +103,8 @@ func RunWizard(cfg *config.Config) error { return err } - if netbox.TokenVersion(token) == 1 { + tokenVersion := netbox.TokenVersion(token) + if tokenVersion == 1 { fmt.Fprintln(os.Stderr, "\nHinweis: Du verwendest einen Legacy-Token (v1). Erstelle in NetBox einen v2-Token (beginnt mit nbt_) für bessere Kompatibilität.") fmt.Fprintln(os.Stderr, " NetBox → Admin → API Tokens → Add Token") } @@ -119,8 +120,9 @@ func RunWizard(cfg *config.Config) error { out := config.Config{ NetBox: config.NetBoxConfig{ - URL: strings.TrimRight(strings.TrimSpace(url), "/"), - Token: strings.TrimSpace(token), + URL: strings.TrimRight(strings.TrimSpace(url), "/"), + Token: strings.TrimSpace(token), + TokenVersion: tokenVersion, }, SSH: config.SSHConfig{ DefaultUser: strings.TrimSpace(defaultUser), @@ -148,6 +150,7 @@ func save(cfg config.Config) error { b.WriteString("netbox:\n") b.WriteString(fmt.Sprintf(" url: %q\n", cfg.NetBox.URL)) b.WriteString(fmt.Sprintf(" token: %q\n", cfg.NetBox.Token)) + fmt.Fprintf(&b, " token_version: %d\n", cfg.NetBox.TokenVersion) b.WriteString("\nresolver:\n") b.WriteString(" strategies:\n")