helmd hub: central server på Pi5 + agent-uplink + helmd ctl + web-login
Hub-läge i samma binär (doc/hub-plan.md): agenter ansluter utåt med delad agent-nyckel (hub-sektion i config.json), web-/CLI-klienter loggar in (lokala konton, pbkdf2; Authenticator-interface för LDAP senare) och styr alla agenters sessioner via proxy + merged SSE. Webbklienten autodetekterar hub/local via /api/mode. Nya kommandon: helmd hub [setpass|users|agentkey], helmd ctl (login/agents/sessions/ prompt/screen/answer/events …). Enhetstester + scripts/run-hub-smoke.sh (15-stegs e2e: hub + agent + ctl). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011KikHkfCiC3yELbsMN8fT9
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
@@ -11,6 +12,7 @@ import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -66,6 +68,16 @@ func main() {
|
||||
}
|
||||
fmt.Printf("delad: %s (id %s)\n%s/api/shares/%s/raw\n", filepath.Base(fs.Arg(0)), id, *server, id)
|
||||
|
||||
case "hub":
|
||||
if err := runHub(os.Args[2:]); err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
|
||||
case "ctl":
|
||||
if err := runCtl(os.Args[2:]); err != nil {
|
||||
fatal(err)
|
||||
}
|
||||
|
||||
case "version", "--version", "-v":
|
||||
fmt.Println("helmd", version)
|
||||
|
||||
@@ -75,13 +87,95 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
// runHub hanterar hub-subkommandona: starta hubben eller administrera
|
||||
// dess konton/agent-nyckel.
|
||||
func runHub(args []string) error {
|
||||
if len(args) > 0 && !strings.HasPrefix(args[0], "-") {
|
||||
switch args[0] {
|
||||
case "setpass":
|
||||
fs := flag.NewFlagSet("hub setpass", flag.ExitOnError)
|
||||
confPath := fs.String("config", hubConfigPath(), "sökväg till hub.json")
|
||||
password := fs.String("password", "", "lösenord (utelämna för att läsa från stdin)")
|
||||
fs.Parse(args[1:])
|
||||
if fs.NArg() != 1 {
|
||||
return fmt.Errorf("användning: helmd hub setpass <användare> [--password PW]")
|
||||
}
|
||||
cfg, err := loadHubConfig(*confPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pw := *password
|
||||
if pw == "" {
|
||||
fmt.Fprintf(os.Stderr, "nytt lösenord för %s (syns när du skriver): ", fs.Arg(0))
|
||||
sc := bufio.NewScanner(os.Stdin)
|
||||
if sc.Scan() {
|
||||
pw = strings.TrimSpace(sc.Text())
|
||||
}
|
||||
}
|
||||
if err := cfg.SetPassword(fs.Arg(0), pw); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := cfg.Save(); err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf("lösenord satt för %s — starta om hubben så att det börjar gälla\n", fs.Arg(0))
|
||||
return nil
|
||||
|
||||
case "users":
|
||||
fs := flag.NewFlagSet("hub users", flag.ExitOnError)
|
||||
confPath := fs.String("config", hubConfigPath(), "sökväg till hub.json")
|
||||
fs.Parse(args[1:])
|
||||
cfg, err := loadHubConfig(*confPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, u := range cfg.Users {
|
||||
fmt.Println(u.Username)
|
||||
}
|
||||
return nil
|
||||
|
||||
case "agentkey":
|
||||
fs := flag.NewFlagSet("hub agentkey", flag.ExitOnError)
|
||||
confPath := fs.String("config", hubConfigPath(), "sökväg till hub.json")
|
||||
fs.Parse(args[1:])
|
||||
cfg, err := loadHubConfig(*confPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Println(cfg.AgentKey)
|
||||
return nil
|
||||
|
||||
default:
|
||||
return fmt.Errorf("okänt hub-kommando %q (setpass, users, agentkey — eller flaggor för att starta)", args[0])
|
||||
}
|
||||
}
|
||||
|
||||
fs := flag.NewFlagSet("hub", flag.ExitOnError)
|
||||
listen := fs.String("listen", "", "override listen-adress (t.ex. 0.0.0.0:8790)")
|
||||
confPath := fs.String("config", hubConfigPath(), "sökväg till hub.json")
|
||||
fs.Parse(args)
|
||||
cfg, err := loadHubConfig(*confPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if *listen != "" {
|
||||
cfg.Listen = *listen
|
||||
}
|
||||
return hubServe(cfg)
|
||||
}
|
||||
|
||||
func usage() {
|
||||
fmt.Fprintln(os.Stderr, `helmd — agent-helm-server: styr en CLI-agent i tmux via REST-API
|
||||
fmt.Fprintln(os.Stderr, `helmd — agent-helm: styr CLI-agenter i tmux via REST-API + hub
|
||||
|
||||
användning:
|
||||
helmd serve [--listen host:port] [--config fil] starta servern
|
||||
helmd serve [--listen host:port] [--config fil] starta agent-servern
|
||||
helmd share [--note text] [--session namn] <fil> dela en fil till klienterna
|
||||
helmd token skriv ut API-token
|
||||
helmd hub [--listen host:port] [--config fil] starta hubben (Pi5)
|
||||
helmd hub setpass <användare> [--password PW] sätt/skapa hub-konto
|
||||
helmd hub users lista hub-konton
|
||||
helmd hub agentkey skriv ut agent-nyckeln
|
||||
helmd ctl <kommando> CLI-styrklient mot hubben
|
||||
helmd version`)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user