Files
HostKeeper/cmd/hostkeeper/tui.go
T
swanadiva 94f2142d3d feat: encryption password prompt + --encrypt flag
- PasswordPromptTab: setup/unlock modes, password + confirm fields
- --encrypt flag: shows password prompt on TUI startup
- Model.ShowEncryptPrompt() triggers prompt on first render
- passwordSetMsg stores password in Model.storagePassword
- Tab interface: added Close() method to PasswordPromptTab
2026-06-25 13:38:59 +07:00

78 lines
1.7 KiB
Go

package main
import (
"context"
"fmt"
tea "github.com/charmbracelet/bubbletea"
"github.com/spf13/cobra"
"git.tukangketik.id/swanadiva/hostkeeper/pkg/config"
"git.tukangketik.id/swanadiva/hostkeeper/pkg/knownhosts"
"git.tukangketik.id/swanadiva/hostkeeper/pkg/storage"
"git.tukangketik.id/swanadiva/hostkeeper/pkg/tui"
)
var encryptFlag bool
// tuiCmd represents the tui command
var tuiCmd = &cobra.Command{
Use: "tui",
Short: "Launch terminal user interface",
Long: `Launch an interactive terminal user interface for managing SSH hosts and connections.`,
RunE: runTUI,
}
func init() {
rootCmd.AddCommand(tuiCmd)
tuiCmd.Flags().BoolVar(&encryptFlag, "encrypt", false, "Enable AES-256-GCM encryption for sensitive data")
}
func runTUI(cmd *cobra.Command, args []string) error {
cfg := appCfg
if cfg == nil {
var err error
cfg, err = config.New()
if err != nil {
return fmt.Errorf("failed to initialize config: %w", err)
}
}
store, err := storage.NewJSONStorage(cfg.GetDataDir())
if err != nil {
return fmt.Errorf("failed to initialize storage: %w", err)
}
// Initialize known_hosts
kh, err := knownhosts.New(cfg.GetDataDir())
if err != nil {
fmt.Printf("Warning: failed to load known_hosts: %v\n", err)
}
ctx := context.Background()
hosts, err := store.ListHosts(ctx)
if err != nil {
return fmt.Errorf("failed to load hosts: %w", err)
}
model := tui.New()
model.SetDataDir(cfg.GetDataDir())
model.LoadHosts(hosts)
if kh != nil {
model.SetKnownHosts(kh)
}
// If --encrypt flag, show password prompt first
if encryptFlag {
model.ShowEncryptPrompt()
}
p := tea.NewProgram(model)
model.SetProgram(p)
if _, err := p.Run(); err != nil {
return fmt.Errorf("failed to run TUI: %w", err)
}
return nil
}