- GET /wireguard/importable listet alle .conf-Dateien in /etc/wireguard/ mit already_in-Flag (bereits in DB) - POST /wireguard/import nimmt optionale Names-Liste; ohne Namen → alles - edgeguard-ctl wg-import [iface…] importiert nur die genannten Interfaces - UI: Checkbox-Modal mit "Alle neuen auswählen" + Einzelauswahl; bereits importierte Interfaces disabled + grüner Tag Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
65 lines
2.0 KiB
Go
65 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"git.netcell-it.de/projekte/edgeguard-native/internal/database"
|
|
"git.netcell-it.de/projekte/edgeguard-native/internal/services/secrets"
|
|
"git.netcell-it.de/projekte/edgeguard-native/internal/services/wireguard"
|
|
)
|
|
|
|
// cmdWGImport reads /etc/wireguard/*.conf (or a custom dir via
|
|
// --path) and translates each [Interface]+[Peer] block into rows in
|
|
// wireguard_interfaces / wireguard_peers. Idempotent: ifaces with a
|
|
// name that already exists in the DB are skipped (no overwrite).
|
|
//
|
|
// Use after a fresh EdgeGuard install on a box that already had a
|
|
// hand-rolled WireGuard setup — keeps existing tunnels live across
|
|
// the migration. After import, run `edgeguard-ctl render-config` to
|
|
// re-emit the conf files under /etc/edgeguard/wireguard/ and start
|
|
// the wg-quick@ units. The original /etc/wireguard files are left
|
|
// in place for fallback.
|
|
func cmdWGImport(args []string) int {
|
|
fs := flag.NewFlagSet("wg-import", flag.ExitOnError)
|
|
path := fs.String("path", "/etc/wireguard", "directory holding *.conf files")
|
|
if err := fs.Parse(args); err != nil {
|
|
return 2
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
pool, err := database.Open(ctx, database.ConnStringFromEnv())
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "wg-import: open db:", err)
|
|
return 1
|
|
}
|
|
defer pool.Close()
|
|
|
|
box := secrets.New("")
|
|
im := wireguard.NewImporter(
|
|
wireguard.NewInterfacesRepo(pool),
|
|
wireguard.NewPeersRepo(pool),
|
|
box,
|
|
)
|
|
// Positional args after flags = specific interface names to import.
|
|
names := fs.Args()
|
|
res, err := im.ImportSelected(ctx, *path, names)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "wg-import:", err)
|
|
return 1
|
|
}
|
|
fmt.Printf("wg-import: %d ifaces added, %d peers added\n", res.IfacesAdded, res.PeersAdded)
|
|
for _, s := range res.Skipped {
|
|
fmt.Printf(" skipped: %s\n", s)
|
|
}
|
|
if res.IfacesAdded > 0 {
|
|
fmt.Println("\nNext: edgeguard-ctl render-config (re-emits configs + starts wg-quick@<iface>)")
|
|
}
|
|
return 0
|
|
}
|