From 3534e7b7553120fc2e636c3ade871e2280041bcc Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sat, 26 Aug 2023 18:08:59 +0000 Subject: [PATCH] zones: SyncWireguardConfig() as Prune+Write Signed-off-by: Alejandro Mery --- pkg/zones/wireguard.go | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/pkg/zones/wireguard.go b/pkg/zones/wireguard.go index c886c22..48fc419 100644 --- a/pkg/zones/wireguard.go +++ b/pkg/zones/wireguard.go @@ -14,6 +14,9 @@ var ( _ WireguardConfigWriter = (*Zone)(nil) _ WireguardConfigWriter = (*Machine)(nil) + _ WireguardConfigSyncer = (*Zones)(nil) + _ WireguardConfigSyncer = (*Zone)(nil) + _ WireguardKeysWriter = (*Zones)(nil) _ WireguardKeysWriter = (*Zone)(nil) _ WireguardKeysWriter = (*Machine)(nil) @@ -142,6 +145,61 @@ func (m *Machine) writeWireguardRingConfig(r *Ring) error { return err } +// A WireguardConfigSyncer updates all wgN.conf on all machines under +// its scope reflecting the state of the ring +type WireguardConfigSyncer interface { + SyncWireguardConfig(ring int) error +} + +// SyncWireguardConfig updates all wgN.conf files for the specified +// ring +func (m *Zones) SyncWireguardConfig(ring int) error { + switch ring { + case 0: + return syncWireguardConfig(m, m, ring) + case 1: + var err error + m.ForEachZone(func(z *Zone) bool { + err = syncWireguardConfig(m, z, ring) + return err != nil + }) + return err + default: + return fs.ErrInvalid + } +} + +// SyncWireguardConfig updates all wgN.conf files for the specified +// ring +func (z *Zone) SyncWireguardConfig(ring int) error { + switch ring { + case 0: + return syncWireguardConfig(z.zones, z.zones, ring) + case 1: + return syncWireguardConfig(z.zones, z, ring) + default: + return fs.ErrInvalid + } +} + +func syncWireguardConfig(z ZoneIterator, m MachineIterator, ring int) error { + r, err := NewRing(z, m, ring) + if err != nil { + return err + } + + r.ForEachMachine(func(p *Machine) bool { + if _, ok := p.getRingInfo(ring); ok { + err = p.writeWireguardRingConfig(r) + } else { + err = p.RemoveWireguardConfig(ring) + } + return err != nil + }) + + return err +} + // A WireguardKeysWriter writes the Wireguard Keys for all machines // under its scope for the specified ring type WireguardKeysWriter interface {