@@ -16,6 +16,30 @@ type DDNSProvider interface {
1616 Update (domain , record , ip string ) error
1717}
1818
19+ type IPProvider interface {
20+ Get () (ip string , err error )
21+ }
22+
23+ type ConfigProvider interface {
24+ Get () (domain , record string , err error )
25+ }
26+
27+ type ipProvider struct {}
28+
29+ func (p * ipProvider ) Get () (string , error ) {
30+ ip , err := ip .GetPublicIPWithRetry (10 , 5 * time .Second )
31+ if err != nil {
32+ return "" , errors .Trace (err )
33+ }
34+ return ip , nil
35+ }
36+
37+ type configProvider struct {}
38+
39+ func (p * configProvider ) Get () (domain , record string , err error ) {
40+ return conf .Domain .Get (), conf .Record .Get (), nil
41+ }
42+
1943type Daemon interface {
2044 Update (provider DDNSProvider ) error
2145 Start (provider DDNSProvider , updatePeriod , failureRetryDelay time.Duration ) error
@@ -24,37 +48,67 @@ type Daemon interface {
2448
2549type DDNSDaemon struct {
2650 Daemon
27- shouldRun bool
51+ shouldRun bool
52+ ddnsProvider DDNSProvider
53+ ipProvider IPProvider
54+ configProvider ConfigProvider
55+ }
56+
57+ // NewDDNSDaemon creates a new DDNSDaemon
58+ func NewDDNSDaemon (ddnsProvider DDNSProvider , ipProvider IPProvider , configProvider ConfigProvider ) * DDNSDaemon {
59+ if ddnsProvider == nil {
60+ panic ("ddnsProvider must not be nil" )
61+ }
62+ if ipProvider == nil {
63+ panic ("ipProvider must not be nil" )
64+ }
65+ if configProvider == nil {
66+ panic ("configProvider must not be nil" )
67+ }
68+ return & DDNSDaemon {
69+ shouldRun : true ,
70+ ddnsProvider : ddnsProvider ,
71+ ipProvider : ipProvider ,
72+ configProvider : configProvider ,
73+ }
2874}
2975
3076// Update performs a one time DDNS update.
31- func (d * DDNSDaemon ) Update (provider DDNSProvider ) error {
32- ip , err := ip . GetPublicIPWithRetry ( 10 , 5 * time . Second )
77+ func (d * DDNSDaemon ) Update () error {
78+ ip , err := d . ipProvider . Get ( )
3379 if err != nil {
3480 return errors .Annotate (err , "unable to retrieve public IP" )
3581 }
3682 log .Info ().Msgf ("Found public IP '%s'" , ip )
37- err = provider .Update (conf .Domain .Get (), conf .Record .Get (), ip )
83+ domain , record , err := d .configProvider .Get ()
84+ if err != nil {
85+ return errors .Annotate (err , "unable to find domain or record in configuration" )
86+ }
87+ err = d .ddnsProvider .Update (domain , record , ip )
3888 return errors .Annotatef (err , "failed to update DNS" )
3989}
4090
4191// Start continually keeps DDNS up to date.
4292// updatePeriod - how often to check for updates
4393// failureRetryDelay - how long to wait until retry after a failure
44- func (d * DDNSDaemon ) Start (provider DDNSProvider , updatePeriod , failureRetryDelay time.Duration ) error {
94+ func (d * DDNSDaemon ) Start (updatePeriod , failureRetryDelay time.Duration ) error {
4595 var lastIP string
4696 var lastIPUpdate time.Time
4797
4898 log .Info ().Msgf ("Daemon running, will now monitor for IP updates every %d seconds" , int (updatePeriod .Seconds ()))
4999
50100 for d .shouldRun {
51- dnsRecordIP , err := provider .Get (conf .Domain .Get (), conf .Record .Get ())
101+ domain , record , err := d .configProvider .Get ()
102+ if err != nil {
103+ return errors .Annotate (err , "unable to find domain or record in configuration" )
104+ }
105+ dnsRecordIP , err := d .ddnsProvider .Get (domain , record )
52106 if err != nil {
53107 log .Error ().Msgf ("Unable to look up current DNS record, will retry in %d seconds. Error was:\n %v" , int (updatePeriod .Seconds ()), err )
54108 time .Sleep (failureRetryDelay )
55109 continue
56110 }
57- newIP , err := ip . GetPublicIPWithRetry ( 10 , 5 * time . Second )
111+ newIP , err := d . ipProvider . Get ( )
58112 if err != nil {
59113 log .Error ().Msgf ("Unable to retrieve public IP, will retry in %d seconds. Error was:\n %v" , int (updatePeriod .Seconds ()), err )
60114 time .Sleep (failureRetryDelay )
@@ -81,7 +135,7 @@ func (d *DDNSDaemon) Start(provider DDNSProvider, updatePeriod, failureRetryDela
81135 lastIP = newIP
82136 lastIPUpdate = time .Now ()
83137
84- err = provider . Update (conf . Domain . Get (), conf . Record . Get () , lastIP )
138+ err = d . ddnsProvider . Update (domain , record , lastIP )
85139 if err != nil {
86140 log .Error ().Msgf ("Unable to update DNS, will retry in %d seconds. Erorr was:\n %v" , updatePeriod / time .Second , err )
87141 time .Sleep (failureRetryDelay )
@@ -98,7 +152,7 @@ func (d *DDNSDaemon) Start(provider DDNSProvider, updatePeriod, failureRetryDela
98152// StartWithDefaults calls Start but with default values
99153func (d * DDNSDaemon ) StartWithDefaults (provider DDNSProvider ) error {
100154 t := 10 * time .Second
101- return errors .Trace (d .Start (provider , t , t ))
155+ return errors .Trace (d .Start (t , t ))
102156}
103157
104158func (d * DDNSDaemon ) Stop () {
0 commit comments