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.3.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.3.0-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: ntps-0.3.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.3.0.tar.gz
Algorithm Hash digest
SHA256 8ea98bc6851609895b447179e38fe626363cdd79771b1ce5a5ede2c489209673
MD5 5f22b8da7c40275a69f1f7c231123985
BLAKE2b-256 427db878a9f8092eb554ca261fa8c235c0e5d50d9f6e7439efd95a22de98d3dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for ntps-0.3.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.3.0-py3-none-any.whl.

File metadata

  • Download URL: ntps-0.3.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.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f45aa9741918814dba000963ca84b18159ac06da26644d9b1180fe8c92e688cf
MD5 204080f6c290ebe3d55b283a6f9fe3d2
BLAKE2b-256 9a175f55877fbc93629cb784e24d4c80ec4b7034760c0b59853a80eb5e4900b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for ntps-0.3.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