-
Notifications
You must be signed in to change notification settings - Fork 0
/
schedules.go
137 lines (123 loc) · 3.52 KB
/
schedules.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package main
import (
"log"
"time"
"github.com/go-co-op/gocron"
"git.leon.wtf/leon/new-cfupdater/externalip"
)
var (
lastIPv4 string
lastIPv6 string
scheduler = gocron.NewScheduler(time.Now().Location())
emergencyModev4Active = false
emergencyModev4Set = make(chan bool, 1)
emergencyModev6Active = false
emergencyModev6Set = make(chan bool, 1)
)
func v4Schedule() {
currentIPv4, err := externalip.GetIPv4(conf.CheckTimeout)
if err != nil {
log.Printf("Got error while getting IPv4: %s", err.Error())
emergencyModev4Set <- true
return
}
if *verbose {
log.Printf("Got %s", currentIPv4)
}
emergencyModev4Set <- false
if currentIPv4 != lastIPv4 {
log.Printf("Detected IPv4 change (was '%s', is '%s')", lastIPv4, currentIPv4)
UpdateIPv4(currentIPv4)
}
lastIPv4 = currentIPv4
}
func v6Schedule() {
currentIPv6, err := externalip.GetIPv6(conf.CheckTimeout)
if err != nil {
log.Printf("Got error while getting IPv6: %s", err.Error())
emergencyModev6Set <- true
return
}
if *verbose {
log.Printf("Got %s", currentIPv6)
}
emergencyModev6Set <- false
if currentIPv6 != lastIPv6 {
log.Printf("Detected IPv6 change (was '%s', is '%s')", lastIPv6, currentIPv6)
UpdateIPv6(currentIPv6)
}
lastIPv6 = currentIPv6
}
var (
v4CurrentJob *gocron.Job
v6CurrentJob *gocron.Job
)
func handleEmergencies(interval int) {
var err error
for {
select {
case v4Emergency := <-emergencyModev4Set:
if v4Emergency && !emergencyModev4Active {
// remove normal job and add emegency job
scheduler.RemoveByReference(v4CurrentJob)
v4CurrentJob, err = scheduler.Every(10).Seconds().SingletonMode().WaitForSchedule().Do(v4Schedule)
if err != nil {
panic(err)
}
emergencyModev4Active = true
log.Printf("Emergency mode activated for IPv4")
} else if !v4Emergency && emergencyModev4Active {
// remove emergency job and add normal job
scheduler.RemoveByReference(v4CurrentJob)
v4CurrentJob, err = scheduler.Every(interval).Seconds().SingletonMode().WaitForSchedule().Do(v4Schedule)
if err != nil {
panic(err)
}
emergencyModev4Active = false
log.Printf("Emergency mode deactivated for IPv4")
} else {
// no change required
continue
}
case v6Emergency := <-emergencyModev6Set:
if v6Emergency && !emergencyModev6Active {
// remove normal job and add emegency job
scheduler.RemoveByReference(v6CurrentJob)
v6CurrentJob, err = scheduler.Every(10).Seconds().SingletonMode().WaitForSchedule().Do(v6Schedule)
if err != nil {
panic(err)
}
emergencyModev6Active = true
log.Printf("Emergency mode activated for IPv6")
} else if !v6Emergency && emergencyModev6Active {
// remove emergency job and add normal job
scheduler.RemoveByReference(v6CurrentJob)
v6CurrentJob, err = scheduler.Every(interval).Seconds().SingletonMode().WaitForSchedule().Do(v6Schedule)
if err != nil {
panic(err)
}
emergencyModev6Active = false
log.Printf("Emergency mode deactivated for IPv6")
} else {
// no change required
continue
}
}
}
}
func StartSchedules(interval int) {
go handleEmergencies(interval)
var err error
v4CurrentJob, err = scheduler.Every(interval).Seconds().SingletonMode().Do(v4Schedule)
if err != nil {
panic(err)
}
if conf.ConfiguresIPv6AtAll() { // do not add the v6Schedule if no record wants to update AAAA records
v6CurrentJob, err = scheduler.Every(interval).Seconds().SingletonMode().Do(v6Schedule)
if err != nil {
panic(err)
}
}
//scheduler.StartAsync()
scheduler.StartBlocking()
}