cluster: decouple RingID from WireguardInterfaceID
Signed-off-by: Alejandro Mery <amery@jpi.io>
This commit is contained in:
@@ -13,14 +13,22 @@ import (
|
||||
)
|
||||
|
||||
// GetWireguardKeys reads a wgN.key/wgN.pub files
|
||||
func (m *Machine) GetWireguardKeys(ring int) (wireguard.KeyPair, error) {
|
||||
func (m *Machine) GetWireguardKeys(ringID rings.RingID) (wireguard.KeyPair, error) {
|
||||
var (
|
||||
data []byte
|
||||
err error
|
||||
out wireguard.KeyPair
|
||||
)
|
||||
|
||||
data, err = m.ReadFile("wg%v.key", ring)
|
||||
ring, err := AsWireguardInterfaceID(ringID)
|
||||
if err != nil {
|
||||
// invalid ring
|
||||
return out, err
|
||||
}
|
||||
|
||||
keyFile, pubFile, _ := ring.Files()
|
||||
|
||||
data, err = m.ReadFile(keyFile)
|
||||
if err != nil {
|
||||
// failed to read
|
||||
return out, err
|
||||
@@ -29,11 +37,11 @@ func (m *Machine) GetWireguardKeys(ring int) (wireguard.KeyPair, error) {
|
||||
out.PrivateKey, err = wireguard.PrivateKeyFromBase64(string(data))
|
||||
if err != nil {
|
||||
// bad key
|
||||
err = core.Wrap(err, "wg%v.key", ring)
|
||||
err = core.Wrap(err, keyFile)
|
||||
return out, err
|
||||
}
|
||||
|
||||
data, err = m.ReadFile("wg%v.pub", ring)
|
||||
data, err = m.ReadFile(pubFile)
|
||||
switch {
|
||||
case os.IsNotExist(err):
|
||||
// no wgN.pub is fine
|
||||
@@ -45,7 +53,7 @@ func (m *Machine) GetWireguardKeys(ring int) (wireguard.KeyPair, error) {
|
||||
out.PublicKey, err = wireguard.PublicKeyFromBase64(string(data))
|
||||
if err != nil {
|
||||
// bad key
|
||||
err = core.Wrap(err, "wg%v.pub", ring)
|
||||
err = core.Wrap(err, pubFile)
|
||||
return out, err
|
||||
}
|
||||
}
|
||||
@@ -54,8 +62,8 @@ func (m *Machine) GetWireguardKeys(ring int) (wireguard.KeyPair, error) {
|
||||
return out, err
|
||||
}
|
||||
|
||||
func (m *Machine) tryReadWireguardKeys(ring int) error {
|
||||
kp, err := m.GetWireguardKeys(ring)
|
||||
func (m *Machine) tryReadWireguardKeys(ringID rings.RingID) error {
|
||||
kp, err := m.GetWireguardKeys(ringID)
|
||||
switch {
|
||||
case os.IsNotExist(err):
|
||||
// ignore
|
||||
@@ -66,20 +74,25 @@ func (m *Machine) tryReadWireguardKeys(ring int) error {
|
||||
default:
|
||||
// import keys
|
||||
ri := &RingInfo{
|
||||
Ring: ring,
|
||||
Ring: MustWireguardInterfaceID(ringID),
|
||||
Keys: kp,
|
||||
}
|
||||
|
||||
return m.applyRingInfo(ring, ri)
|
||||
return m.applyRingInfo(ringID, ri)
|
||||
}
|
||||
}
|
||||
|
||||
// RemoveWireguardKeys deletes wgN.key and wgN.pub from
|
||||
// the machine's config directory
|
||||
func (m *Machine) RemoveWireguardKeys(ring int) error {
|
||||
var err error
|
||||
func (m *Machine) RemoveWireguardKeys(ringID rings.RingID) error {
|
||||
ring, err := AsWireguardInterfaceID(ringID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = m.RemoveFile("wg%v.pub", ring)
|
||||
keyFile, pubFile, _ := ring.Files()
|
||||
|
||||
err = m.RemoveFile(pubFile)
|
||||
switch {
|
||||
case os.IsNotExist(err):
|
||||
// ignore
|
||||
@@ -87,7 +100,7 @@ func (m *Machine) RemoveWireguardKeys(ring int) error {
|
||||
return err
|
||||
}
|
||||
|
||||
err = m.RemoveFile("wg%v.key", ring)
|
||||
err = m.RemoveFile(keyFile)
|
||||
if os.IsNotExist(err) {
|
||||
// ignore
|
||||
err = nil
|
||||
@@ -97,8 +110,13 @@ func (m *Machine) RemoveWireguardKeys(ring int) error {
|
||||
}
|
||||
|
||||
// GetWireguardConfig reads a wgN.conf file
|
||||
func (m *Machine) GetWireguardConfig(ring int) (*wireguard.Config, error) {
|
||||
data, err := m.ReadFile("wg%v.conf", ring)
|
||||
func (m *Machine) GetWireguardConfig(ringID rings.RingID) (*wireguard.Config, error) {
|
||||
ring, err := AsWireguardInterfaceID(ringID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
data, err := m.ReadFile(ring.ConfFile())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -107,7 +125,7 @@ func (m *Machine) GetWireguardConfig(ring int) (*wireguard.Config, error) {
|
||||
return wireguard.NewConfigFromReader(r)
|
||||
}
|
||||
|
||||
func (m *Machine) tryApplyWireguardConfig(ring int) error {
|
||||
func (m *Machine) tryApplyWireguardConfig(ring rings.RingID) error {
|
||||
wg, err := m.GetWireguardConfig(ring)
|
||||
switch {
|
||||
case os.IsNotExist(err):
|
||||
@@ -119,7 +137,7 @@ func (m *Machine) tryApplyWireguardConfig(ring int) error {
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Machine) applyWireguardConfigNode(ring int, wg *wireguard.Config) error {
|
||||
func (m *Machine) applyWireguardConfigNode(ring rings.RingID, wg *wireguard.Config) error {
|
||||
addr := wg.GetAddress()
|
||||
if !core.IsZero(addr) {
|
||||
zoneID, nodeID, ok := Rings[ring].Decode(addr)
|
||||
@@ -139,7 +157,7 @@ func (m *Machine) applyWireguardConfigNode(ring int, wg *wireguard.Config) error
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Machine) applyWireguardConfig(ring int, wg *wireguard.Config) error {
|
||||
func (m *Machine) applyWireguardConfig(ring rings.RingID, wg *wireguard.Config) error {
|
||||
if err := m.applyWireguardConfigNode(ring, wg); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -163,9 +181,9 @@ func (m *Machine) applyWireguardConfig(ring int, wg *wireguard.Config) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Machine) getRingInfo(ring int) (*RingInfo, bool) {
|
||||
func (m *Machine) getRingInfo(ring rings.RingID) (*RingInfo, bool) {
|
||||
for _, ri := range m.Rings {
|
||||
if ri.Ring == ring {
|
||||
if ri.RingID() == ring {
|
||||
return ri, ri.Enabled
|
||||
}
|
||||
}
|
||||
@@ -173,7 +191,7 @@ func (m *Machine) getRingInfo(ring int) (*RingInfo, bool) {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
func (m *Machine) applyRingInfo(ring int, new *RingInfo) error {
|
||||
func (m *Machine) applyRingInfo(ring rings.RingID, new *RingInfo) error {
|
||||
cur, _ := m.getRingInfo(ring)
|
||||
if cur == nil {
|
||||
// first, append
|
||||
@@ -189,9 +207,11 @@ func (m *Machine) applyRingInfo(ring int, new *RingInfo) error {
|
||||
return cur.Merge(new)
|
||||
}
|
||||
|
||||
func (m *Machine) applyWireguardInterfaceConfig(ring int, data wireguard.InterfaceConfig) error {
|
||||
func (m *Machine) applyWireguardInterfaceConfig(ring rings.RingID,
|
||||
data wireguard.InterfaceConfig) error {
|
||||
//
|
||||
ri := &RingInfo{
|
||||
Ring: ring,
|
||||
Ring: MustWireguardInterfaceID(ring),
|
||||
Enabled: true,
|
||||
Keys: wireguard.KeyPair{
|
||||
PrivateKey: data.PrivateKey,
|
||||
@@ -201,7 +221,7 @@ func (m *Machine) applyWireguardInterfaceConfig(ring int, data wireguard.Interfa
|
||||
return m.applyRingInfo(ring, ri)
|
||||
}
|
||||
|
||||
func (m *Machine) applyWireguardPeerConfig(ring int, pc wireguard.PeerConfig) error {
|
||||
func (m *Machine) applyWireguardPeerConfig(ring rings.RingID, pc wireguard.PeerConfig) error {
|
||||
peer, found := m.getPeerByName(pc.Endpoint.Name())
|
||||
switch {
|
||||
case !found:
|
||||
@@ -213,7 +233,7 @@ func (m *Machine) applyWireguardPeerConfig(ring int, pc wireguard.PeerConfig) er
|
||||
default:
|
||||
// apply RingInfo
|
||||
ri := &RingInfo{
|
||||
Ring: ring,
|
||||
Ring: MustWireguardInterfaceID(ring),
|
||||
Enabled: true,
|
||||
Keys: wireguard.KeyPair{
|
||||
PublicKey: pc.PublicKey,
|
||||
@@ -246,7 +266,7 @@ func (m *Machine) setRingDefaults(ri *RingInfo) error {
|
||||
m.info().
|
||||
WithField("subsystem", "wireguard").
|
||||
WithField("node", m.Name).
|
||||
WithField("ring", ri.Ring).
|
||||
WithField("ring", ri.Ring.RingID()).
|
||||
Print("generating key pair")
|
||||
|
||||
kp, err := wireguard.NewKeyPair()
|
||||
@@ -260,8 +280,13 @@ func (m *Machine) setRingDefaults(ri *RingInfo) error {
|
||||
|
||||
// RemoveWireguardConfig deletes wgN.conf from the machine's
|
||||
// config directory.
|
||||
func (m *Machine) RemoveWireguardConfig(ring int) error {
|
||||
err := m.RemoveFile("wg%v.conf", ring)
|
||||
func (m *Machine) RemoveWireguardConfig(ringID rings.RingID) error {
|
||||
ring, err := AsWireguardInterfaceID(ringID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = m.RemoveFile(ring.ConfFile())
|
||||
if os.IsNotExist(err) {
|
||||
err = nil
|
||||
}
|
||||
@@ -269,7 +294,12 @@ func (m *Machine) RemoveWireguardConfig(ring int) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (m *Machine) createRingInfo(ring int, enabled bool) (*RingInfo, error) {
|
||||
func (m *Machine) createRingInfo(ringID rings.RingID, enabled bool) (*RingInfo, error) {
|
||||
ring, err := AsWireguardInterfaceID(ringID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
keys, err := wireguard.NewKeyPair()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -281,7 +311,7 @@ func (m *Machine) createRingInfo(ring int, enabled bool) (*RingInfo, error) {
|
||||
Keys: keys,
|
||||
}
|
||||
|
||||
err = m.applyRingInfo(ring, ri)
|
||||
err = m.applyRingInfo(ringID, ri)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user