dy_import_module_symbols("random.r2py") # See RFC 2030 (http://www.ietf.org/rfc/rfc2030.txt) for details about NTP # this unpacks the data from the packet and changes it to a float def convert_timestamp_to_float(timestamp): integerpart = (ord(timestamp[0])<<24) + (ord(timestamp[1])<<16) + (ord(timestamp[2])<<8) + (ord(timestamp[3])) floatpart = (ord(timestamp[4])<<24) + (ord(timestamp[5])<<16) + (ord(timestamp[6])<<8) + (ord(timestamp[7])) return integerpart + floatpart / float(2**32) def decode_NTP_packet(ip, port, mess, sockobj): log("From " + str(ip) + ":" + str(port) + ", I received NTP data.\n") log("NTP Reference Identifier:", mess[12:16], '\n') log("NTP Transmit Time (in seconds since Jan 1st, 1900):", convert_timestamp_to_float(mess[40:48]), '\n') sockobj.close() timeservers = ["time-a.nist.gov", "time-b.nist.gov", "time-a.timefreq.bldrdoc.gov", "time-b.timefreq.bldrdoc.gov", "time-c.timefreq.bldrdoc.gov", "utcnist.colorado.edu", "time.nist.gov", "nist1.symmetricom.com", "nist.netservicesgroup.com"] # choose a random time server from the list servername = timeservers[int(randomfloat()*len(timeservers))] log("Using: ", servername, '\n') serverip = gethostbyname(servername) # this sends a request, version 3 in "client mode" ntp_request_string = chr(27)+chr(0)*47 ip = getmyip() port = 34612 # binds to an IP and port and waits for incoming UDP messages udpserversocket = listenformessage(ip, port) sendmessage(serverip, 123, ntp_request_string, ip, port) # port 123 is used for NTP while True: try: remoteip, remoteport, message = udpserversocket.getmessage() decode_NTP_packet(remoteip, remoteport, message, udpserversocket) except SocketWouldBlockError: sleep(0.1) except SocketClosedLocal: break