package zones import ( "context" "net/netip" "strconv" "strings" "time" "darvaza.org/core" ) // LookupNetIP uses the DNS Resolver to get the public addresses associated // to a Machine func (m *Machine) LookupNetIP(timeout time.Duration) ([]netip.Addr, error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() return m.zone.zones.resolver.LookupNetIP(ctx, "ip", m.FullName()) } // UpdatePublicAddresses uses the DNS Resolver to set Machine.PublicAddresses func (m *Machine) UpdatePublicAddresses() error { addrs, err := m.LookupNetIP(2 * time.Second) if err != nil { return err } m.PublicAddresses = addrs return nil } func (m *Machine) init() error { if err := m.setID(); err != nil { return core.Wrap(err, m.Name) } for i := 0; i < RingsCount; i++ { if err := m.tryReadWireguardKeys(i); err != nil { return core.Wrap(err, m.Name) } } return nil } func (m *Machine) setID() error { zoneName := m.zone.Name l := len(zoneName) switch { case len(m.Name) < l+2: return ErrInvalidName case !strings.HasPrefix(m.Name, zoneName): return ErrInvalidName case m.Name[l] != '-': return ErrInvalidName } suffix := m.Name[l+1:] id, err := strconv.ParseInt(suffix, 10, 8) if err != nil { return err } m.ID = int(id) return nil } func (m *Machine) scan(opts *ScanOptions) error { for i := 0; i < RingsCount; i++ { if err := m.tryApplyWireguardConfig(i); err != nil { m.error(err). WithField("subsystem", "wireguard"). WithField("node", m.Name). WithField("ring", i). Print() return err } } if !opts.DontResolvePublicAddresses { return m.UpdatePublicAddresses() } return nil }