Library to connect and call command against new NSD >=4 control api.
Project description
pynsd
A modern Python client for the NSD (Name Server Daemon) control interface, providing type-safe access to NSD's control API.
Features
- Full support for NSD 4.x control protocol
- Type hints for better IDE support and code quality
- Context manager support for safe resource handling
- Comprehensive error handling with custom exceptions
- Support for both synchronous and asynchronous operations
- Parsed response objects with easy access to response data
Installation
pip install pynsd
Basic Usage
Connecting to NSD
import pynsd
# Basic connection with default settings (localhost:8952)
with pynsd.Client(
client_cert='/etc/nsd/nsd_control.pem',
client_key='/etc/nsd/nsd_control.key',
host='127.0.0.1',
port=8952
) as client:
# ...
# For self-signed certificates without hostname verification
with pynsd.Client(
client_cert='/etc/nsd/nsd_control.pem',
client_key='/etc/nsd/nsd_control.key',
host='nsd.example.com',
port=8952,
ssl_verify=False # Disable SSL certificate verification
) as client:
# Get server status
status = client.status()
print(f"NSD is running with {status.data.get('num_zones', 0)} zones")
Common Operations
# Add a zone
result = client.add_zone('example.com.', 'example.com.zone')
print(f"Added zone: {result.msg}")
# Get zone status
status = client.zonestatus('example.com.')
print(f"Zone status: {status.data}")
# Reload configuration
client.reload()
# Get server statistics
stats = client.stats_noreset()
print(f"Queries: {stats.data.get('num_query', 0)}")
Error Handling
from pynsd import NSDCommandError, NSDConnectionError
try:
client.add_zone('invalid.zone', 'nonexistent.zone')
except NSDCommandError as e:
print(f"Command failed: {e}")
except NSDConnectionError as e:
print(f"Connection error: {e}")
Advanced Usage
Using Raw Commands
# Using raw command API
response = client.request('addzone', ('example.org.', 'example.org.zone'))
if response.is_success():
print("Zone added successfully")
Custom Timeout
# Set custom timeout for operations (in seconds)
client = pynsd.Client(
client_cert='cert.pem',
client_key='key.pem',
timeout=10.0
)
Development
Setup
-
Clone the repository:
git clone https://github.com/greensec/pynsd.git cd pynsd
-
Install development dependencies:
pip install -e .[dev]
Running Tests
make test
Code Quality
make validate # Runs formatting, linting, and type checking
Contributing
Contributions are welcome! Please open an issue or submit a pull request.
See Also
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pynsd-0.1.2.5.tar.gz
(22.7 kB
view details)
File details
Details for the file pynsd-0.1.2.5.tar.gz.
File metadata
- Download URL: pynsd-0.1.2.5.tar.gz
- Upload date:
- Size: 22.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a488eec8dec2706117a67d6d942537ba454bf4fc226e4dad9baa6116a31cd414
|
|
| MD5 |
8a8afc12c6ded5d503c17af372f58b3c
|
|
| BLAKE2b-256 |
472d1e0deddbaab67b0f2c21d197f926ef5e0a236dfa40c970930c049cd9c4fd
|
Provenance
The following attestation bundles were made for pynsd-0.1.2.5.tar.gz:
Publisher:
publish-to-pypi.yml on greensec/pynsd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pynsd-0.1.2.5.tar.gz -
Subject digest:
a488eec8dec2706117a67d6d942537ba454bf4fc226e4dad9baa6116a31cd414 - Sigstore transparency entry: 1189462138
- Sigstore integration time:
-
Permalink:
greensec/pynsd@4f0334d1fede24fb05ae44a6f9b2c1562a73a0fc -
Branch / Tag:
refs/tags/0.1.2.5 - Owner: https://github.com/greensec
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@4f0334d1fede24fb05ae44a6f9b2c1562a73a0fc -
Trigger Event:
push
-
Statement type: