package main import ( "io" "net/http" "strings" "github.com/go-gandi/go-gandi/config" ) type Registration interface { Valid() bool Update(config.Config) (string, error) HasSecret(string) bool Domain() string IP() string } type UserRegistration struct { Subdomain string `yaml:"subdomain"` Secret string `yaml:"secret"` ip string update bool } func (u *UserRegistration) Valid() bool { return u.Subdomain != "" && u.Secret != "" } func (u *UserRegistration) Update(c config.Config) (string, error) { if u.update { u.update = false return u.ip, nil } return "", nil } func (u *UserRegistration) HasSecret(s string) bool { return u.Secret == s } func (u *UserRegistration) Domain() string { return u.Subdomain } func (u *UserRegistration) IP() string { return u.ip } type HostRegistration struct { Subdomain string `yaml:"subdomain"` ipddr string } func (h HostRegistration) Valid() bool { return h.Subdomain != "" } func (h *HostRegistration) Update(_ config.Config) (string, error) { resp, err := http.Get("icanhazip.com") if err != nil { return "", err } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return "", err } var result string dynip := strings.TrimSpace(string(body)) if dynip != h.ipddr { h.ipddr = dynip result = dynip } return result, nil } func (h *HostRegistration) HasSecret(_ string) bool { return false } func (h *HostRegistration) Domain() string { return h.Subdomain } func (h *HostRegistration) IP() string { return h.ipddr }