check local clock is accurate
This commit is contained in:
7
go.mod
7
go.mod
@@ -1,4 +1,11 @@
|
|||||||
module nathan/go-ntp
|
module nathan/go-ntp
|
||||||
|
|
||||||
go 1.24.1
|
go 1.24.1
|
||||||
|
|
||||||
require github.com/vmware/govmomi v0.43.0
|
require github.com/vmware/govmomi v0.43.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/beevik/ntp v1.4.3 // indirect
|
||||||
|
golang.org/x/net v0.25.0 // indirect
|
||||||
|
golang.org/x/sys v0.20.0 // indirect
|
||||||
|
)
|
||||||
|
6
go.sum
6
go.sum
@@ -1,6 +1,12 @@
|
|||||||
|
github.com/beevik/ntp v1.4.3 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho=
|
||||||
|
github.com/beevik/ntp v1.4.3/go.mod h1:Unr8Zg+2dRn7d8bHFuehIMSvvUYssHMxW3Q5Nx4RW5Q=
|
||||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/vmware/govmomi v0.30.4 h1:BCKLoTmiBYRuplv3GxKEMBLtBaJm8PA56vo9bddIpYQ=
|
github.com/vmware/govmomi v0.30.4 h1:BCKLoTmiBYRuplv3GxKEMBLtBaJm8PA56vo9bddIpYQ=
|
||||||
github.com/vmware/govmomi v0.30.4/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY=
|
github.com/vmware/govmomi v0.30.4/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY=
|
||||||
github.com/vmware/govmomi v0.43.0 h1:7Kg3Bkdly+TrE67BYXzRq7ZrDnn7xqpKX95uEh2f9Go=
|
github.com/vmware/govmomi v0.43.0 h1:7Kg3Bkdly+TrE67BYXzRq7ZrDnn7xqpKX95uEh2f9Go=
|
||||||
github.com/vmware/govmomi v0.43.0/go.mod h1:IOv5nTXCPqH9qVJAlRuAGffogaLsNs8aF+e7vLgsHJU=
|
github.com/vmware/govmomi v0.43.0/go.mod h1:IOv5nTXCPqH9qVJAlRuAGffogaLsNs8aF+e7vLgsHJU=
|
||||||
|
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
|
||||||
|
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||||
|
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
||||||
|
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
47
main.go
47
main.go
@@ -13,6 +13,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
_ "time/tzdata"
|
_ "time/tzdata"
|
||||||
|
|
||||||
|
"github.com/beevik/ntp"
|
||||||
"github.com/vmware/govmomi"
|
"github.com/vmware/govmomi"
|
||||||
"github.com/vmware/govmomi/find"
|
"github.com/vmware/govmomi/find"
|
||||||
"github.com/vmware/govmomi/view"
|
"github.com/vmware/govmomi/view"
|
||||||
@@ -39,6 +40,9 @@ var (
|
|||||||
hostTimeErrors []HostTimeErrors
|
hostTimeErrors []HostTimeErrors
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// maxAllowedDrift is the maximum allowed time difference (1 second).
|
||||||
|
const maxAllowedDrift = 2 * time.Second
|
||||||
|
|
||||||
/*
|
/*
|
||||||
type dateInfo struct {
|
type dateInfo struct {
|
||||||
types.HostDateTimeInfo
|
types.HostDateTimeInfo
|
||||||
@@ -47,6 +51,37 @@ type dateInfo struct {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
func checkClockDrift(ntpServers []string) bool {
|
||||||
|
localTime := time.Now()
|
||||||
|
inSync := false
|
||||||
|
|
||||||
|
for _, server := range ntpServers {
|
||||||
|
ntpTime, err := ntp.Time(server)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Failed to get time from %s: %v\n", server, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
diff := localTime.Sub(ntpTime)
|
||||||
|
if diff < 0 {
|
||||||
|
diff = -diff
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("NTP Server: %s\n", server)
|
||||||
|
log.Printf("Local Time: %s\n", localTime)
|
||||||
|
log.Printf("NTP Time : %s\n", ntpTime)
|
||||||
|
log.Printf("Time Difference: %v\n", diff)
|
||||||
|
|
||||||
|
if diff <= maxAllowedDrift {
|
||||||
|
inSync = true
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("----------")
|
||||||
|
}
|
||||||
|
|
||||||
|
return inSync
|
||||||
|
}
|
||||||
|
|
||||||
func prettyPrint(args ...interface{}) {
|
func prettyPrint(args ...interface{}) {
|
||||||
var caller string
|
var caller string
|
||||||
|
|
||||||
@@ -82,6 +117,7 @@ func main() {
|
|||||||
vTZ := flag.String("tz", "Australia/Sydney", "The timezone to use when converting vCenter UTC times")
|
vTZ := flag.String("tz", "Australia/Sydney", "The timezone to use when converting vCenter UTC times")
|
||||||
vInsecure := flag.Bool("insecure", true, "Allow insecure connections to vCenter")
|
vInsecure := flag.Bool("insecure", true, "Allow insecure connections to vCenter")
|
||||||
vAllowedDiff := flag.Int("diff", 300, "Permitted time difference in seconds")
|
vAllowedDiff := flag.Int("diff", 300, "Permitted time difference in seconds")
|
||||||
|
vNtpServers := flag.String("ntp-servers", "pool.ntp.org", "A comma separated list of NTP sources to validate the local system clock")
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
@@ -99,7 +135,7 @@ func main() {
|
|||||||
log.Printf("Setting timezone to '%s'\n", *vTZ)
|
log.Printf("Setting timezone to '%s'\n", *vTZ)
|
||||||
location, err = time.LoadLocation(*vTZ)
|
location, err = time.LoadLocation(*vTZ)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "Error setting timezone to %s : %s\n", *vTZ, err)
|
log.Printf("Error setting timezone to %s : %s\n", *vTZ, err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,6 +150,15 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate system clock
|
||||||
|
ntpList := strings.FieldsFunc(*vNtpServers, func(r rune) bool {
|
||||||
|
return r == ','
|
||||||
|
})
|
||||||
|
if !checkClockDrift(ntpList) {
|
||||||
|
log.Fatalf("Local system clock is not in sync, unable to proceed")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
log.Printf("Connecting to vCenter %s\n", u)
|
log.Printf("Connecting to vCenter %s\n", u)
|
||||||
u.User = url.UserPassword(*vUser, *vPass)
|
u.User = url.UserPassword(*vUser, *vPass)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user