func NewPeerFromChrony()

in cmd/ntpcheck/checker/peer.go [175:230]


func NewPeerFromChrony(s *chrony.ReplySourceData, p *chrony.ReplyNTPData) (*Peer, error) {
	if s == nil {
		return nil, fmt.Errorf("no ReplySourceData to create Peer")
	}
	// clear auth and interlieved flag
	flash := s.Flags & chrony.NTPFlagsTests
	// don't report all flashers if peer is unreachable
	if flash > 0 {
		flash ^= chrony.NTPFlagsTests // negate bits as original NTPD flashers have opposite meaning
	}
	// all NTP measures are in ms, and chrony reports all in seconds, thus secToMS everywhere
	peer := Peer{
		Configured:   true,
		AuthPossible: false,
		Authentic:    s.Flags&chrony.NTPFlagAuthenticated != 0,
		Reachable:    s.Reachability == 255, // all 8 attempts
		Broadcast:    false,
		Selection:    chronyToPeerSelection[s.State],
		Condition:    chrony.SourceStateDesc[s.State],
		Flash:        flash,
		Flashers:     chrony.ReadNTPTestFlags(s.Flags),
		Offset:       -1 * secToMS(s.OrigLatestMeas), // sourceData offset and NTPData offset sign has opposite meaning
		PPoll:        int(s.Poll),
		HPoll:        int(s.Poll),
		Stratum:      int(s.Stratum),
		SRCAdr:       s.IPAddr.String(),
		Reach:        uint8(s.Reachability),
	}
	// populate data from ntpdata struct
	if p != nil {
		refID := chrony.RefidAsHEX(p.RefID)
		// Only stratum 1 servers can have GPS or something else as string refID
		if p.Stratum == 1 {
			refIDStr := chrony.RefidToString(p.RefID)
			if len(refIDStr) > 0 {
				refID = refIDStr
			}
		}
		peer.Leap = int(p.Leap)
		peer.HPoll = int(p.Poll)
		peer.DSTAdr = p.LocalAddr.String()
		peer.RefTime = p.RefTime.String()
		peer.Offset = secToMS(p.Offset)
		peer.Dispersion = secToMS(p.PeerDispersion)
		peer.DSTPort = int(p.RemotePort)
		peer.RefID = refID
		peer.PPoll = int(p.Poll)
		peer.Jitter = secToMS(p.PeerDispersion) // best approx we have
		peer.RootDelay = secToMS(p.RootDelay)
		peer.Precision = int(p.Precision)
		peer.Delay = secToMS(p.PeerDelay)
		peer.RootDisp = secToMS(p.RootDispersion)
	}
	// no need for sanity check as we are not parsing k=v pairs in case of chrony proto
	return &peer, nil
}