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 --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 edgeguard-ctl cluster-setup-standby %s\n", primary) fmt.Printf(" → richtet die Logical Replication ein. OHNE diesen Schritt ist der\n") fmt.Printf(" Node zwar im Cluster, bekommt aber KEINE geteilte Config.\n") fmt.Printf(" 2) sudo systemctl restart edgeguard-api # lädt das neue Cert in den mTLS-Agent-Listener\n") fmt.Printf(" 3) Auf dem Primary in der Cluster-UI prüfen ob der neue Peer auftaucht\n") fmt.Printf("\nHinweis: Beim Join über den Setup-Wizard passiert Schritt 1 automatisch;\n") fmt.Printf("dieser CLI-Pfad ist der manuelle Weg und braucht ihn explizit.\n") return 0 }