1
1
package main
2
2
3
3
import (
4
+ "context"
5
+ "errors"
4
6
"github.com/cromefire/fritzbox-cloudflare-dyndns/pkg/avm"
5
7
"github.com/cromefire/fritzbox-cloudflare-dyndns/pkg/cloudflare"
6
8
"github.com/cromefire/fritzbox-cloudflare-dyndns/pkg/dyndns"
@@ -24,6 +26,8 @@ func main() {
24
26
updater := newUpdater ()
25
27
updater .StartWorker ()
26
28
29
+ ctx , cancel := context .WithCancelCause (context .Background ())
30
+
27
31
ipv6LocalAddress := os .Getenv ("DEVICE_LOCAL_ADDRESS_IPV6" )
28
32
29
33
var localIp net.IP
@@ -37,14 +41,22 @@ func main() {
37
41
}
38
42
39
43
startPollServer (updater .In , & localIp )
40
- startPushServer (updater .In , & localIp )
44
+ startPushServer (updater .In , & localIp , cancel )
41
45
46
+ // Create a OS signal shutdown channel
42
47
shutdown := make (chan os.Signal )
43
48
44
49
signal .Notify (shutdown , syscall .SIGTERM )
45
50
signal .Notify (shutdown , syscall .SIGINT )
46
51
47
- <- shutdown
52
+ // Wait for either the context to finish or the shutdown signal
53
+ select {
54
+ case <- ctx .Done ():
55
+ slog .Error ("Context closed" , logging .ErrorAttr (context .Cause (ctx )))
56
+ os .Exit (1 )
57
+ case <- shutdown :
58
+ break
59
+ }
48
60
49
61
slog .Info ("Shutdown detected" )
50
62
}
@@ -133,7 +145,7 @@ func newUpdater() *cloudflare.Updater {
133
145
return u
134
146
}
135
147
136
- func startPushServer (out chan <- * net.IP , localIp * net.IP ) {
148
+ func startPushServer (out chan <- * net.IP , localIp * net.IP , cancel context. CancelCauseFunc ) {
137
149
bind := os .Getenv ("DYNDNS_SERVER_BIND" )
138
150
139
151
if bind == "" {
@@ -154,7 +166,7 @@ func startPushServer(out chan<- *net.IP, localIp *net.IP) {
154
166
155
167
go func () {
156
168
err := s .ListenAndServe ()
157
- slog . Error ( "Server stopped" , logging . ErrorAttr ( err ))
169
+ cancel ( errors . Join ( errors . New ( "http server error" ), err ))
158
170
}()
159
171
}
160
172
0 commit comments