func NewSystemVariablesFromNTP()

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
}