A lightweight, high-performance NTP (Network Time Protocol) daemon written in C++.
- High Performance: Optimized for low-latency time synchronization
- Cross-Platform: Supports macOS, Linux, and Windows
- Multi-Format Configuration: INI, JSON, and YAML configuration support
- Structured Logging: JSON structured logging with configurable output
- Enhanced Validation: Comprehensive NTP packet validation and error reporting
- Comprehensive Testing: Unit tests with automated test framework
- Secure: Built with security best practices
- Containerized: Full Docker support for development and deployment
# Build for all platforms
./scripts/build-docker.sh -d all
# Run the NTP daemon
docker-compose --profile runtime up simple-ntpd
# Development environment
docker-compose --profile dev up dev
# Install dependencies
make deps
# Build the project
make build
# Run tests
make test
# Run specific tests
make test-ntp-packet # NTP packet functionality tests
make test-ntp-config # Configuration system tests
# Install
make install
The daemon supports multiple configuration formats:
# INI format
./simple-ntpd --config config.ini
# JSON format
./simple-ntpd --config config.json
# YAML format
./simple-ntpd --config config.yaml
Example configurations are available in config/examples/
:
simple-ntpd.json
- JSON configuration examplesimple-ntpd.yaml
- YAML configuration examplesimple-ntpd.conf
- INI configuration example
The project includes a comprehensive modular help system:
# Quick reference
make help
# Complete reference
make help-all
# Category-specific help
make help-build # Build and development targets
make help-package # Package creation targets
make help-deps # Dependency management targets
make help-service # Service management targets
make help-docker # Docker targets
make help-config # Configuration management targets
make help-platform # Platform-specific targets
The project includes comprehensive unit tests:
# Run all tests
make test
# Run specific test suites
cd build && ./test_ntp_packet # NTP packet functionality
cd build && ./test_ntp_config # Configuration system
# Run tests with verbose output
make test-verbose
# Run tests in debug mode
make dev-test
Create self-contained static binaries:
# Build static binary
make static-build
# Test static binary
make static-test
# Create static binary packages
make static-package # Platform-specific package
make static-zip # Cross-platform ZIP package
make static-all # All static binary formats
The Docker setup supports multiple Linux distributions and architectures:
- Distributions: Ubuntu, CentOS, Alpine Linux
- Architectures: x86_64, arm64, armv7
# Development environment
docker-compose --profile dev up dev
# Runtime container
docker-compose --profile runtime up simple-ntpd
# Build for specific distribution
docker-compose --profile build build build-ubuntu
docker-compose --profile build build build-centos
docker-compose --profile build build build-alpine
Use the build script for automated cross-platform building:
# Build for all distributions
./scripts/build-docker.sh -d all
# Build for specific distribution
./scripts/build-docker.sh -d ubuntu
# Clean build cache
./scripts/build-docker.sh --clean
The daemon supports three configuration formats with automatic detection:
[ntp]
listen_address = 0.0.0.0
listen_port = 123
log_level = info
log_json = false
reference_id = LOCL
{
"ntp": {
"listen_address": "0.0.0.0",
"listen_port": 123,
"log_level": "info",
"log_json": true,
"reference_id": "LOCL"
}
}
ntp:
listen_address: "0.0.0.0"
listen_port: 123
log_level: "info"
log_json: true
reference_id: "LOCL"
- Automatic Format Detection: Based on file extension (.ini, .json, .yaml)
- Structured Logging: JSON output with
log_json = true
- Validation: Comprehensive configuration validation
- Error Reporting: Detailed error messages for invalid configurations
- CMake 3.15+
- C++17 compatible compiler
- OpenSSL
- JsonCPP
# Install development tools (macOS)
make dev-deps
# Install development tools (Homebrew alternative)
make dev-deps-brew
# Run code quality checks
make format
make lint
make security-scan
# Run all tests
make test
# Run specific test suites
cd build && ./test_ntp_packet # NTP packet functionality
cd build && ./test_ntp_config # Configuration system
# Run tests with verbose output
make test-verbose
# Run tests in debug mode
make dev-test
# Standard build
make build
# Debug build
make debug
# Release build
make release
# Development build
make dev-build
# Create platform-specific packages
make package
# Create source package
make package-source
# Create all package formats
make package-all
Create self-contained static binaries:
# Build static binary
make static-build
# Test static binary
make static-test
# Create static binary packages
make static-package # Platform-specific package
make static-zip # Cross-platform ZIP package
make static-all # All static binary formats
# Install system service
make service-install
# Check service status
make service-status
# Start service
make service-start
# Stop service
make service-stop
- macOS: launchd service
- Linux: systemd service
- Windows: Windows Service
# Install configuration files
make config-install
# Backup configuration
make config-backup
# Install log rotation
make log-rotate
The project includes comprehensive security scanning:
# Run security scan
make security-scan
# Run static analysis
make analyze
# Check code style
make check-style
Aggregate logs via syslog, stdout JSON, or rotated files:
- Enable syslog for system collectors
- Enable console logging with JSON for container scraping
- Use rotated files with agents (Fluent Bit/Filebeat)
Configuration examples:
# INI
enable_syslog = true
enable_console_logging = true
log_json = true
log_file = /var/log/simple-ntpd/simple-ntpd.log
log_max_size_bytes = 10485760
log_max_files = 5
# YAML
enable_syslog: true
enable_console_logging: true
log_json: true
log_file: /var/log/simple-ntpd/simple-ntpd.log
log_max_size_bytes: 10485760
log_max_files: 5
{
"enable_syslog": true,
"enable_console_logging": true,
"log_json": true,
"log_file": "/var/log/simple-ntpd/simple-ntpd.log",
"log_max_size_bytes": 10485760,
"log_max_files": 5
}
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests and quality checks
- Submit a pull request
# Format code
make format
# Run linting
make lint
# Run security scan
make security-scan
[Add your license information here]
See CHANGELOG.md for a detailed history of changes.