package main import ( "flag" "fmt" "os" "git.netcell-it.de/projekte/edgeguard-native/internal/cluster/clustertls" ) // cmdClusterRenewSelf: re-issued das eigene peer.{crt,key} mit der // lokalen Cluster-CA. Nur sinnvoll auf der Founder/Primary-Box wo die // CA-Key noch vorhanden ist; auf Joinern fehlt die ca.key (sie haben // nur die CA-Cert zum Verify) und der Aufruf scheitert. // // Usage: // edgeguard-ctl cluster-renew-self [--cn ] [--tls-dir ] // // Output: schreibt peer.crt + peer.key über das vorhandene peer.{crt, // key} hinweg. Restart-Hinweis am Ende. func cmdClusterRenewSelf(args []string) int { fs := flag.NewFlagSet("cluster-renew-self", flag.ContinueOnError) cn := fs.String("cn", "", "subject common name (default: aus dem aktuellen peer.crt geerbt)") tlsDir := fs.String("tls-dir", clustertls.DefaultDir, "where peer.{crt,key} live") fs.SetOutput(os.Stderr) if err := fs.Parse(args); err != nil { return 2 } store := clustertls.New(*tlsDir) if !store.HasCA() { fmt.Fprintln(os.Stderr, "edgeguard-ctl cluster-renew-self: no local CA found — this command works only on a founder/primary node.") return 1 } commonName := *cn if commonName == "" { if info, err := store.PeerCertInfo(); err == nil && info.CommonName != "" { commonName = info.CommonName } } if commonName == "" { h, _ := os.Hostname() commonName = h } if commonName == "" { commonName = "edgeguard-node" } if err := store.RenewSelfSigned(commonName, []string{commonName}, nil, nil); err != nil { fmt.Fprintf(os.Stderr, "edgeguard-ctl cluster-renew-self: %v\n", err) return 1 } info, _ := store.PeerCertInfo() fmt.Printf("Cluster-Peer-Cert erneuert.\n") fmt.Printf(" CN: %s\n", commonName) fmt.Printf(" Files: %s/peer.{crt,key}\n", *tlsDir) if info != nil { fmt.Printf(" Gültig bis: %s (%d Tage)\n", info.NotAfter, info.DaysRemaining) } fmt.Printf("\nDamit der Agent-Listener das neue Cert lädt:\n") fmt.Printf(" sudo systemctl restart edgeguard-api\n") return 0 }