POST /setup/join-cluster macht alles was bisher edgeguard-ctl cluster-join tat: CSR generieren, Certs vom Primary holen, schreiben, auto-registrieren, Setup als Cluster-Node markieren. Setup-Wizard Node-Modus fragt jetzt direkt Primary-FQDN + Join-Token ab. Nach Submit: Erfolgsmeldung + einziger verbleibender Schritt (systemctl restart). Neue interne Bibliothek: internal/services/clusterjoin — wird von Handler und CLI (edgeguard-ctl cluster-join) gleichermaßen genutzt, keine Duplizierung. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
60 lines
1.9 KiB
Go
60 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
|
|
"git.netcell-it.de/projekte/edgeguard-native/internal/cluster/clustertls"
|
|
"git.netcell-it.de/projekte/edgeguard-native/internal/services/clusterjoin"
|
|
)
|
|
|
|
func cmdClusterJoin(args []string) int {
|
|
fs := flag.NewFlagSet("cluster-join", flag.ContinueOnError)
|
|
tokenFlag := fs.String("token", "", "cluster join token (eg-join-v1.…)")
|
|
insecure := fs.Bool("insecure", false, "skip TLS verification on the primary (bootstrap mode)")
|
|
cn := fs.String("cn", "", "subject common name (default: hostname)")
|
|
clusterTLSDir := fs.String("tls-dir", clustertls.DefaultDir, "where to write ca.crt + peer.{crt,key}")
|
|
fs.SetOutput(os.Stderr)
|
|
if err := fs.Parse(args); err != nil {
|
|
return 2
|
|
}
|
|
if fs.NArg() < 1 {
|
|
fmt.Fprintln(os.Stderr, "usage: edgeguard-ctl cluster-join <primary-fqdn-or-url> --token <…>")
|
|
return 2
|
|
}
|
|
if *tokenFlag == "" {
|
|
fmt.Fprintln(os.Stderr, "edgeguard-ctl cluster-join: --token required")
|
|
return 2
|
|
}
|
|
|
|
commonName := *cn
|
|
if commonName == "" {
|
|
h, _ := os.Hostname()
|
|
commonName = h
|
|
}
|
|
|
|
if err := clusterjoin.Join(clusterjoin.Request{
|
|
PrimaryFQDN: fs.Arg(0),
|
|
Token: *tokenFlag,
|
|
CommonName: commonName,
|
|
Insecure: *insecure,
|
|
TLSDir: *clusterTLSDir,
|
|
Version: version,
|
|
}); err != nil {
|
|
fmt.Fprintf(os.Stderr, "edgeguard-ctl cluster-join: %v\n", err)
|
|
return 1
|
|
}
|
|
|
|
primary, _ := clusterjoin.NormalizePrimaryURL(fs.Arg(0))
|
|
fmt.Printf("Cluster-Join erfolgreich.\n")
|
|
fmt.Printf(" Primary: %s\n", primary)
|
|
fmt.Printf(" CN: %s\n", commonName)
|
|
fmt.Printf(" Files: %s/{ca.crt,peer.crt,peer.key}\n", *clusterTLSDir)
|
|
fmt.Printf("\nNächste Schritte:\n")
|
|
fmt.Printf(" 1) sudo systemctl restart edgeguard-api # lädt das neue Cert ins mTLS-Agent-Listener\n")
|
|
fmt.Printf(" 2) Auf dem Primary in der Cluster-UI prüfen ob der neue Peer in /cluster/nodes auftaucht\n")
|
|
fmt.Printf(" 3) PG-Basebackup + KeyDB-Replica-Setup folgt mit Phase 3.5 (manuell bis dahin)\n")
|
|
return 0
|
|
}
|