mirror of
				https://github.com/mail-in-a-box/mailinabox.git
				synced 2025-11-02 19:20:54 +00:00 
			
		
		
		
	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):
 | 
				
			||||||
 | 
				
			|||||||
@ -89,7 +89,7 @@
 | 
				
			|||||||
  <div class="form-group">
 | 
					  <div class="form-group">
 | 
				
			||||||
    <div class="col-sm-offset-1 col-sm-11">
 | 
					    <div class="col-sm-offset-1 col-sm-11">
 | 
				
			||||||
      <p class="small">
 | 
					      <p class="small">
 | 
				
			||||||
        Multiple secondary servers can be separated with commas or spaces (i.e., <code>ns2.hostingcompany.com ns3.hostingcompany.com</code>). 
 | 
					        Multiple secondary servers can be separated with commas or spaces (i.e., <code>ns2.hostingcompany.com ns3.hostingcompany.com</code>).
 | 
				
			||||||
        To enable zone transfers to additional servers without listing them as secondary nameservers, add an IP address or subnet using <code>xfr:10.20.30.40</code> or <code>xfr:10.0.0.0/8</code>.
 | 
					        To enable zone transfers to additional servers without listing them as secondary nameservers, add an IP address or subnet using <code>xfr:10.20.30.40</code> or <code>xfr:10.0.0.0/8</code>.
 | 
				
			||||||
      </p>
 | 
					      </p>
 | 
				
			||||||
      <p id="secondarydns-clear-instructions" style="display: none" class="small">
 | 
					      <p id="secondarydns-clear-instructions" style="display: none" class="small">
 | 
				
			||||||
 | 
				
			|||||||
@ -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
	
	Block a user