diff --git a/internal/nodes/node.go b/internal/nodes/node.go index 36a18f9..65d109f 100644 --- a/internal/nodes/node.go +++ b/internal/nodes/node.go @@ -22,6 +22,7 @@ import ( "github.com/TeaOSLab/EdgeNode/internal/stats" "github.com/TeaOSLab/EdgeNode/internal/trackers" "github.com/TeaOSLab/EdgeNode/internal/utils" + "github.com/TeaOSLab/EdgeNode/internal/utils/clock" "github.com/TeaOSLab/EdgeNode/internal/waf" "github.com/andybalholm/brotli" "github.com/iwind/TeaGo/Tea" @@ -164,6 +165,11 @@ func (this *Node) Start() { NewNodeStatusExecutor().Listen() }) + // 同步时间 + goman.New(func() { + clock.Start() + }) + // 读取配置 nodeConfig, err := nodeconfigs.SharedNodeConfig() if err != nil { diff --git a/internal/utils/clock/utils.go b/internal/utils/clock/utils.go new file mode 100644 index 0000000..f3f9cbb --- /dev/null +++ b/internal/utils/clock/utils.go @@ -0,0 +1,57 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package clock + +import ( + "bytes" + "errors" + "github.com/TeaOSLab/EdgeNode/internal/remotelogs" + "os/exec" + "runtime" + "time" +) + +func Start() { + // sync once + err := Sync() + if err != nil { + remotelogs.Warn("CLOCK", "sync time clock failed: "+err.Error()) + } + + var ticker = time.NewTicker(1 * time.Hour) + for range ticker.C { + err := Sync() + if err != nil { + // ignore error + } + } +} + +// Sync 自动校对时间 +func Sync() error { + if runtime.GOOS != "linux" { + return nil + } + + ntpdate, err := exec.LookPath("ntpdate") + if err != nil { + return err + } + if len(ntpdate) > 0 { + return syncNtpdate(ntpdate) + } + + return nil +} + +func syncNtpdate(ntpdate string) error { + var cmd = exec.Command(ntpdate, "pool.ntp.org") + var stderr = &bytes.Buffer{} + cmd.Stderr = stderr + err := cmd.Run() + if err != nil { + return errors.New(err.Error() + ": " + stderr.String()) + } + + return nil +}