Sprint 6: JSON file persistence + real SSH terminal + V1 crypto/knownhosts integration

- go.mod replace directive for git.tukangketik.id/swanadiva/hostkeeper → ../../v1
- store/ package: JSON file persistence for hosts, snippets, keys, settings
  (~/Library/Application Support/hostkeeper/v2/)
- model SSH fields: Hostname, Port, Username, AuthType, Password, KeyID
- sshconn/ package: real SSH client via golang.org/x/crypto/ssh
- Terminal WS: real SSH connection with fallback to mock shell
- Dynamic host list in terminal (server-rendered JSON script tag)
- All mock data defaults removed from model packages
- Settings persist via store/settings.go
This commit is contained in:
swanadiva
2026-07-07 13:53:50 +07:00
parent 04d9cfb096
commit fd7361aa14
21 changed files with 746 additions and 306 deletions
+5 -4
View File
@@ -3,23 +3,24 @@ package handler
import (
"github.com/gofiber/fiber/v2"
"git.tukangketik.id/swanadiva/hostkeeper/v2/internal/model"
"git.tukangketik.id/swanadiva/hostkeeper/v2/internal/store"
)
var deviceStore = model.NewDeviceStore()
var configStore = model.NewConfigStore()
var settingsStore = store.NewSettingsStore()
func Settings(c *fiber.Ctx) error {
return c.Render("settings", fiber.Map{
"View": "settings",
"Title": "Settings",
"Config": configStore.Get(),
"Config": settingsStore.Get(),
"Devices": deviceStore.All(),
"NavItems": navItems,
})
}
func UpdateConfig(c *fiber.Ctx) error {
cfg := configStore.Get()
cfg := settingsStore.Get()
if v := c.FormValue("theme"); v != "" { cfg.Theme = v }
if v := c.FormValue("fontSize"); v != "" { cfg.FontSize = parseInt(v, 14) }
if v := c.FormValue("scrollback"); v != "" { cfg.Scrollback = parseInt(v, 5000) }
@@ -29,7 +30,7 @@ func UpdateConfig(c *fiber.Ctx) error {
cfg.BellEnabled = c.FormValue("bellEnabled") == "on"
cfg.AutoReconnect = c.FormValue("autoReconnect") == "on"
cfg.BlinkCursor = c.FormValue("blinkCursor") == "on"
configStore.Update(cfg)
settingsStore.Update(cfg)
return c.Redirect("/settings", 303)
}