In questo post vediamo come realizzare, utilizzando poche righe di codice, uno script Python che agisca da client NTP.
Soluzione 1
In questa prima soluzione ci avvaliamo semplicemente di un socket per inviare una query al server NTP.
#!/usr/bin/env python
from contextlib import closing
from socket import socket, AF_INET, SOCK_DGRAM
import struct
import time
NTP_PACKET_FORMAT = "!12I"
NTP_DELTA = 2208988800 # 1970-01-01 00:00:00
NTP_QUERY = b'\x1b' + 47 * b'\0'
def ntp_time(host="pool.ntp.org", port=123):
with closing(socket( AF_INET, SOCK_DGRAM)) as s:
s.settimeout(5)
s.sendto(NTP_QUERY, (host, port))
msg, address = s.recvfrom(1024)
unpacked = struct.unpack(NTP_PACKET_FORMAT,
msg[0:struct.calcsize(NTP_PACKET_FORMAT)])
return unpacked[10] + float(unpacked[11]) / 2**32 - NTP_DELTA
if __name__ == "__main__":
print(time.ctime(ntp_time()))
Soluzione 2
Come soluzione alternativa, se non vogliamo gestire direttamente il socket per comunicare con il server NTP, possiamo utilizzare ntplib. In questo caso il codice risulterebbe il seguente:
import ntplib
from time import ctime
c = ntplib.NTPClient()
response = c.request('pool.ntp.org')
print(ctime(response.tx_time))