Add download zonefile button to external DNS page (#1853)
Co-authored-by: Joshua Tauberer <jt@occams.info>
This commit is contained in:
parent
7fd35bbd11
commit
b85b86e6de
|
@ -743,6 +743,31 @@ paths:
|
||||||
text/html:
|
text/html:
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
|
/dns/zonefile/{zone}:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- DNS
|
||||||
|
summary: Get DNS zonefile
|
||||||
|
description: Returns an array of all managed top-level domains.
|
||||||
|
operationId: getDnsZonefile
|
||||||
|
x-codeSamples:
|
||||||
|
- lang: curl
|
||||||
|
source: |
|
||||||
|
curl -X GET "https://{host}/admin/dns/zonefile/<zone>" \
|
||||||
|
-u "<email>:<password>"
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Successful operation
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/DNSZonefileResponse'
|
||||||
|
403:
|
||||||
|
description: Forbidden
|
||||||
|
content:
|
||||||
|
text/html:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
/dns/update:
|
/dns/update:
|
||||||
post:
|
post:
|
||||||
tags:
|
tags:
|
||||||
|
@ -2050,6 +2075,8 @@ components:
|
||||||
items:
|
items:
|
||||||
$ref: '#/components/schemas/Hostname'
|
$ref: '#/components/schemas/Hostname'
|
||||||
description: DNS zones response.
|
description: DNS zones response.
|
||||||
|
DNSZonefileResponse:
|
||||||
|
type: string
|
||||||
DNSSecondaryNameserverResponse:
|
DNSSecondaryNameserverResponse:
|
||||||
type: object
|
type: object
|
||||||
required:
|
required:
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#!/usr/local/lib/mailinabox/env/bin/python3
|
||||||
|
|
||||||
import os, os.path, re, json, time
|
import os, os.path, re, json, time
|
||||||
import multiprocessing.pool, subprocess
|
import multiprocessing.pool, subprocess
|
||||||
|
|
||||||
|
@ -338,6 +340,12 @@ def dns_get_dump():
|
||||||
from dns_update import build_recommended_dns
|
from dns_update import build_recommended_dns
|
||||||
return json_response(build_recommended_dns(env))
|
return json_response(build_recommended_dns(env))
|
||||||
|
|
||||||
|
@app.route('/dns/zonefile/<zone>')
|
||||||
|
@authorized_personnel_only
|
||||||
|
def dns_get_zonefile(zone):
|
||||||
|
from dns_update import get_dns_zonefile
|
||||||
|
return Response(get_dns_zonefile(zone, env), status=200, mimetype='text/plain')
|
||||||
|
|
||||||
# SSL
|
# SSL
|
||||||
|
|
||||||
@app.route('/ssl/status')
|
@app.route('/ssl/status')
|
||||||
|
|
|
@ -564,6 +564,17 @@ $TTL 1800 ; default time to live
|
||||||
|
|
||||||
return True # file is updated
|
return True # file is updated
|
||||||
|
|
||||||
|
def get_dns_zonefile(zone, env):
|
||||||
|
for domain, fn in get_dns_zones(env):
|
||||||
|
if zone == domain:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise ValueError("%s is not a domain name that corresponds to a zone." % zone)
|
||||||
|
|
||||||
|
nsd_zonefile = "/etc/nsd/zones/" + fn
|
||||||
|
with open(nsd_zonefile, "r") as f:
|
||||||
|
return f.read()
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
|
|
||||||
def write_nsd_conf(zonefiles, additional_records, env):
|
def write_nsd_conf(zonefiles, additional_records, env):
|
||||||
|
|
|
@ -42,6 +42,19 @@
|
||||||
You may need to adopt this technique when adding DomainKeys. Use a tool like <code>named-checkzone</code> to validate your zone file.
|
You may need to adopt this technique when adding DomainKeys. Use a tool like <code>named-checkzone</code> to validate your zone file.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<h3>Download zonefile</h3>
|
||||||
|
<p>You can download your zonefiles here or use the table of records below.</p>
|
||||||
|
<form class="form-inline" role="form" onsubmit="do_download_zonefile(); return false;">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="downloadZonefile" class="control-label sr-only">Zone</label>
|
||||||
|
<select id="downloadZonefile" class="form-control" style="width: auto"> </select>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary">Download</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<h3>Records</h3>
|
||||||
|
|
||||||
<table id="external_dns_settings" class="table">
|
<table id="external_dns_settings" class="table">
|
||||||
<thead>
|
<thead>
|
||||||
|
@ -57,6 +70,18 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
function show_external_dns() {
|
function show_external_dns() {
|
||||||
|
api(
|
||||||
|
"/dns/zones",
|
||||||
|
"GET",
|
||||||
|
{ },
|
||||||
|
function(data) {
|
||||||
|
var zones = $('#downloadZonefile');
|
||||||
|
zones.text('');
|
||||||
|
for (var j = 0; j < data.length; j++) {
|
||||||
|
zones.append($('<option/>').text(data[j]));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$('#external_dns_settings tbody').html("<tr><td colspan='2' class='text-muted'>Loading...</td></tr>")
|
$('#external_dns_settings tbody').html("<tr><td colspan='2' class='text-muted'>Loading...</td></tr>")
|
||||||
api(
|
api(
|
||||||
"/dns/dump",
|
"/dns/dump",
|
||||||
|
@ -84,4 +109,19 @@ function show_external_dns() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function do_download_zonefile() {
|
||||||
|
var zone = $('#downloadZonefile').val();
|
||||||
|
|
||||||
|
api(
|
||||||
|
"/dns/zonefile/"+ zone,
|
||||||
|
"GET",
|
||||||
|
{},
|
||||||
|
function(data) {
|
||||||
|
show_modal_error("Download Zonefile", $("<pre/>").text(data));
|
||||||
|
},
|
||||||
|
function(err) {
|
||||||
|
show_modal_error("Download Zonefile (Error)", $("<pre/>").text(err));
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in New Issue