![PyPI version](https://badge.fury.io/py/python-powerdns.svg)
python-powerdns -- PowerDNS web api python client and interface
Contact: Denis 'jawa' Pompilio denis.pompilio@gmail.com
Sources: https://github.com/outini/python-powerdns
About
This package provides intuitive and easy to use python client and interface
for the PowerDNS web API.
Installation
python setup.py install
or
pip install python-powerdns
Helpers
pdns-zone-creator
usage: pdns-create-zone [-h] -A API -K APIKEY -z ZONE -o ORIGIN -c ZONE -d DNS
[-t TIMERS]
PowerDNS zone creator
optional arguments:
-h, --help show this help message and exit
-A API, --api API PowerDNS api (eg. https://api.domain.tld/api/v1
-K APIKEY, --key APIKEY
PowerDNS api key
-z ZONE, --zone ZONE Zone name (canonical)
-o ORIGIN, --origin ORIGIN
Zone origin (for SOA)
-c ZONE, --contact ZONE
Zone contact (for SOA)
-d DNS, --dns DNS Zone nameservers comma separated
-t TIMERS, --timers TIMERS
Zone timers (eg. '28800 7200 604800 86400')
./bin/pdns-create-zone -A "https://api.domain.tld/api/v1" -K "xxxxxxxxx" \
-z "myzone.domain.tld." \
-o "ns01.domain.tld." -c "admin.domain.tld." \
-d "nsd01.domain.tld.,nsd02.domain.tld."
powerdns.interface INFO: listing available PowerDNS servers
powerdns.interface INFO: getting available servers from API
powerdns.client INFO: request: GET https://api.domain.tld/api/v1/servers
powerdns.client INFO: request response code: 200
powerdns.interface INFO: 1 server(s) listed
powerdns.interface INFO: creation of zone: myzone.domain.tld.
powerdns.client INFO: request: POST https://api.domain.tld/api/v1/servers/localhost/zones
powerdns.client INFO: request response code: 201
powerdns.interface INFO: zone myzone.domain.tld. successfully created
Examples
Basic initialization
import powerdns
PDNS_API = "https://my.pdns.api.domain.tld/api/v1"
PDNS_KEY = "mysupersecretbase64key"
api_client = powerdns.PDNSApiClient(api_endpoint=PDNS_API, api_key=PDNS_KEY)
api = powerdns.PDNSEndpoint(api_client)
Creation and deletion of zones
from datetime import date
serial = date.today().strftime("%Y%m%d00")
soa = "ns0.domain.tld. admin.domain.tld. %s 28800 7200 604800 86400" % serial
soa_r = powerdns.RRSet(name='test.python-powerdns.domain.tld.',
rtype="SOA",
records=[(soa, False)],
ttl=86400)
zone = api.servers[0].create_zone(name="test.python-powerdns.domain.tld.",
kind="Native",
rrsets=[soa_r],
nameservers=["ns1.domain.tld.",
"ns2.domain.tld."])
print(zone)
print(zone.details)
api.servers[0].delete_zone(zone.name)
Creation and deletion of DNS records
zone = api.servers[0].get_zone("test.python-powerdns.domain.tld.")
comments = [powerdns.Comment("test comment", "admin")]
zone.create_records([
powerdns.RRSet('a', 'A', [('1.1.1.1', False)], comments=comments),
powerdns.RRSet('b', 'A', ['1.1.1.2', '1.1.1.3']),
powerdns.RRSet('c', 'A', [('1.1.1.4', False)]),
powerdns.RRSet('d', 'CNAME', ['a'])
])
zone.delete_records([
powerdns.RRSet('a', 'A', [('1.1.1.1', False)]),
powerdns.RRSet('d', 'CNAME', ['a'])
])
Where (for the first RRSet):
a
is the NAME of the recordA
is the TYPE of the record[('1.1.1.1', False)]
is a list of RDATA entries (tuples or just strings), where:
'1.1.1.1'
is the RDATAFalse
tells that this RDATA entry is NOT disabled
Backup and restoration of zones
for server in api.servers:
backup_dir = "backups/%s" % server.id
for zone in server.zones:
zone.backup(backup_dir)
zone_file = "backups/pdns-server-01/my.domain.tld.json"
api.servers[0].restore_zone(zone_file)
Tests
PowerDNS service
A simple Dockerfile is provided to spawn a basic powerdns service for tests
purposes. The container is built using:
docker build --tag pdns .
And started using:
docker run --rm -it pdns
Python Unit-Tests
Python unit-tests are available in the tests directory. Based on unittests,
those are run using coverage run -m unittest discover
or integrated in your
IDE for development purposes. Those tests require a PDNS service to connect to
(see PowerDNS service section above).
Those tests are very limited at the moment and will be improved in the future.
License
MIT LICENSE (see LICENSE file)
Miscellaneous
╚⊙ ⊙╝
╚═(███)═╝
╚═(███)═╝
╚═(███)═╝
╚═(███)═╝
╚═(███)═╝
╚═(███)═╝