MVP including features: * Detect IP change * Configurable/generic external IP provider * Configurable/generic DNS provider * Impl. of plain external IP provider * Impl. of Ionos DNS provider Reviewed-on: #1 Co-authored-by: Timo Behrendt <t.behrendt@t00n.de> Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package externalIpProvider
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"net/http"
|
|
"net/url"
|
|
externalIpProvider "realdnydns/pkg/externalIpProvider"
|
|
)
|
|
|
|
type ExternalIpProviderImplPlain struct {
|
|
IPProviderURL string
|
|
HTTPClient *http.Client
|
|
}
|
|
|
|
type PlainExternalIpProviderConfig struct {
|
|
Url string `yaml:"url"`
|
|
}
|
|
|
|
func New(config PlainExternalIpProviderConfig) (externalIpProvider.ExternalIpProvider, error) {
|
|
if config.Url == "" {
|
|
return nil, errors.New("url is required")
|
|
}
|
|
|
|
return &ExternalIpProviderImplPlain{
|
|
config.Url,
|
|
&http.Client{},
|
|
}, nil
|
|
}
|
|
|
|
func (p *ExternalIpProviderImplPlain) GetExternalIp() (net.IP, error) {
|
|
parsedUrl, err := url.Parse(p.IPProviderURL)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
res, err := p.HTTPClient.Get(parsedUrl.String())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if res.StatusCode != 200 {
|
|
return nil, errors.New("unexpected status code")
|
|
}
|
|
|
|
responseBody := make([]byte, res.ContentLength)
|
|
res.Body.Read(responseBody)
|
|
defer res.Body.Close()
|
|
|
|
parsedIp := net.ParseIP(string(responseBody))
|
|
if parsedIp == nil {
|
|
return nil, errors.New("unable to parse ip")
|
|
}
|
|
|
|
return parsedIp, nil
|
|
}
|