@@ -28,9 +28,8 @@ type TimeSync struct {
28
28
syncLock * sync.Mutex
29
29
l * zerolog.Logger
30
30
31
- ntpServers []string
32
- httpUrls []string
33
- networkConfig * network.NetworkConfig
31
+ networkConfig * network.NetworkConfig
32
+ dhcpNtpAddresses []string
34
33
35
34
rtcDevicePath string
36
35
rtcDevice * os.File //nolint:unused
@@ -64,14 +63,13 @@ func NewTimeSync(opts *TimeSyncOptions) *TimeSync {
64
63
}
65
64
66
65
t := & TimeSync {
67
- syncLock : & sync.Mutex {},
68
- l : opts .Logger ,
69
- rtcDevicePath : rtcDevice ,
70
- rtcLock : & sync.Mutex {},
71
- preCheckFunc : opts .PreCheckFunc ,
72
- ntpServers : defaultNTPServers ,
73
- httpUrls : defaultHTTPUrls ,
74
- networkConfig : opts .NetworkConfig ,
66
+ syncLock : & sync.Mutex {},
67
+ l : opts .Logger ,
68
+ dhcpNtpAddresses : []string {},
69
+ rtcDevicePath : rtcDevice ,
70
+ rtcLock : & sync.Mutex {},
71
+ preCheckFunc : opts .PreCheckFunc ,
72
+ networkConfig : opts .NetworkConfig ,
75
73
}
76
74
77
75
if t .rtcDevicePath != "" {
@@ -82,34 +80,42 @@ func NewTimeSync(opts *TimeSyncOptions) *TimeSync {
82
80
return t
83
81
}
84
82
83
+ func (t * TimeSync ) SetDhcpNtpAddresses (addresses []string ) {
84
+ t .dhcpNtpAddresses = addresses
85
+ }
86
+
85
87
func (t * TimeSync ) getSyncMode () SyncMode {
86
88
syncMode := SyncMode {
89
+ Ntp : true ,
90
+ Http : true ,
91
+ Ordering : []string {"ntp_dhcp" , "ntp" , "http" },
87
92
NtpUseFallback : true ,
88
93
HttpUseFallback : true ,
89
94
}
90
- var syncModeString string
91
95
92
96
if t .networkConfig != nil {
93
- syncModeString = t .networkConfig .TimeSyncMode .String
97
+ switch t .networkConfig .TimeSyncMode .String {
98
+ case "ntp_only" :
99
+ syncMode .Http = false
100
+ case "http_only" :
101
+ syncMode .Ntp = false
102
+ }
103
+
94
104
if t .networkConfig .TimeSyncDisableFallback .Bool {
95
105
syncMode .NtpUseFallback = false
96
106
syncMode .HttpUseFallback = false
97
107
}
98
- }
99
108
100
- switch syncModeString {
101
- case "ntp_only" :
102
- syncMode .Ntp = true
103
- case "http_only" :
104
- syncMode .Http = true
105
- default :
106
- syncMode .Ntp = true
107
- syncMode .Http = true
109
+ var syncOrdering = t .networkConfig .TimeSyncOrdering
110
+ if len (syncOrdering ) > 0 {
111
+ syncMode .Ordering = syncOrdering
112
+ }
108
113
}
109
114
115
+ t .l .Debug ().Strs ("Ordering" , syncMode .Ordering ).Bool ("Ntp" , syncMode .Ntp ).Bool ("Http" , syncMode .Http ).Bool ("NtpUseFallback" , syncMode .NtpUseFallback ).Bool ("HttpUseFallback" , syncMode .HttpUseFallback ).Msg ("sync mode" )
116
+
110
117
return syncMode
111
118
}
112
-
113
119
func (t * TimeSync ) doTimeSync () {
114
120
metricTimeSyncStatus .Set (0 )
115
121
for {
@@ -154,16 +160,61 @@ func (t *TimeSync) Sync() error {
154
160
offset * time.Duration
155
161
)
156
162
157
- syncMode := t .getSyncMode ()
158
-
159
163
metricTimeSyncCount .Inc ()
160
164
161
- if syncMode .Ntp {
162
- now , offset = t .queryNetworkTime ()
163
- }
165
+ syncMode := t .getSyncMode ()
164
166
165
- if syncMode .Http && now == nil {
166
- now = t .queryAllHttpTime ()
167
+ Orders:
168
+ for _ , mode := range syncMode .Ordering {
169
+ switch mode {
170
+ case "ntp_user_provided" :
171
+ if syncMode .Ntp {
172
+ t .l .Info ().Msg ("using NTP custom servers" )
173
+ now , offset = t .queryNetworkTime (t .networkConfig .TimeSyncNTPServers )
174
+ if now != nil {
175
+ t .l .Info ().Str ("source" , "NTP" ).Time ("now" , * now ).Msg ("time obtained" )
176
+ break Orders
177
+ }
178
+ }
179
+ case "ntp_dhcp" :
180
+ if syncMode .Ntp {
181
+ t .l .Info ().Msg ("using NTP servers from DHCP" )
182
+ now , offset = t .queryNetworkTime (t .dhcpNtpAddresses )
183
+ if now != nil {
184
+ t .l .Info ().Str ("source" , "NTP DHCP" ).Time ("now" , * now ).Msg ("time obtained" )
185
+ break Orders
186
+ }
187
+ }
188
+ case "ntp" :
189
+ if syncMode .Ntp && syncMode .NtpUseFallback {
190
+ t .l .Info ().Msg ("using NTP fallback" )
191
+ now , offset = t .queryNetworkTime (defaultNTPServers )
192
+ if now != nil {
193
+ t .l .Info ().Str ("source" , "NTP fallback" ).Time ("now" , * now ).Msg ("time obtained" )
194
+ break Orders
195
+ }
196
+ }
197
+ case "http_user_provided" :
198
+ if syncMode .Http {
199
+ t .l .Info ().Msg ("using HTTP custom URLs" )
200
+ now = t .queryAllHttpTime (t .networkConfig .TimeSyncHTTPUrls )
201
+ if now != nil {
202
+ t .l .Info ().Str ("source" , "HTTP" ).Time ("now" , * now ).Msg ("time obtained" )
203
+ break Orders
204
+ }
205
+ }
206
+ case "http" :
207
+ if syncMode .Http && syncMode .HttpUseFallback {
208
+ t .l .Info ().Msg ("using HTTP fallback" )
209
+ now = t .queryAllHttpTime (defaultHTTPUrls )
210
+ if now != nil {
211
+ t .l .Info ().Str ("source" , "HTTP fallback" ).Time ("now" , * now ).Msg ("time obtained" )
212
+ break Orders
213
+ }
214
+ }
215
+ default :
216
+ t .l .Warn ().Str ("mode" , mode ).Msg ("unknown time sync mode, skipping" )
217
+ }
167
218
}
168
219
169
220
if now == nil {
0 commit comments