From 09678d8eb862c5973eae847c807e454e8757550b Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Fri, 25 Aug 2023 17:40:42 +0000 Subject: [PATCH] WIP Signed-off-by: Alejandro Mery --- pkg/zones/machine.go | 18 ++++++++++++++ pkg/zones/machine_rings.go | 51 ++++++++++++++++++++++++++++++++++++++ pkg/zones/sync.go | 4 +-- pkg/zones/zone_rings.go | 51 +++++++++++++++++++++++++++++++++++++- 4 files changed, 121 insertions(+), 3 deletions(-) diff --git a/pkg/zones/machine.go b/pkg/zones/machine.go index 4f0c736..a1162e6 100644 --- a/pkg/zones/machine.go +++ b/pkg/zones/machine.go @@ -43,6 +43,24 @@ func (m *Machine) IsGateway() bool { return ok } +// SetGateway enables/disables a Machine ring0 integration +func (m *Machine) SetGateway(enabled bool) error { + ri, found := m.getRingInfo(0) + switch { + case !found && !enabled: + return nil + case !found: + var err error + + if ri, err = m.createRingInfo(0, false); err != nil { + return err + } + } + + ri.Enabled = enabled + return m.SyncWireguardConfig(0) +} + func (m *Machine) getPeerByName(name string) (*Machine, bool) { return m.zone.zones.GetMachineByName(name) } diff --git a/pkg/zones/machine_rings.go b/pkg/zones/machine_rings.go index bd67099..e1121c5 100644 --- a/pkg/zones/machine_rings.go +++ b/pkg/zones/machine_rings.go @@ -261,3 +261,54 @@ func (m *Machine) RemoveWireguardConfig(ring int) error { return err } + +// SyncWireguardConfig updates all wgN.conf files for the specified +// ring +func (m *Machine) SyncWireguardConfig(ring int) error { + return m.zone.SyncWireguardConfig(ring) +} + +func (m *Machine) WriteWireguardConfig(ring int) error { + r, err := m.zone.GetRing(ring) + if err != nil { + return err + } + + return m.writeWireguardRing(r) +} + +func (m *Machine) writeWireguardRing(r *Ring) error { + wg, err := r.ExportConfig(m.ID) + if err != nil { + return nil + } + + f, err := m.CreateTruncFile("wg%v.conf", r.Ring) + if err != nil { + return err + } + defer f.Close() + + _, err = wg.WriteTo(f) + return err +} + +func (m *Machine) createRingInfo(ring int, enabled bool) (*RingInfo, error) { + keys, err := wireguard.NewKeyPair() + if err != nil { + return nil, err + } + + ri := &RingInfo{ + Ring: ring, + Enabled: enabled, + Keys: keys, + } + + err = m.applyRingInfo(ring, ri) + if err != nil { + return nil, err + } + + return ri, nil +} 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 4bd2e3b..a55d969 100644 --- a/pkg/zones/zone_rings.go +++ b/pkg/zones/zone_rings.go @@ -1,6 +1,45 @@ package zones -import "os" +import ( + "os" + + "git.jpi.io/amery/jpictl/pkg/wireguard" +) + +type Ring struct { + Ring int +} + +func (*Ring) ExportConfig(_ int) (*wireguard.Config, error) { + return nil, nil +} + +func (*Zone) GetRing(_ int) (*Ring, error) { + return &Ring{}, nil +} + +// SyncWireguardConfig updates all wgN.conf files for the specified +// ring +func (z *Zone) SyncWireguardConfig(ring int) error { + err := z.PruneWireguardConfig(ring) + if err != nil { + return err + } + + r, err := z.GetRing(ring) + if err != nil { + return err + } + + z.ForEachMachine(func(p *Machine) bool { + if _, ok := p.getRingInfo(ring); ok { + err = p.writeWireguardRing(r) + } + return err != nil + }) + + return err +} // PruneWireguardConfig removes wgN.conf files of machines with // the corresponding ring disabled. @@ -59,3 +98,13 @@ func (m *Zones) WriteWireguardKeys(ring int) error { return err } + +// SyncWireguardConfig updates all wgN.conf files for the specified +// ring +func (m *Zones) SyncWireguardConfig(ring int) error { + err := m.PruneWireguardConfig(ring) + if err != nil { + return err + } + +}