Add local and NetBox server notes and improve reliability
Release / release (push) Successful in 6m52s

This commit is contained in:
Sebastian Unterschütz committed 2026-10-27 17:51:59 +01:00
1 parent 2852dff2c4
commit 12cc64fdd9
17 files changed
+848 -83

No files matched your search

+39 -6
View File
@@ -19,6 +19,7 @@ import (
"git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/config"
"git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/hook"
"git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/netbox"
"git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/notes"
"git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/resolver"
"git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/setup"
"git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/shortcuts"
@@ -29,6 +30,7 @@ import (
// managedSubcommands are dispatched to cobra; everything else is treated as SSH wrapper mode.
var managedSubcommands = map[string]bool{
"configure": true,
"notes": true,
"search": true,
"cache": true,
"alias": true,
@@ -213,7 +215,8 @@ func runTUI() {
nbClient = netbox.NewClient(cfg.NetBox.URL, cfg.NetBox.Token, cfg.NetBox.TokenVersion)
}
m := tui.New(nbClient, c, cfg.SSH.DefaultUser)
m := tui.New(nbClient, c, cfg.SSH.DefaultUser, cfg.SSH.DefaultPort)
m.SetNotes(notes.New(cfg.NetBox.URL, nbClient))
p := tea.NewProgram(m, tea.WithAltScreen())
final, err := p.Run()
if err != nil {
@@ -229,6 +232,29 @@ func runTUI() {
return
}
// Revalidate stale or live TUI results through the configured resolver chain.
if cached, fresh := c.Get(host.Name); fresh {
host.IP = cached.IP
} else {
if nbClient == nil {
fatalf("cannot resolve %q: NetBox is not configured", host.Name)
}
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel()
target, err := nbClient.FindHost(ctx, host.Name, host.Kind)
if err != nil {
fatalf("NetBox: %v", err)
}
chain, err := resolver.New(cfg.Resolver)
if err != nil {
fatalf("resolver: %v", err)
}
host.IP, err = chain.Resolve(ctx, &target, nbClient)
if err != nil {
fatalf("IP resolution: %v", err)
}
c.Upsert(cache.Entry{Name: target.Name, IP: host.IP, Kind: target.Kind, Tags: target.Tags})
}
fmt.Fprintf(os.Stderr, "Connecting to %s (%s)…\n", host.Name, host.IP)
var sshArgs []string
@@ -289,7 +315,7 @@ func rootCmd() *cobra.Command {
},
}
root.AddCommand(configureCmd(), searchCmd(), cacheCmd(), aliasCmd(), hookCmd(), shellInitCmd())
root.AddCommand(notesCmd(), configureCmd(), searchCmd(), cacheCmd(), aliasCmd(), hookCmd(), shellInitCmd())
// cobra builds the "completion" command lazily; force init so we can extend it.
root.InitDefaultCompletionCmd()
@@ -493,7 +519,11 @@ func cacheRefreshCmd() *cobra.Command {
c := cache.New(cfg.Cache.Path, cfg.Cache.TTL)
_ = c.Load()
chain, _ := resolver.New(cfg.Resolver)
chain, err := resolver.New(cfg.Resolver)
if err != nil {
return fmt.Errorf("resolver: %w", err)
}
written := 0
for i := range entries {
e := &entries[i]
@@ -512,21 +542,24 @@ func cacheRefreshCmd() *cobra.Command {
if ip != "" {
c.Upsert(cache.Entry{Name: e.Name, IP: ip, Kind: e.Kind, Tags: e.Tags})
written++
}
}
if err := c.Save(); err != nil {
return err
}
if err := c.SetRefreshed(); err != nil {
fmt.Fprintf(os.Stderr, "warning: could not update refresh timestamp: %v\n", err)
if filterTag == "" && filterKind == "" {
if err := c.SetRefreshed(); err != nil {
fmt.Fprintf(os.Stderr, "warning: could not update refresh timestamp: %v\n", err)
}
}
if aliasEntries := buildAliasEntries(c, *cfg); len(aliasEntries) > 0 {
if err := hook.WriteAliasFiles(aliasEntries); err != nil {
fmt.Fprintf(os.Stderr, "warning: could not write alias files: %v\n", err)
}
}
fmt.Printf("%d entries written to cache.\n", len(entries))
fmt.Printf("%d entries written to cache.\n", written)
return nil
},
}