From 1d973d16141a6830d119cf1fe2802f56125e2957 Mon Sep 17 00:00:00 2001 From: Khanh Ngo Date: Wed, 11 Dec 2019 16:02:36 +0700 Subject: [PATCH] Allow update zone kind the domain setting page --- powerdnsadmin/models/domain.py | 43 ++++++++++++++ powerdnsadmin/routes/domain.py | 64 +++++++++++++++++---- powerdnsadmin/templates/domain_add.html | 2 +- powerdnsadmin/templates/domain_setting.html | 56 +++++++++++++++++- 4 files changed, 151 insertions(+), 14 deletions(-) diff --git a/powerdnsadmin/models/domain.py b/powerdnsadmin/models/domain.py index c81e88c..90173f1 100644 --- a/powerdnsadmin/models/domain.py +++ b/powerdnsadmin/models/domain.py @@ -355,6 +355,49 @@ class Domain(db.Model): 'msg': 'Cannot change soa-edit-api this domain.' } + def update_kind(self, domain_name, kind, masters=[]): + """ + Update zone kind: Native / Master / Slave + """ + domain = Domain.query.filter(Domain.name == domain_name).first() + if not domain: + return {'status': 'error', 'msg': 'Domain doesnt exist.'} + headers = {} + headers['X-API-Key'] = self.PDNS_API_KEY + + post_data = {"kind": kind, "masters": masters} + + try: + jdata = utils.fetch_json(urljoin( + self.PDNS_STATS_URL, self.API_EXTENDED_URL + + '/servers/localhost/zones/{0}'.format(domain.name)), + headers=headers, + timeout=int( + Setting().get('pdns_api_timeout')), + method='PUT', + data=post_data) + if 'error' in jdata.keys(): + current_app.logger.error(jdata['error']) + return {'status': 'error', 'msg': jdata['error']} + else: + current_app.logger.info( + 'Update domain kind for {0} successfully'.format( + domain_name)) + return { + 'status': 'ok', + 'msg': 'Domain kind changed successfully' + } + except Exception as e: + current_app.logger.error( + 'Cannot update kind for domain {0}. Error: {1}'.format( + domain_name, e)) + current_app.logger.debug(traceback.format_exc()) + + return { + 'status': 'error', + 'msg': 'Cannot update kind for this domain.' + } + def create_reverse_domain(self, domain_name, domain_reverse_name): """ Check the existing reverse lookup domain, diff --git a/powerdnsadmin/routes/domain.py b/powerdnsadmin/routes/domain.py index 8aec6c0..6d3b413 100644 --- a/powerdnsadmin/routes/domain.py +++ b/powerdnsadmin/routes/domain.py @@ -114,6 +114,7 @@ def add(): 'errors/400.html', msg="Please enter a valid domain name"), 400 + #TODO: Validate ip addresses input if domain_type == 'slave': if request.form.getlist('domain_master_address'): domain_master_string = request.form.getlist( @@ -258,6 +259,47 @@ def setting(domain_name): return redirect(url_for('domain.setting', domain_name=domain_name)) +@domain_bp.route('/setting//change_type', + methods=['POST']) +@login_required +@operator_role_required +def change_type(domain_name): + domain = Domain.query.filter(Domain.name == domain_name).first() + if not domain: + abort(404) + domain_type = request.form.get('domain_type') + if domain_type is None: + abort(500) + if domain_type == '0': + return redirect(url_for('domain.setting', domain_name=domain_name)) + + #TODO: Validate ip addresses input + domain_master_ips = [] + if domain_type == 'slave' and request.form.getlist('domain_master_address'): + domain_master_string = request.form.getlist( + 'domain_master_address')[0] + domain_master_string = domain_master_string.replace( + ' ', '') + domain_master_ips = domain_master_string.split(',') + + d = Domain() + status = d.update_kind(domain_name=domain_name, + kind=domain_type, + masters=domain_master_ips) + if status['status'] == 'ok': + history = History(msg='Update type for domain {0}'.format(domain_name), + detail=str({ + "domain": domain_name, + "type": domain_type, + "masters": domain_master_ips + }), + created_by=current_user.username) + history.add() + return redirect(url_for('domain.setting', domain_name = domain_name)) + else: + abort(500) + + @domain_bp.route('/setting//change_soa_setting', methods=['POST']) @login_required @@ -275,18 +317,16 @@ def change_soa_edit_api(domain_name): d = Domain() status = d.update_soa_setting(domain_name=domain_name, soa_edit_api=new_setting) - if status['status'] != None: - users = User.query.all() - accounts = Account.query.all() - d = Domain(name=domain_name) - domain_user_ids = d.get_user() - account = d.get_account() - return render_template('domain_setting.html', - domain=domain, - users=users, - domain_user_ids=domain_user_ids, - accounts=accounts, - domain_account=account) + if status['status'] == 'ok': + history = History( + msg='Update soa_edit_api for domain {0}'.format(domain_name), + detail=str({ + "domain": domain_name, + "soa_edit_api": new_setting + }), + created_by=current_user.username) + history.add() + return redirect(url_for('domain.setting', domain_name = domain_name)) else: abort(500) diff --git a/powerdnsadmin/templates/domain_add.html b/powerdnsadmin/templates/domain_add.html index 2898934..f6e0054 100644 --- a/powerdnsadmin/templates/domain_add.html +++ b/powerdnsadmin/templates/domain_add.html @@ -125,7 +125,7 @@
  • Native - PowerDNS will not perform any replication. Use this if you only have one - PowerDNS server or you handle replication via your backend (MySQL). + PowerDNS server or you handle replication via your backend.
  • Master - This PowerDNS server will serve as the master and will send zone transfers diff --git a/powerdnsadmin/templates/domain_setting.html b/powerdnsadmin/templates/domain_setting.html index cb92d0a..e5049eb 100644 --- a/powerdnsadmin/templates/domain_setting.html +++ b/powerdnsadmin/templates/domain_setting.html @@ -134,6 +134,50 @@ +
    +
    +
    +
    +

    Change Type

    +
    +
    +

    The type decides how the domain will be replicated across multiple DNS servers.

    +
      +
    • + Native - PowerDNS will not perform any replication. Use this if you only have one + PowerDNS server or you handle replication via your backend. +
    • +
    • + Master - This PowerDNS server will serve as the master and will send zone transfers + (AXFRs) to other servers configured as slaves. +
    • +
    • + Slave - This PowerDNS server will serve as the slave and will request and receive + zone transfers (AXFRs) from other servers configured as masters. +
    • +
    + New Domain Type Setting: +
    + +
    + + +
    +
    +
    +
    +
    @@ -254,8 +298,18 @@ modal.modal('hide'); }) modal.modal('show'); - }); + + // domain master address input handeling + $("select[name=domain_type]").change(function () { + var type = $(this).val(); + if (type == "slave") { + $("#domain_master_address_div").show(); + } else { + $("#domain_master_address_div").hide(); + } + }); + {% endblock %} {% block modals %}