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) defer cancel() return m.zone.zones.resolver.LookupNetIP(ctx, "ip", m.FullName()) } func (m *Machine) updatePublicAddresses() error { addrs, err := m.lookupNetIP() if err != nil { return err } m.PublicAddresses = addrs return nil } func (m *Machine) scan() error { if err := m.tryWireguardZeroConfig(); err != nil { return err } if err := m.tryWireguardOneConfig(); err != nil { return err } return m.updatePublicAddresses() }