in cmd/ntpcheck/checker/system.go [77:128]
func NewSystemVariablesFromNTP(p *control.NTPControlMsg) (*SystemVariables, error) {
m, err := p.GetAssociationInfo()
if err != nil {
return nil, err
}
// data comes as k=v pairs in packet, and those kv pairs are parsed by GetAssociationInfo.
// If data is severely corrupted GetAssociationInfo will return error.
// It's ok to have some fields missing, thus we don't check for errors below.
leap, _ := strconv.Atoi(m["leap"])
stratum, _ := strconv.Atoi(m["stratum"])
precision, _ := strconv.Atoi(m["precision"])
rootdelay, _ := strconv.ParseFloat(m["rootdelay"], 64)
rootdisp, _ := strconv.ParseFloat(m["rootdisp"], 64)
peer, _ := strconv.Atoi(m["peer"])
tc, _ := strconv.Atoi(m["tc"])
mintc, _ := strconv.Atoi(m["mintc"])
offset, _ := strconv.ParseFloat(m["offset"], 64)
sysjitter, _ := strconv.ParseFloat(m["sys_jitter"], 64)
frequency, _ := strconv.ParseFloat(m["frequency"], 64)
clkwander, _ := strconv.ParseFloat(m["clk_wander"], 64)
clkjitter, _ := strconv.ParseFloat(m["clk_jitter"], 64)
tai, _ := strconv.Atoi(m["tai"])
system := SystemVariables{
// from variables
Version: m["version"],
Processor: m["processor"],
System: m["system"],
Leap: leap,
Stratum: stratum,
Precision: precision,
RootDelay: rootdelay,
RootDisp: rootdisp,
Peer: peer,
TC: tc,
MinTC: mintc,
Clock: m["clock"],
RefID: m["refid"],
RefTime: m["reftime"],
Offset: offset,
SysJitter: sysjitter,
Frequency: frequency,
ClkWander: clkwander,
ClkJitter: clkjitter,
Tai: tai,
}
// sometimes NTPD returns malformed k=v pairs and we can't parse important info
if err := sanityCheckSysVars(&system); err != nil {
return nil, err
}
return &system, nil
}