PowerDNS Authoritative API client
Project description
powerdns-cli
PowerDNS-CLI is your (scriptable) interface to interact with the
PowerDNS Authoritative Nameserver. PowerDNS itself does only offer an
API to interact with remotely, its pdns_util does only work on the PowerDNS-Host
itself, not remotely from another machine.
Other interaction methods are web interface designed, by hardly scriptable (to my knowledge).
This project is currently in alpha phase and will soon progress to a beta stage. Beta release will be done as soon as integration tests and python version tests are successful.
Installation
Installation is available through pypi.org:
pip install powerdns-cli
Or you use this repositories-main branch for the latest version:
git clone https://github.com/IamLunchbox/powerdns-cli
python3 powerdns-cli/powerdns_cli/powerdns_cli.py
Please be advised, that the main branch, especially in alpha phase, might be unstable. Once this project progresses to a beta or production- ready release you can expect the main branch to be stable, since changes will stay in different branches.
Usage
powerdns-cli is built with pythons click framework and uses keyword-based functions.
Therefore, shared flags, as the api key and api url, are positional.
To get things going you may, for example, add a zone:
$ powerdns-cli -a MyApiKey -u http://localhost add-zone example.com. 10.0.0.1 MASTER
The following example does not work and will create an error:
$ powerdns-cli add-zone -a MyApiKey -u http://localhost example.com. 10.0.0.1 MASTER
You may provide all flags through your environment variables as well. Use the long
flag name in upper-case and prefix it with POWERDNS_CLI_. For example:
# This is effecively the same as above
export POWERDNS_CLI_APIKEY="MyApiKey"
export POWERDNS_CLI_URL="http://localhost"
powerdns-cli add-zone example.com. 10.0.0.1 MASTER
If you want to use environment variables for subcommands you will have to add
the subcommand to the variable string as well:
POWERDNS_CLI_ADD_RECORD_TTL=86400.
powerdns-cli will almost always respond in json, even if the PowerDNS-api doesn't
(sometimes its plain/text, sometimes there is no output at all).
The only time you'll be provided with non-json output is, when you request a
BIND/AFXR-format export.
This script tries to stay idempotent
Basic Examples
# Add a zone
$ powerdns-cli add-zone example.com. 10.0.0.1 MASTER
{"message": "Zone example.com. created"}
If you are in need of all the possible cli options, you can take a look at the integration test. The workflow uses all the possible options to test for the api compatibility.
Constraints
Building a simple cli for a large set of options of an api is no easy task.
Therefore, I had to go for compromises to keep powerdns-cli clutter-free.
But you should possibly want to know about these caveats:
- It is not possible to simply create a record with several entries. Instead, you have to use
extend-recordseveral times. - There are no guardrails for removing records from a zone, only for removing a zone altogether.
- By default, each record is enabled. You can disable a record, but enabling it requires re-adding it, since enabling would need the same information anyways.
- The default TTL is set to 86400. The ttl is set per name:zone:type pair.
Version Support
All the PowerDNS authoritative nameserver versions, which receive patches / security updates, are covered by integration tests. You can check if your version gets updates here. And you can check here which versions are actually tested.
If the PowerDNS-Team does not apply releases and changes to their publicly released docker images (see here), they won't be covered by the integration tests.
Todos
The following things are on my roadmap before a beta release:
- Pytest and Version tests
After the beta is done, i plan to port the code to implement it in ansible.
- PowerDNS ansible module which has similar features to this one
- unit-tests
Implemented features are:
- Everything around zone manipulation (creating zones, records and so forth)
- Exporting and searching current zone configuration
- Accessing server configuration and statistics
- Managing TSIG-Keys
- Zonemetadata
- Zonecryptokeys
API-Spec coverage
| Path | Covered |
|---|---|
| autoprimaries | :heavy_check_mark: |
| config | :heavy_check_mark: |
| search | :heavy_check_mark: |
| servers | :heavy_check_mark: |
| stats | :heavy_check_mark: |
| tsigkey | :heavy_check_mark: |
| zonecryptokey | :heavy_check_mark: |
| zonemetadata | :heavy_check_mark: |
| zones | :heavy_check_mark: |
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file powerdns_cli-0.0.15.tar.gz.
File metadata
- Download URL: powerdns_cli-0.0.15.tar.gz
- Upload date:
- Size: 26.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
762f0ae56f605697591c24282c6065b80a6b1561644dbfd25517926b3806dea9
|
|
| MD5 |
3e2f0ee976ff5d9b93e29d75a70bef08
|
|
| BLAKE2b-256 |
ea624d85d22377c5d204a0cba1ecee254eb87589cdce6269abf3fb2168c47706
|
Provenance
The following attestation bundles were made for powerdns_cli-0.0.15.tar.gz:
Publisher:
python-publish.yml on IamLunchbox/powerdns-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
powerdns_cli-0.0.15.tar.gz -
Subject digest:
762f0ae56f605697591c24282c6065b80a6b1561644dbfd25517926b3806dea9 - Sigstore transparency entry: 243476883
- Sigstore integration time:
-
Permalink:
IamLunchbox/powerdns-cli@59b45731c8118357e3550c8b587f7f9217b7e7a0 -
Branch / Tag:
refs/tags/0.0.15 - Owner: https://github.com/IamLunchbox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@59b45731c8118357e3550c8b587f7f9217b7e7a0 -
Trigger Event:
release
-
Statement type:
File details
Details for the file powerdns_cli-0.0.15-py3-none-any.whl.
File metadata
- Download URL: powerdns_cli-0.0.15-py3-none-any.whl
- Upload date:
- Size: 25.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
705f33d2f9fc912060b0da8df72cf0cf2af129c9296b8a903ae74c8daa846e02
|
|
| MD5 |
8c72d570961a37a9fd6196acc2ba3fae
|
|
| BLAKE2b-256 |
055698068de416557ab6bc77886e4c47f2295441b93f2081804f3c426c491a78
|
Provenance
The following attestation bundles were made for powerdns_cli-0.0.15-py3-none-any.whl:
Publisher:
python-publish.yml on IamLunchbox/powerdns-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
powerdns_cli-0.0.15-py3-none-any.whl -
Subject digest:
705f33d2f9fc912060b0da8df72cf0cf2af129c9296b8a903ae74c8daa846e02 - Sigstore transparency entry: 243476887
- Sigstore integration time:
-
Permalink:
IamLunchbox/powerdns-cli@59b45731c8118357e3550c8b587f7f9217b7e7a0 -
Branch / Tag:
refs/tags/0.0.15 - Owner: https://github.com/IamLunchbox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@59b45731c8118357e3550c8b587f7f9217b7e7a0 -
Trigger Event:
release
-
Statement type: