mirror of
https://github.com/cwinfo/powerdns-admin.git
synced 2024-12-29 06:25:40 +00:00
Added the ability to create a template based on the zone records
This commit is contained in:
parent
52a5789c85
commit
12cfc4dbc1
@ -181,6 +181,11 @@
|
|||||||
</td>
|
</td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td width="20%">
|
<td width="20%">
|
||||||
|
{% if current_user.role.name == 'Administrator' %}
|
||||||
|
<button type="button" class="btn btn-flat btn-success button_template" id="{{ domain.name }}">
|
||||||
|
Template <i class="fa fa-clone"></i>
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
<button type="button" class="btn btn-flat btn-success" onclick="window.location.href='{{ url_for('domain', domain_name=domain.name) }}'">
|
<button type="button" class="btn btn-flat btn-success" onclick="window.location.href='{{ url_for('domain', domain_name=domain.name) }}'">
|
||||||
Manage <i class="fa fa-cog"></i>
|
Manage <i class="fa fa-cog"></i>
|
||||||
</button>
|
</button>
|
||||||
@ -242,6 +247,31 @@
|
|||||||
var domain = $(this).prop('id');
|
var domain = $(this).prop('id');
|
||||||
getdnssec($SCRIPT_ROOT + '/domain/' + domain + '/dnssec');
|
getdnssec($SCRIPT_ROOT + '/domain/' + domain + '/dnssec');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$(document.body).on("click", ".button_template", function (e) {
|
||||||
|
var modal = $("#modal_template");
|
||||||
|
var domain = $(this).prop('id');
|
||||||
|
var form = " <label for=\"template_name\">Template name</label> \
|
||||||
|
<input type=\"text\" class=\"form-control\" name=\"template_name\" id=\"template_name\" placeholder=\"Enter a valid template name (required)\"> \
|
||||||
|
<label for=\"template_description\">Template description</label> \
|
||||||
|
<input type=\"text\" class=\"form-control\" name=\"template_description\" id=\"template_description\" placeholder=\"Enter a template description (optional)\"> \
|
||||||
|
<input id=\"domain\" name=\"domain\" type=\"hidden\" value=\""+domain+"\"> \
|
||||||
|
";
|
||||||
|
modal.find('.modal-body p').html(form);
|
||||||
|
modal.find('#button_save').click(function() {
|
||||||
|
var data = {};
|
||||||
|
data['name'] = modal.find('#template_name').val();
|
||||||
|
data['description'] = modal.find('#template_description').val();
|
||||||
|
data['domain'] = modal.find('#domain').val();
|
||||||
|
applyChanges(data, $SCRIPT_ROOT + "{{ url_for('create_template_from_zone') }}", true);
|
||||||
|
modal.modal('hide');
|
||||||
|
})
|
||||||
|
modal.find('#button_close').click(function() {
|
||||||
|
modal.modal('hide');
|
||||||
|
})
|
||||||
|
|
||||||
|
modal.modal('show');
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block modals %}
|
{% block modals %}
|
||||||
@ -291,4 +321,27 @@
|
|||||||
<!-- /.modal-dialog -->
|
<!-- /.modal-dialog -->
|
||||||
</div>
|
</div>
|
||||||
<!-- /.modal -->
|
<!-- /.modal -->
|
||||||
|
<div class="modal fade modal-primary" id="modal_template">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal"
|
||||||
|
aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
<h4 class="modal-title">Clone to template</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<p></p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-flat btn-default pull-left"
|
||||||
|
id="button_close" data-dismiss="modal">Close</button>
|
||||||
|
<button type="button" class="btn btn-flat btn-primary" id="button_save">Save</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.modal-content -->
|
||||||
|
</div>
|
||||||
|
<!-- /.modal-dialog -->
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -65,7 +65,7 @@
|
|||||||
{% for template in templates %}
|
{% for template in templates %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<strong>{{ template.name }}</strong>
|
<a href="{{ url_for('edit_template', template=template.name) }}"><strong>{{ template.name }}</strong></a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{ template.description }}
|
{{ template.description }}
|
||||||
|
@ -265,7 +265,6 @@
|
|||||||
<label for=\"srv_target\">SRV Target</label> \
|
<label for=\"srv_target\">SRV Target</label> \
|
||||||
<input type=\"text\" class=\"form-control\" name=\"srv_target\" id=\"srv_target\" placeholder=\"sip.example.com\"> \
|
<input type=\"text\" class=\"form-control\" name=\"srv_target\" id=\"srv_target\" placeholder=\"sip.example.com\"> \
|
||||||
";
|
";
|
||||||
modal.modal('show');
|
|
||||||
} else {
|
} else {
|
||||||
var parts = record_data.val().split(" ");
|
var parts = record_data.val().split(" ");
|
||||||
var form = " <label for=\"srv_priority\">SRV Priority</label> \
|
var form = " <label for=\"srv_priority\">SRV Priority</label> \
|
||||||
@ -288,6 +287,7 @@
|
|||||||
record_data.val(data);
|
record_data.val(data);
|
||||||
modal.modal('hide');
|
modal.modal('hide');
|
||||||
})
|
})
|
||||||
|
modal.modal('show');
|
||||||
} else if (record_type == "SOA") {
|
} else if (record_type == "SOA") {
|
||||||
var modal = $("#modal_custom_record");
|
var modal = $("#modal_custom_record");
|
||||||
if (record_data.val() == "") {
|
if (record_data.val() == "") {
|
||||||
|
60
app/views.py
60
app/views.py
@ -577,6 +577,66 @@ def create_template():
|
|||||||
return redirect(url_for('templates'))
|
return redirect(url_for('templates'))
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/template/createfromzone', methods=['POST'])
|
||||||
|
@login_required
|
||||||
|
@admin_role_required
|
||||||
|
def create_template_from_zone():
|
||||||
|
try:
|
||||||
|
pdata = request.data
|
||||||
|
jdata = json.loads(pdata)
|
||||||
|
name = jdata['name']
|
||||||
|
description = jdata['description']
|
||||||
|
domain_name = jdata['domain']
|
||||||
|
|
||||||
|
if ' ' in name or not name or not type:
|
||||||
|
return make_response(jsonify({'status': 'error', 'msg': 'Please correct template name'}), 500)
|
||||||
|
|
||||||
|
if DomainTemplate.query.filter(DomainTemplate.name == name).first():
|
||||||
|
return make_response(jsonify({'status': 'error', 'msg': 'A template with the name %s already exists!' % name}), 500)
|
||||||
|
|
||||||
|
t = DomainTemplate(name=name, description=description)
|
||||||
|
result = t.create()
|
||||||
|
if result['status'] == 'ok':
|
||||||
|
history = History(msg='Add domain template %s' % name, detail=str({'name': name, 'description': description}), created_by=current_user.username)
|
||||||
|
history.add()
|
||||||
|
|
||||||
|
records = []
|
||||||
|
r = Record()
|
||||||
|
domain = Domain.query.filter(Domain.name == domain_name).first()
|
||||||
|
if domain:
|
||||||
|
# query domain info from PowerDNS API
|
||||||
|
zone_info = r.get_record_data(domain.name)
|
||||||
|
if zone_info:
|
||||||
|
jrecords = zone_info['records']
|
||||||
|
|
||||||
|
if NEW_SCHEMA:
|
||||||
|
for jr in jrecords:
|
||||||
|
name = '@' if jr['name'] == domain_name else jr['name']
|
||||||
|
if jr['type'] in app.config['RECORDS_ALLOW_EDIT']:
|
||||||
|
for subrecord in jr['records']:
|
||||||
|
|
||||||
|
record = DomainTemplateRecord(name=name, type=jr['type'], status=True if subrecord['disabled'] else False, ttl=jr['ttl'], data=subrecord['content'])
|
||||||
|
records.append(record)
|
||||||
|
else:
|
||||||
|
for jr in jrecords:
|
||||||
|
if jr['type'] in app.config['RECORDS_ALLOW_EDIT']:
|
||||||
|
record = DomainTemplateRecord(name=name, type=jr['type'], status=True if jr['disabled'] else False, ttl=jr['ttl'], data=jr['content'])
|
||||||
|
records.append(record)
|
||||||
|
result_records = t.replace_records(records)
|
||||||
|
|
||||||
|
if result_records['status'] == 'ok':
|
||||||
|
return make_response(jsonify({'status': 'ok', 'msg': result['msg']}), 200)
|
||||||
|
else:
|
||||||
|
result = t.delete_template()
|
||||||
|
return make_response(jsonify({'status': 'error', 'msg': result_records['msg']}), 500)
|
||||||
|
|
||||||
|
else:
|
||||||
|
return make_response(jsonify({'status': 'error', 'msg': result['msg']}), 500)
|
||||||
|
except Exception:
|
||||||
|
print traceback.format_exc()
|
||||||
|
return make_response(jsonify({'status': 'error', 'msg': 'Error when applying new changes'}), 500)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/template/<string:template>/edit', methods=['GET'])
|
@app.route('/template/<string:template>/edit', methods=['GET'])
|
||||||
@login_required
|
@login_required
|
||||||
@admin_role_required
|
@admin_role_required
|
||||||
|
Loading…
Reference in New Issue
Block a user