diff --git a/pkg/zones/machine_scan.go b/pkg/zones/machine_scan.go index 732fe45..cbde393 100644 --- a/pkg/zones/machine_scan.go +++ b/pkg/zones/machine_scan.go @@ -1,11 +1,86 @@ package zones import ( + "bytes" "context" + "fmt" + "log" "net/netip" + "os" "time" + + "git.jpi.io/amery/jpictl/pkg/wireguard" ) +// GetWireguardConfig reads a wgN.conf file +func (m *Machine) GetWireguardConfig(ring int) (*wireguard.Config, error) { + data, err := m.ReadFile("wg%v.conf", ring) + if err != nil { + return nil, err + } + + r := bytes.NewReader(data) + return wireguard.NewConfigFromReader(r) +} + +func (m *Machine) tryWireguardZeroConfig() error { + wg, err := m.GetWireguardConfig(0) + switch { + case os.IsNotExist(err): + return nil + case err != nil: + return err + default: + return m.applyWireguardZeroConfig(wg) + } +} + +func (m *Machine) applyWireguardZeroConfig(wg *wireguard.Config) error { + addr := wg.GetAddress() + zoneID, nodeID, ok := ParseRingZeroAddress(addr) + if !ok { + return fmt.Errorf("%s: invalid %s address: %s", m.Name, "wg1", addr) + } + + if err := m.applyZoneNodeID(zoneID, nodeID); err != nil { + return err + } + + log.Println(m.Name, "wg0", addr, zoneID, nodeID) + return nil +} + +func (m *Machine) tryWireguardOneConfig() error { + wg, err := m.GetWireguardConfig(1) + switch { + case os.IsNotExist(err): + return nil + case err != nil: + return err + default: + return m.applyWireguardOneConfig(wg) + } +} + +func (m *Machine) applyWireguardOneConfig(wg *wireguard.Config) error { + addr := wg.GetAddress() + zoneID, nodeID, ok := ParseRingOneAddress(addr) + if !ok { + return fmt.Errorf("%s: invalid %s address: %s", m.Name, "wg1", addr) + } + + if err := m.applyZoneNodeID(zoneID, nodeID); err != nil { + return err + } + + log.Println(m.Name, "wg1", addr, zoneID, nodeID) + return nil +} + +func (*Machine) applyZoneNodeID(_, _ int) error { + return nil +} + func (m *Machine) lookupNetIP() ([]netip.Addr, error) { timeout := 2 * time.Second ctx, cancel := context.WithTimeout(context.Background(), timeout) @@ -26,5 +101,13 @@ func (m *Machine) updatePublicAddresses() error { } func (m *Machine) scan() error { + if err := m.tryWireguardZeroConfig(); err != nil { + return err + } + + if err := m.tryWireguardOneConfig(); err != nil { + return err + } + return m.updatePublicAddresses() }