|
|
|
@ -23,14 +23,16 @@ const (
|
|
|
|
|
// RingInfo contains represents the Wireguard endpoint details
|
|
|
|
|
// for a Machine on a particular ring
|
|
|
|
|
type RingInfo struct { |
|
|
|
|
Ring int `toml:"ring"` |
|
|
|
|
Enabled bool `toml:"enabled,omitempty"` |
|
|
|
|
Keys *wireguard.KeyPair `toml:"keys,omitempty"` |
|
|
|
|
Ring int `toml:"ring"` |
|
|
|
|
Enabled bool `toml:"enabled,omitempty"` |
|
|
|
|
Keys wireguard.KeyPair `toml:"keys,omitempty"` |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Merge attempts to combine two RingInfo structs
|
|
|
|
|
func (ri *RingInfo) Merge(alter *RingInfo) error { |
|
|
|
|
switch { |
|
|
|
|
case alter == nil: |
|
|
|
|
return nil |
|
|
|
|
case ri.Ring != alter.Ring: |
|
|
|
|
// different ring
|
|
|
|
|
return fmt.Errorf("invalid %s: %v ≠ %v", "ring", ri.Ring, alter.Ring) |
|
|
|
@ -51,27 +53,19 @@ func (ri *RingInfo) unsafeMerge(alter *RingInfo) error {
|
|
|
|
|
ri.Enabled = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch { |
|
|
|
|
case ri.Keys == nil: |
|
|
|
|
// assign keypair
|
|
|
|
|
ri.Keys = alter.Keys |
|
|
|
|
case alter.Keys != nil: |
|
|
|
|
// fill the gaps on our keypair
|
|
|
|
|
if ri.Keys.PrivateKey.IsZero() { |
|
|
|
|
ri.Keys.PrivateKey = alter.Keys.PrivateKey |
|
|
|
|
} |
|
|
|
|
if ri.Keys.PublicKey.IsZero() { |
|
|
|
|
ri.Keys.PublicKey = alter.Keys.PublicKey |
|
|
|
|
} |
|
|
|
|
// fill the gaps on our keypair
|
|
|
|
|
if ri.Keys.PrivateKey.IsZero() { |
|
|
|
|
ri.Keys.PrivateKey = alter.Keys.PrivateKey |
|
|
|
|
} |
|
|
|
|
if ri.Keys.PublicKey.IsZero() { |
|
|
|
|
ri.Keys.PublicKey = alter.Keys.PublicKey |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func canMergeKeyPairs(p1, p2 *wireguard.KeyPair) bool { |
|
|
|
|
func canMergeKeyPairs(p1, p2 wireguard.KeyPair) bool { |
|
|
|
|
switch { |
|
|
|
|
case p1 == nil || p2 == nil: |
|
|
|
|
return true |
|
|
|
|
case !p1.PrivateKey.IsZero() && !p2.PrivateKey.IsZero() && !p1.PrivateKey.Equal(p2.PrivateKey): |
|
|
|
|
return false |
|
|
|
|
case !p1.PublicKey.IsZero() && !p2.PublicKey.IsZero() && !p1.PublicKey.Equal(p2.PublicKey): |
|
|
|
|