From 236af793b9f577b4250fdf2d2ea4d7db08fec29d Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sat, 26 Aug 2023 16:41:49 +0000 Subject: [PATCH] zones: SyncWireguardConfig() as Prune+Write Signed-off-by: Alejandro Mery --- pkg/zones/sync.go | 4 +-- pkg/zones/zone_rings.go | 66 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/pkg/zones/sync.go b/pkg/zones/sync.go index 76e3776..71b8951 100644 --- a/pkg/zones/sync.go +++ b/pkg/zones/sync.go @@ -18,12 +18,12 @@ func (m *Zones) SyncAllWireguard() error { var err error for ring := 0; ring < RingsCount; ring++ { - err = m.PruneWireguardConfig(ring) + err = m.WriteWireguardKeys(ring) if err != nil { return err } - err = m.WriteWireguardKeys(ring) + err = m.SyncWireguardConfig(ring) if err != nil { return err } diff --git a/pkg/zones/zone_rings.go b/pkg/zones/zone_rings.go index 25db1bc..714a5c0 100644 --- a/pkg/zones/zone_rings.go +++ b/pkg/zones/zone_rings.go @@ -1,6 +1,34 @@ package zones -import "os" +import ( + "io/fs" + "os" +) + +var ( + _ machineRinger = (*Zone)(nil) + _ machineRinger = (*Zones)(nil) +) + +type machineRinger interface { + MachineIterator + + SyncWireguardConfig(ring int) error + PruneWireguardConfig(ring int) error +} + +// 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 + } +} // PruneWireguardConfig removes wgN.conf files of machines with // the corresponding ring disabled. @@ -13,6 +41,24 @@ func (z *Zone) WriteWireguardKeys(ring int) error { return writeWireguardKeys(z, ring) } +// 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 + } +} + // PruneWireguardConfig removes wgN.conf files of machines with // the corresponding ring disabled on all zones func (m *Zones) PruneWireguardConfig(ring int) error { @@ -24,6 +70,24 @@ func (m *Zones) WriteWireguardKeys(ring int) error { return writeWireguardKeys(m, ring) } +func syncWireguardConfig(z ZoneIterator, m machineRinger, ring int) error { + r, err := NewRing(z, m, ring) + if err != nil { + return err + } + + m.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 +} + func pruneWireguardConfig(m MachineIterator, ring int) error { var err error