package lookup import ( "errors" "net" "net/http" "dnsupdater/ip/resolver/basic_http" "dnsupdater/ip/resolver/jsonip" ) var services []Service func Provide(service Service) { services = append(services, service) } func Get(name string) Service { for _, service := range services { if service.Name() == name { return service } } return nil } func Lookup() (net.IP, error) { for _, service := range services { ip, err := service.Lookup() if err != nil { continue } return ip, err } return nil, errors.New("failed to get ip") } func init() { Provide(jsonip.New()) Provide(&basic_http.Service{ ServiceName: "ifconfig.me", Url: "https://ifconfig.me/ip", }) Provide(&basic_http.Service{ ServiceName: "ip.me", Url: "https://ip.me", Headers: http.Header{ "User-Agent": []string{"curl"}, }, }) Provide(&basic_http.Service{ ServiceName: "ipecho", Url: "http://ipecho.net/plain", }) Provide(&basic_http.Service{ ServiceName: "icanhazip", Url: "https://icanhazip.com", }) }