Skip to main content

Modern, type-safe, zero-dependency python library for implementing a network time protocol (NTP) stratum 0 server

Project description

ntps

Modern, type-safe, zero-dependency python library for implementing a network time protocol (NTP) stratum 0 server.

Installation

pip install ntps

or

using your preferred environment / package manager of choice, e.g., poetry, conda or uv:

poetry add ntps
conda install ntps
uv add ntps

Usage

There are two main components in the ntps library: the NTP server and the NTP client.

The NTP server is used to create an NTP server that can be used to synchronize time across a network. The NTP client is used to query an NTP server for the current time.

The following is an example of how to use the ntps library to create an NTP server and client:

Server

from asyncio import get_running_loop, run
from time import time

from ntps import NTPServer

# Define a custom NTP server that uses GPS-synced time as the reference time, and a
# stratum level of 0:
class GNSSStratum0NTPServer(NTPServer):
    # Set the reference identifier of the NTP server:
    refid = "GPS"
    # Set the stratum level of the NTP server:
    stratum = 0

    def get_ntp_time(self) -> float:
        # Replace this with your actual GPS-synced time retrieval:
        return time()


async def main() -> None:
    # Retrieve the current running asynchronous event loop:
    loop = get_running_loop()

    # Create a UDP server endpoint on all interfaces at port 123 using your
    # custom implementation (e.g., GNSSStratum0NTPServer):
    transport, _ = await loop.create_datagram_endpoint(
        lambda: GNSSStratum0NTPServer(),
        local_addr=('0.0.0.0', 123),
    )

Client

from ntps import NTPClient, NTPPacket

async def main() -> None:
    # Create a new NTP client instance:
    client = NTPClient(endpoint="0.0.0.0", port=123)

    # Send an NTP request to the specified NTP server (e.g., 0.pool.ntp.org):
    packet: NTPPacket = client.query()

    # Print the response packet from the NTP server:
    print(packet)

As the ntps instance is fully typed, you can use your IDE's autocompletion to see all the available methods and properties.

We have also provided further usage examples in the examples directory.

Milestones

  • Implement NTP server
  • Implement NTP client
  • Implement NTP packet
  • Implement kiss-of-death (KoD) packet
  • Implement NTP authentication
  • Implement NTP broadcast
  • Implement NTP multicast
  • Implement NTP symmetric mode

Miscellaneous

For more information on the NTP protocol, please refer to the RFC 5905 document.

License

This project is licensed under the terms of the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ntps-0.4.0.tar.gz (33.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ntps-0.4.0-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

Details for the file ntps-0.4.0.tar.gz.

File metadata

  • Download URL: ntps-0.4.0.tar.gz
  • Upload date:
  • Size: 33.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for ntps-0.4.0.tar.gz
Algorithm Hash digest
SHA256 8baaea8eb6815a6baf0fb6c7aa589e6222730725061ff12d89a0836db21ab305
MD5 6c7b2a2649252ad19a4af3ea17a8e679
BLAKE2b-256 0527f46d78c5466b4ba5cf4150e5e905a06eed6d9c041d4734fc3b52106ed344

See more details on using hashes here.

Provenance

The following attestation bundles were made for ntps-0.4.0.tar.gz:

Publisher: publish.yml on michealroberts/ntps

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ntps-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: ntps-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for ntps-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9874dc2f98a76d667d63a4169767d59c6d92c39cf2e52b2ab30db313ee70a227
MD5 23606e6954e0b29e1d95863acae7fb44
BLAKE2b-256 fdb7eaae196cb3299c58e25a83d593e717f5add3eecac3a13cd478d708cf8caa

See more details on using hashes here.

Provenance

The following attestation bundles were made for ntps-0.4.0-py3-none-any.whl:

Publisher: publish.yml on michealroberts/ntps

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page