2015-12-13 10:46:24 +00:00
# PowerDNS-Admin
2018-04-01 09:07:41 +00:00
A PowerDNS web interface with advanced features.
2018-09-07 07:58:16 +00:00
2018-04-02 06:45:44 +00:00
[![Build Status ](https://travis-ci.org/ngoduykhanh/PowerDNS-Admin.svg?branch=master )](https://travis-ci.org/ngoduykhanh/PowerDNS-Admin)
2018-09-07 07:58:16 +00:00
[![Language grade: Python ](https://img.shields.io/lgtm/grade/python/g/ngoduykhanh/PowerDNS-Admin.svg?logo=lgtm&logoWidth=18 )](https://lgtm.com/projects/g/ngoduykhanh/PowerDNS-Admin/context:python)
[![Language grade: JavaScript ](https://img.shields.io/lgtm/grade/javascript/g/ngoduykhanh/PowerDNS-Admin.svg?logo=lgtm&logoWidth=18 )](https://lgtm.com/projects/g/ngoduykhanh/PowerDNS-Admin/context:javascript)
2015-12-13 10:46:24 +00:00
2015-12-13 11:07:10 +00:00
#### Features:
2015-12-13 11:07:59 +00:00
- Multiple domain management
2018-04-01 09:07:41 +00:00
- Domain template
2015-12-13 11:07:10 +00:00
- User management
2016-05-27 06:03:59 +00:00
- User access management based on domain
2015-12-13 11:07:10 +00:00
- User activity logging
2018-10-26 01:43:25 +00:00
- Support Local DB / SAML / LDAP / Active Directory user authentication
- Support Google / Github / OpenID OAuth
2018-04-01 09:07:41 +00:00
- Support Two-factor authentication (TOTP)
2015-12-13 11:07:10 +00:00
- Dashboard and pdns service statistics
2016-06-21 22:22:02 +00:00
- DynDNS 2 protocol support
2016-08-19 23:28:59 +00:00
- Edit IPv6 PTRs using IPv6 addresses directly (no more editing of literal addresses!)
2015-12-13 11:07:10 +00:00
2018-04-01 09:07:41 +00:00
### Running PowerDNS-Admin
2018-04-18 03:32:10 +00:00
There are several ways to run PowerDNS-Admin. Following is a simple way to start PowerDNS-Admin with docker in development environment which has PowerDNS-Admin, PowerDNS server and MySQL Back-End Database.
2015-12-13 10:46:24 +00:00
2018-04-18 03:31:00 +00:00
Step 1: Changing configuration
2018-08-14 02:36:26 +00:00
2018-04-18 03:34:46 +00:00
The configuration file for developement environment is located at `configs/development.py` , you can override some configs by editing `.env` file.
2018-04-01 09:10:07 +00:00
2018-04-18 03:31:00 +00:00
Step 2: Build docker images
2018-04-01 09:10:07 +00:00
2018-04-18 03:31:00 +00:00
```$ docker-compose build```
2018-04-01 09:10:07 +00:00
2018-04-18 03:31:00 +00:00
Step 3: Start docker containers
2018-04-01 09:10:07 +00:00
2018-04-18 03:31:00 +00:00
```$ docker-compose up```
2015-12-13 10:46:24 +00:00
2018-04-01 09:07:41 +00:00
You can now access PowerDNS-Admin at url http://localhost:9191
2015-12-13 10:46:24 +00:00
2018-04-18 03:31:00 +00:00
**NOTE:** For other methods to run PowerDNS-Admin, please take look at WIKI pages.
2015-12-13 10:58:26 +00:00
2016-05-14 01:42:39 +00:00
### Screenshots
2018-08-14 02:36:26 +00:00
![dashboard ](https://user-images.githubusercontent.com/6447444/44068603-0d2d81f6-9fa5-11e8-83af-14e2ad79e370.png )
2016-05-14 01:42:39 +00:00
2019-03-01 22:49:31 +00:00
### Running tests
**NOTE:** Tests will create `__pycache__` folders which will be owned by root, which might be issue during rebuild
thus (e.g. invalid tar headers message) when such situation occurs, you need to remove those folders as root
1. Build images
```
docker-compose -f docker-compose-test.yml build
```
2. Run tests
```
docker-compose -f docker-compose-test.yml up
```
3. Rerun tests
```
docker-compose -f docker-compose-test.yml down
```
To teardown previous environment
```
docker-compose -f docker-compose-test.yml up
```
To run tests again
### API Usage
1. run docker image docker-compose up, go to UI http://localhost:9191, at http://localhost:9191/swagger is swagger API specification
2. click to register user, type e.g. user: admin and password: admin
3. login to UI in settings enable allow domain creation for users,
now you can create and manage domains with admin account and also ordinary users
4. Encode your user and password to base64, in our example we have user admin and password admin so in linux cmd line we type:
```
someuser@somehost:~$echo -n 'admin:admin'|base64
YWRtaW46YWRtaW4=
```
we use generated output in basic authentication, we auhtenticate as user,
with basic authentication, we can create/delete/get zone and create/delete/get/update apikeys
creating domain:
```
curl -L -vvv -H 'Content-Type: application/json' -H 'Authorization: Basic YWRtaW46YWRtaW4=' -X POST http://localhost:9191/api/v1/pdnsadmin/zones --data '{"name": "yourdomain.com.", "kind": "NATIVE", "nameservers": ["ns1.mydomain.com."]}'
```
creating apikey which has Administrator role, apikey can have also User role, when creating such apikey you have to specify also domain for which apikey is valid:
```
curl -L -vvv -H 'Content-Type: application/json' -H 'Authorization: Basic YWRtaW46YWRtaW4=' -X POST http://localhost:9191/api/v1/pdnsadmin/apikeys --data '{"description": "masterkey","domains":[], "role": "Administrator"}'
```
call above will return response like this:
```
[{"description": "samekey", "domains": [], "role": {"name": "Administrator", "id": 1}, "id": 2, "plain_key": "aGCthP3KLAeyjZI"}]
```
we take plain_key and base64 encode it, this is the only time we can get API key in plain text and save it somewhere:
```
someuser@somehost:~$echo -n 'aGCthP3KLAeyjZI'|base64
YUdDdGhQM0tMQWV5alpJ
```
We can use apikey for all calls specified in our API specification (it tries to follow powerdns API 1:1, only tsigkeys endpoints are not yet implemented), don't forget to specify Content-Type!
getting powerdns configuration:
```
curl -L -vvv -H 'Content-Type: application/json' -H 'X-API-KEY: YUdDdGhQM0tMQWV5alpJ' -X GET http://localhost:9191/api/v1/servers/localhost/config
```
creating and updating records:
```
curl -X PATCH -H 'Content-Type: application/json' --data '{"rrsets": [{"name": "test1.yourdomain.com.","type": "A","ttl": 86400,"changetype": "REPLACE","records": [ {"content": "192.0.2.5", "disabled": false} ]},{"name": "test2.yourdomain.com.","type": "AAAA","ttl": 86400,"changetype": "REPLACE","records": [ {"content": "2001:db8::6", "disabled": false} ]}]}' -H 'X-API-Key: YUdDdGhQM0tMQWV5alpJ' http://127.0.0.1:9191/api/v1/servers/localhost/zones/yourdomain.com.
```
getting domain:
```
curl -L -vvv -H 'Content-Type: application/json' -H 'X-API-KEY: YUdDdGhQM0tMQWV5alpJ' -X GET http://localhost:9191/api/v1/servers/localhost/zones/yourdomain.com
```
list zone records:
```
curl -H 'Content-Type: application/json' -H 'X-API-Key: YUdDdGhQM0tMQWV5alpJ' http://localhost:9191/api/v1/servers/localhost/zones/yourdomain.com
```
add new record:
```
curl -H 'Content-Type: application/json' -X PATCH --data '{"rrsets": [ {"name": "test.yourdomain.com.", "type": "A", "ttl": 86400, "changetype": "REPLACE", "records": [ {"content": "192.0.5.4", "disabled": false } ] } ] }' -H 'X-API-Key: YUdDdGhQM0tMQWV5alpJ' http://localhost:9191/api/v1/servers/localhost/zones/yourdomain.com | jq .
```
update record:
```
curl -H 'Content-Type: application/json' -X PATCH --data '{"rrsets": [ {"name": "test.yourdomain.com.", "type": "A", "ttl": 86400, "changetype": "REPLACE", "records": [ {"content": "192.0.2.5", "disabled": false, "name": "test.yourdomain.com.", "ttl": 86400, "type": "A"}]}]}' -H 'X-API-Key: YUdDdGhQM0tMQWV5alpJ' http://localhost:9191/api/v1/servers/localhost/zones/yourdomain.com | jq .
```
delete record:
```
curl -H 'Content-Type: application/json' -X PATCH --data '{"rrsets": [ {"name": "test.yourdomain.com.", "type": "A", "ttl": 86400, "changetype": "DELETE"}]}' -H 'X-API-Key: YUdDdGhQM0tMQWV5alpJ' http://localhost:9191/api/v1/servers/localhost/zones/yourdomain.com | jq
```