@@ -19,6 +19,7 @@ import (
1919 libparams "github.com/qdm12/golibs/params"
2020 "github.com/qdm12/golibs/server"
2121
22+ "github.com/qdm12/ddns-updater/internal/backup"
2223 "github.com/qdm12/ddns-updater/internal/data"
2324 "github.com/qdm12/ddns-updater/internal/handlers"
2425 "github.com/qdm12/ddns-updater/internal/healthcheck"
@@ -31,12 +32,12 @@ import (
3132)
3233
3334func main () {
34- os .Exit (_main (context .Background ()))
35+ os .Exit (_main (context .Background (), time . Now ))
3536 // returns 1 on error
3637 // returns 2 on os signal
3738}
3839
39- func _main (ctx context.Context ) int {
40+ func _main (ctx context.Context , timeNow func () time. Time ) int {
4041 if libhealthcheck .Mode (os .Args ) {
4142 // Running the program in a separate instance through the Docker
4243 // built-in healthcheck, in an ephemeral fashion to query the
@@ -65,34 +66,7 @@ func _main(ctx context.Context) int {
6566 return 1
6667 }
6768
68- listeningPort , warning , err := paramsReader .GetListeningPort ()
69- if len (warning ) > 0 {
70- logger .Warn (warning )
71- }
72- if err != nil {
73- logger .Error (err )
74- notify (4 , err )
75- return 1
76- }
77- rootURL , err := paramsReader .GetRootURL ()
78- if err != nil {
79- logger .Error (err )
80- notify (4 , err )
81- return 1
82- }
83- defaultPeriod , err := paramsReader .GetDelay (libparams .Default ("10m" ))
84- if err != nil {
85- logger .Error (err )
86- notify (4 , err )
87- return 1
88- }
89- dir , err := paramsReader .GetExeDir ()
90- if err != nil {
91- logger .Error (err )
92- notify (4 , err )
93- return 1
94- }
95- dataDir , err := paramsReader .GetDataDir (dir )
69+ dir , dataDir , listeningPort , rootURL , defaultPeriod , backupPeriod , backupDirectory , err := getParams (paramsReader )
9670 if err != nil {
9771 logger .Error (err )
9872 notify (4 , err )
@@ -179,6 +153,8 @@ func _main(ctx context.Context) int {
179153 )
180154 }()
181155
156+ go backupRunLoop (ctx , backupPeriod , dir , backupDirectory , logger , timeNow )
157+
182158 osSignals := make (chan os.Signal , 1 )
183159 signal .Notify (osSignals ,
184160 syscall .SIGINT ,
@@ -230,3 +206,69 @@ func setupGotify(paramsReader params.Reader, logger logging.Logger) (notify func
230206 }
231207 }, nil
232208}
209+
210+ func getParams (paramsReader params.Reader ) (
211+ dir , dataDir ,
212+ listeningPort , rootURL string ,
213+ defaultPeriod time.Duration ,
214+ backupPeriod time.Duration , backupDirectory string ,
215+ err error ) {
216+ dir , err = paramsReader .GetExeDir ()
217+ if err != nil {
218+ return "" , "" , "" , "" , 0 , 0 , "" , err
219+ }
220+ dataDir , err = paramsReader .GetDataDir (dir )
221+ if err != nil {
222+ return "" , "" , "" , "" , 0 , 0 , "" , err
223+ }
224+ listeningPort , _ , err = paramsReader .GetListeningPort ()
225+ if err != nil {
226+ return "" , "" , "" , "" , 0 , 0 , "" , err
227+ }
228+ rootURL , err = paramsReader .GetRootURL ()
229+ if err != nil {
230+ return "" , "" , "" , "" , 0 , 0 , "" , err
231+ }
232+ defaultPeriod , err = paramsReader .GetDelay (libparams .Default ("10m" ))
233+ if err != nil {
234+ return "" , "" , "" , "" , 0 , 0 , "" , err
235+ }
236+
237+ backupPeriod , err = paramsReader .GetBackupPeriod ()
238+ if err != nil {
239+ return "" , "" , "" , "" , 0 , 0 , "" , err
240+ }
241+ backupDirectory , err = paramsReader .GetBackupDirectory ()
242+ if err != nil {
243+ return "" , "" , "" , "" , 0 , 0 , "" , err
244+ }
245+ return dir , dataDir , listeningPort , rootURL , defaultPeriod , backupPeriod , backupDirectory , nil
246+ }
247+
248+ func backupRunLoop (ctx context.Context , backupPeriod time.Duration , exeDir , outputDir string ,
249+ logger logging.Logger , timeNow func () time.Time ) {
250+ logger = logger .WithPrefix ("backup: " )
251+ if backupPeriod == 0 {
252+ logger .Info ("disabled" )
253+ return
254+ }
255+ logger .Info ("each %s; writing zip files to directory %s" , backupPeriod , outputDir )
256+ ziper := backup .NewZiper ()
257+ timer := time .NewTimer (backupPeriod )
258+ for {
259+ filepath := fmt .Sprintf ("%s/ddns-updater-backup-%d.zip" , outputDir , timeNow ().UnixNano ())
260+ if err := ziper .ZipFiles (
261+ filepath ,
262+ fmt .Sprintf ("%s/data/updates.json" , exeDir ),
263+ fmt .Sprintf ("%s/data/config.json" , exeDir )); err != nil {
264+ logger .Error (err )
265+ }
266+ select {
267+ case <- timer .C :
268+ timer .Reset (backupPeriod )
269+ case <- ctx .Done ():
270+ timer .Stop ()
271+ return
272+ }
273+ }
274+ }
0 commit comments