Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fb82a7f358 | |||
| 9da2f8711f | |||
| 2a14205e7e | |||
| a5d9466fb8 | |||
| 3d638e9a85 | |||
| 60d3a2c290 | |||
| af90825f13 | |||
| b4f1d2e4d9 |
@@ -51,12 +51,12 @@ func (pub PublicKey) String() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON encodes the key for JSON, omiting empty.
|
// MarshalJSON encodes the key for JSON, omitting empty.
|
||||||
func (key PrivateKey) MarshalJSON() ([]byte, error) {
|
func (key PrivateKey) MarshalJSON() ([]byte, error) {
|
||||||
return encodeKeyJSON(key.String())
|
return encodeKeyJSON(key.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON encodes the key for JSON, omiting empty.
|
// MarshalJSON encodes the key for JSON, omitting empty.
|
||||||
func (pub PublicKey) MarshalJSON() ([]byte, error) {
|
func (pub PublicKey) MarshalJSON() ([]byte, error) {
|
||||||
return encodeKeyJSON(pub.String())
|
return encodeKeyJSON(pub.String())
|
||||||
}
|
}
|
||||||
@@ -70,12 +70,12 @@ func encodeKeyJSON(s string) ([]byte, error) {
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalYAML encodes the key for YAML, omiting empty.
|
// MarshalYAML encodes the key for YAML, omitting empty.
|
||||||
func (key PrivateKey) MarshalYAML() (any, error) {
|
func (key PrivateKey) MarshalYAML() (any, error) {
|
||||||
return encodeKeyYAML(key.String())
|
return encodeKeyYAML(key.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalYAML encodes the key for YAML, omiting empty.
|
// MarshalYAML encodes the key for YAML, omitting empty.
|
||||||
func (pub PublicKey) MarshalYAML() (any, error) {
|
func (pub PublicKey) MarshalYAML() (any, error) {
|
||||||
return encodeKeyYAML(pub.String())
|
return encodeKeyYAML(pub.String())
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-15
@@ -32,11 +32,14 @@ func (m *Zones) writeEnvZone(w io.Writer, z *Zone) {
|
|||||||
|
|
||||||
// ZONE{zoneID}_GW
|
// ZONE{zoneID}_GW
|
||||||
gatewayID := getRingZeroGatewayID(z)
|
gatewayID := getRingZeroGatewayID(z)
|
||||||
m.writeEnvVar(w, fmt.Sprintf("%v", gatewayID), "ZONE%v_%s", zoneID, "GW")
|
if gatewayID > 0 {
|
||||||
|
m.writeEnvVar(w, fmt.Sprintf("%v", gatewayID), "ZONE%v_%s", zoneID, "GW")
|
||||||
|
|
||||||
// ZONE{zoneID}_IP
|
// ZONE{zoneID}_IP
|
||||||
ip, _ := RingZeroAddress(zoneID, gatewayID)
|
if ip, ok := RingZeroAddress(zoneID, gatewayID); ok {
|
||||||
m.writeEnvVar(w, ip.String(), "ZONE%v_%s", zoneID, "IP")
|
m.writeEnvVar(w, ip.String(), "ZONE%v_%s", zoneID, "IP")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Zones) writeEnvVarFn(w io.Writer, fn func(*Zones) string, name string, args ...any) {
|
func (m *Zones) writeEnvVarFn(w io.Writer, fn func(*Zones) string, name string, args ...any) {
|
||||||
@@ -79,13 +82,9 @@ func genEnvZoneNodes(z *Zone) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getRingZeroGatewayID(z *Zone) int {
|
func getRingZeroGatewayID(z *Zone) int {
|
||||||
var firstNodeID, gatewayID int
|
var gatewayID int
|
||||||
|
|
||||||
z.ForEachMachine(func(p *Machine) bool {
|
z.ForEachMachine(func(p *Machine) bool {
|
||||||
if firstNodeID == 0 {
|
|
||||||
firstNodeID = p.ID
|
|
||||||
}
|
|
||||||
|
|
||||||
if p.IsGateway() {
|
if p.IsGateway() {
|
||||||
gatewayID = p.ID
|
gatewayID = p.ID
|
||||||
}
|
}
|
||||||
@@ -93,10 +92,5 @@ func getRingZeroGatewayID(z *Zone) int {
|
|||||||
return gatewayID != 0
|
return gatewayID != 0
|
||||||
})
|
})
|
||||||
|
|
||||||
switch {
|
return gatewayID
|
||||||
case gatewayID == 0:
|
|
||||||
return firstNodeID
|
|
||||||
default:
|
|
||||||
return gatewayID
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,24 @@ func (m *Machine) IsGateway() bool {
|
|||||||
return ok
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
// Zone indicates the [Zone] this machine belongs to
|
// Zone indicates the [Zone] this machine belongs to
|
||||||
func (m *Machine) Zone() int {
|
func (m *Machine) Zone() int {
|
||||||
return m.zone.ID
|
return m.zone.ID
|
||||||
|
|||||||
@@ -228,3 +228,23 @@ func (m *Machine) RemoveWireguardConfig(ring int) error {
|
|||||||
|
|
||||||
return err
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ func (m *Zones) scan() error {
|
|||||||
m.scanMachines,
|
m.scanMachines,
|
||||||
m.scanZoneIDs,
|
m.scanZoneIDs,
|
||||||
m.scanSort,
|
m.scanSort,
|
||||||
|
m.scanGateways,
|
||||||
} {
|
} {
|
||||||
if err := fn(); err != nil {
|
if err := fn(); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -115,6 +116,16 @@ func (m *Zones) scanSort() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Zones) scanGateways() error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
m.ForEachZone(func(z *Zone) bool {
|
||||||
|
_, _, err = z.GetGateway()
|
||||||
|
return err != nil
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (z *Zone) scan() error {
|
func (z *Zone) scan() error {
|
||||||
// each directory is a machine
|
// each directory is a machine
|
||||||
entries, err := fs.ReadDir(z.zones.dir, z.Name)
|
entries, err := fs.ReadDir(z.zones.dir, z.Name)
|
||||||
@@ -139,3 +150,41 @@ func (z *Zone) scan() error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetGateway returns the first gateway found, if none
|
||||||
|
// files will be created to enable the first [Machine] to
|
||||||
|
// be one
|
||||||
|
func (z *Zone) GetGateway() (*Machine, bool, error) {
|
||||||
|
var first *Machine
|
||||||
|
var gateway *Machine
|
||||||
|
|
||||||
|
z.zones.ForEachMachine(func(p *Machine) bool {
|
||||||
|
switch {
|
||||||
|
case p.IsGateway():
|
||||||
|
// found
|
||||||
|
gateway = p
|
||||||
|
case first == nil:
|
||||||
|
// remember
|
||||||
|
first = p
|
||||||
|
default:
|
||||||
|
// keep looking
|
||||||
|
}
|
||||||
|
|
||||||
|
return gateway != nil
|
||||||
|
})
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case gateway != nil:
|
||||||
|
// found one
|
||||||
|
return gateway, false, nil
|
||||||
|
case first != nil:
|
||||||
|
// make one
|
||||||
|
if err := first.SetGateway(true); err != nil {
|
||||||
|
return first, false, err
|
||||||
|
}
|
||||||
|
return first, true, nil
|
||||||
|
default:
|
||||||
|
// Zone without nodes?
|
||||||
|
panic("unreachable")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ var (
|
|||||||
|
|
||||||
_ WireguardConfigSyncer = (*Zones)(nil)
|
_ WireguardConfigSyncer = (*Zones)(nil)
|
||||||
_ WireguardConfigSyncer = (*Zone)(nil)
|
_ WireguardConfigSyncer = (*Zone)(nil)
|
||||||
|
_ WireguardConfigSyncer = (*Machine)(nil)
|
||||||
|
|
||||||
_ WireguardKeysWriter = (*Zones)(nil)
|
_ WireguardKeysWriter = (*Zones)(nil)
|
||||||
_ WireguardKeysWriter = (*Zone)(nil)
|
_ WireguardKeysWriter = (*Zone)(nil)
|
||||||
@@ -44,7 +45,7 @@ func pruneWireguardConfig(m MachineIterator, ring int) error {
|
|||||||
var err error
|
var err error
|
||||||
|
|
||||||
m.ForEachMachine(func(p *Machine) bool {
|
m.ForEachMachine(func(p *Machine) bool {
|
||||||
err = p.zone.PruneWireguardConfig(ring)
|
err = p.PruneWireguardConfig(ring)
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
// ignore
|
// ignore
|
||||||
err = nil
|
err = nil
|
||||||
@@ -200,6 +201,12 @@ func syncWireguardConfig(z ZoneIterator, m MachineIterator, ring int) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SyncWireguardConfig updates all wgN.conf files for the specified
|
||||||
|
// ring
|
||||||
|
func (m *Machine) SyncWireguardConfig(ring int) error {
|
||||||
|
return m.zone.SyncWireguardConfig(ring)
|
||||||
|
}
|
||||||
|
|
||||||
// A WireguardKeysWriter writes the Wireguard Keys for all machines
|
// A WireguardKeysWriter writes the Wireguard Keys for all machines
|
||||||
// under its scope for the specified ring
|
// under its scope for the specified ring
|
||||||
type WireguardKeysWriter interface {
|
type WireguardKeysWriter interface {
|
||||||
|
|||||||
@@ -50,6 +50,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
|
// Zones represents all zones in a cluster
|
||||||
type Zones struct {
|
type Zones struct {
|
||||||
dir fs.FS
|
dir fs.FS
|
||||||
|
|||||||
Reference in New Issue
Block a user