From bd307db0d3741a4d48b791518d82b4df4651175c Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Thu, 24 Aug 2023 21:48:00 +0000 Subject: [PATCH] WIP Signed-off-by: Alejandro Mery --- pkg/zones/env.go | 31 ++++++++++------------ pkg/zones/machine.go | 23 ++++++++++++++++ pkg/zones/machine_rings.go | 54 ++++++++++++++++++++++++++++++++++++++ pkg/zones/zones.go | 25 ++++++++++++++++++ 4 files changed, 116 insertions(+), 17 deletions(-) diff --git a/pkg/zones/env.go b/pkg/zones/env.go index a28496e..174780e 100644 --- a/pkg/zones/env.go +++ b/pkg/zones/env.go @@ -10,18 +10,21 @@ import ( // WriteEnv generates environment variables for shell scripts func (m *Zones) WriteEnv(w io.Writer) error { var buf bytes.Buffer + var err error m.writeEnvVarFn(&buf, genEnvZones, "ZONES") m.ForEachZone(func(z *Zone) bool { - m.writeEnvZone(&buf, z) - return false + err = m.writeEnvZone(&buf, z) + return err != nil }) - _, err := buf.WriteTo(w) + if err == nil { + _, err = buf.WriteTo(w) + } return err } -func (m *Zones) writeEnvZone(w io.Writer, z *Zone) { +func (m *Zones) writeEnvZone(w io.Writer, z *Zone) error { zoneID := z.ID // ZONE{zoneID} @@ -35,8 +38,11 @@ func (m *Zones) writeEnvZone(w io.Writer, z *Zone) { m.writeEnvVar(w, fmt.Sprintf("%v", gatewayID), "ZONE%v_%s", zoneID, "GW") // ZONE{zoneID}_IP - ip, _ := RingZeroAddress(zoneID, gatewayID) - m.writeEnvVar(w, ip.String(), "ZONE%v_%s", zoneID, "IP") + if ip, ok := RingZeroAddress(zoneID, gatewayID); ok { + m.writeEnvVar(w, ip.String(), "ZONE%v_%s", zoneID, "IP") + } + + return nil } func (m *Zones) writeEnvVarFn(w io.Writer, fn func(*Zones) string, name string, args ...any) { @@ -79,13 +85,9 @@ func genEnvZoneNodes(z *Zone) string { } func getRingZeroGatewayID(z *Zone) int { - var firstNodeID, gatewayID int + var gatewayID int z.ForEachMachine(func(p *Machine) bool { - if firstNodeID == 0 { - firstNodeID = p.ID - } - if p.IsGateway() { gatewayID = p.ID } @@ -93,10 +95,5 @@ func getRingZeroGatewayID(z *Zone) int { return gatewayID != 0 }) - switch { - case gatewayID == 0: - return firstNodeID - default: - return gatewayID - } + return gatewayID } diff --git a/pkg/zones/machine.go b/pkg/zones/machine.go index f9ceefe..8074d33 100644 --- a/pkg/zones/machine.go +++ b/pkg/zones/machine.go @@ -3,10 +3,12 @@ package zones import ( "net/netip" "strings" + "sync" ) // A Machine is a machine on a Zone type Machine struct { + mu sync.Mutex zone *Zone ID int Name string `toml:"name"` @@ -39,6 +41,27 @@ func (m *Machine) IsGateway() bool { return ok } +// SetGateway enables/disables a Machine ring0 integration +func (m *Machine) SetGateway(enabled bool) error { + m.mu.Lock() + defer m.mu.Unlock() + + 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.syncRingConfig(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 1e950e8..75ab2bf 100644 --- a/pkg/zones/machine_rings.go +++ b/pkg/zones/machine_rings.go @@ -261,3 +261,57 @@ func (m *Machine) RemoveWireguardConfig(ring int) error { return err } + +func (*Machine) syncRingConfig(_ int) error { + // _, err := m.getRingNodes(ring) + return nil +} + +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 +} + +func (m *Machine) writeRingInfo(ri *RingInfo) error { + var err error + + if m == nil || ri == nil { + return fs.ErrInvalid + } + + err = m.WriteWireguardKeys(ri.Ring) + if err != nil { + return err + } + + if !ri.Enabled { + return m.RemoveWireguardConfig(ri.Ring) + } + + return m.writeRingInfoConf(ri.Ring, ri.Keys.PrivateKey) +} + +func (m *Machine) writeRingInfoConf(ring int, _ wireguard.PrivateKey) error { + f, err := m.CreateTruncFile("wg%v.conf", ring) + if err != nil { + return err + } + defer f.Close() + + return nil +} diff --git a/pkg/zones/zones.go b/pkg/zones/zones.go index 817fd97..f6b0d15 100644 --- a/pkg/zones/zones.go +++ b/pkg/zones/zones.go @@ -33,6 +33,31 @@ func (z *Zone) ForEachMachine(fn func(*Machine) bool) { } } +// SetGateway configures a machine to be the zone's ring0 gateway +func (z *Zone) SetGateway(gatewayID int, enabled bool) error { + var err error + var found bool + + z.ForEachMachine(func(p *Machine) bool { + if p.ID == gatewayID { + found = true + err = p.SetGateway(enabled) + + return true + } + return false + }) + + switch { + case err != nil: + return err + case !found: + return fs.ErrNotExist + default: + return nil + } +} + // Zones represents all zones in a cluster type Zones struct { dir fs.FS