diff --git a/migrations/versions/6ea7dc05f496_fix_typo_in_history_detail.py b/migrations/versions/6ea7dc05f496_fix_typo_in_history_detail.py new file mode 100644 index 0000000..6a03994 --- /dev/null +++ b/migrations/versions/6ea7dc05f496_fix_typo_in_history_detail.py @@ -0,0 +1,46 @@ +"""Fix typo in history detail + +Revision ID: 6ea7dc05f496 +Revises: fbc7cf864b24 +Create Date: 2022-05-10 10:16:58.784497 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '6ea7dc05f496' +down_revision = 'fbc7cf864b24' +branch_labels = None +depends_on = None + +history_table = sa.sql.table('history', + sa.Column('detail', sa.Text), + ) + + +def upgrade(): + op.execute( + history_table.update() + .where(history_table.c.detail.like('%"add_rrests":%')) + .values({ + 'detail': sa.func.replace( + sa.func.replace(history_table.c.detail, '"add_rrests":', '"add_rrsets":'), + '"del_rrests":', '"del_rrsets":' + ) + }) + ) + + +def downgrade(): + op.execute( + history_table.update() + .where(history_table.c.detail.like('%"add_rrsets":%')) + .values({ + 'detail': sa.func.replace( + sa.func.replace(history_table.c.detail, '"add_rrsets":', '"add_rrests":'), + '"del_rrsets":', '"del_rrests":' + ) + }) + ) diff --git a/powerdnsadmin/models/record.py b/powerdnsadmin/models/record.py index 9929b67..e56a6de 100644 --- a/powerdnsadmin/models/record.py +++ b/powerdnsadmin/models/record.py @@ -359,10 +359,10 @@ class Record(object): # rollback - re-add the removed record if the adding operation is failed. if del_rrsets["rrsets"]: - rollback_rrests = del_rrsets + rollback_rrsets = del_rrsets for r in del_rrsets["rrsets"]: r['changetype'] = 'REPLACE' - rollback = self.apply_rrsets(domain_name, rollback_rrests) + rollback = self.apply_rrsets(domain_name, rollback_rrsets) if 'error' in rollback.keys(): return dict(status='error', msg='Failed to apply changes. Cannot rollback previous failed operation: {}' diff --git a/powerdnsadmin/routes/admin.py b/powerdnsadmin/routes/admin.py index 7919c8c..ab5dce0 100644 --- a/powerdnsadmin/routes/admin.py +++ b/powerdnsadmin/routes/admin.py @@ -23,6 +23,7 @@ from ..models.domain_template_record import DomainTemplateRecord from ..models.api_key import ApiKey from ..models.base import db +from ..lib.errors import ApiKeyCreateFail from ..lib.schema import ApiPlainKeySchema apikey_plain_schema = ApiPlainKeySchema(many=True) @@ -43,10 +44,10 @@ change_type: "addition" or "deletion" or "status" for status change or "unchange Note: A change in "content", is considered a deletion and recreation of the same record, holding the new content value. """ -def get_record_changes(del_rrest, add_rrest): +def get_record_changes(del_rrset, add_rrset): changeSet = [] - delSet = del_rrest['records'] if 'records' in del_rrest else [] - addSet = add_rrest['records'] if 'records' in add_rrest else [] + delSet = del_rrset['records'] if 'records' in del_rrset else [] + addSet = add_rrset['records'] if 'records' in add_rrset else [] for d in delSet: # get the deletions and status changes exists = False for a in addSet: @@ -86,44 +87,44 @@ def get_record_changes(del_rrest, add_rrest): return changeSet # out_changes is a list of HistoryRecordEntry objects in which we will append the new changes -# a HistoryRecordEntry represents a pair of add_rrest and del_rrest +# a HistoryRecordEntry represents a pair of add_rrset and del_rrset def extract_changelogs_from_a_history_entry(out_changes, history_entry, change_num, record_name=None, record_type=None): if history_entry.detail is None: return - if "add_rrests" in history_entry.detail: + if "add_rrsets" in history_entry.detail: detail_dict = json.loads(history_entry.detail) else: # not a record entry return - add_rrests = detail_dict['add_rrests'] - del_rrests = detail_dict['del_rrests'] + add_rrsets = detail_dict['add_rrsets'] + del_rrsets = detail_dict['del_rrsets'] - for add_rrest in add_rrests: + for add_rrset in add_rrsets: exists = False - for del_rrest in del_rrests: - if del_rrest['name'] == add_rrest['name'] and del_rrest['type'] == add_rrest['type']: + for del_rrset in del_rrsets: + if del_rrset['name'] == add_rrset['name'] and del_rrset['type'] == add_rrset['type']: exists = True if change_num not in out_changes: out_changes[change_num] = [] - out_changes[change_num].append(HistoryRecordEntry(history_entry, del_rrest, add_rrest, "*")) + out_changes[change_num].append(HistoryRecordEntry(history_entry, del_rrset, add_rrset, "*")) break if not exists: # this is a new record if change_num not in out_changes: out_changes[change_num] = [] - out_changes[change_num].append(HistoryRecordEntry(history_entry, [], add_rrest, "+")) # (add_rrest, del_rrest, change_type) - for del_rrest in del_rrests: + out_changes[change_num].append(HistoryRecordEntry(history_entry, [], add_rrset, "+")) # (add_rrset, del_rrset, change_type) + for del_rrset in del_rrsets: exists = False - for add_rrest in add_rrests: - if del_rrest['name'] == add_rrest['name'] and del_rrest['type'] == add_rrest['type']: + for add_rrset in add_rrsets: + if del_rrset['name'] == add_rrset['name'] and del_rrset['type'] == add_rrset['type']: exists = True # no need to add in the out_changes set break if not exists: # this is a deletion if change_num not in out_changes: out_changes[change_num] = [] - out_changes[change_num].append(HistoryRecordEntry(history_entry, del_rrest, [], "-")) + out_changes[change_num].append(HistoryRecordEntry(history_entry, del_rrset, [], "-")) # only used for changelog per record @@ -133,9 +134,9 @@ def extract_changelogs_from_a_history_entry(out_changes, history_entry, change_n else: return for hre in changes_i: # for each history record entry in changes_i - if 'type' in hre.add_rrest and hre.add_rrest['name'] == record_name and hre.add_rrest['type'] == record_type: + if 'type' in hre.add_rrset and hre.add_rrset['name'] == record_name and hre.add_rrset['type'] == record_type: continue - elif 'type' in hre.del_rrest and hre.del_rrest['name'] == record_name and hre.del_rrest['type'] == record_type: + elif 'type' in hre.del_rrset and hre.del_rrset['name'] == record_name and hre.del_rrset['type'] == record_type: continue else: out_changes[change_num].remove(hre) @@ -144,42 +145,42 @@ def extract_changelogs_from_a_history_entry(out_changes, history_entry, change_n # records with same (name,type) are considered as a single HistoryRecordEntry # history_entry is of type History - used to extract created_by and created_on -# add_rrest is a dictionary of replace -# del_rrest is a dictionary of remove +# add_rrset is a dictionary of replace +# del_rrset is a dictionary of remove class HistoryRecordEntry: - def __init__(self, history_entry, del_rrest, add_rrest, change_type): - # search the add_rrest index into the add_rrest set for the key (name, type) + def __init__(self, history_entry, del_rrset, add_rrset, change_type): + # search the add_rrset index into the add_rrset set for the key (name, type) self.history_entry = history_entry - self.add_rrest = add_rrest - self.del_rrest = del_rrest + self.add_rrset = add_rrset + self.del_rrset = del_rrset self.change_type = change_type # "*": edit or unchanged, "+" new tuple(name,type), "-" deleted (name,type) tuple self.changed_fields = [] # contains a subset of : [ttl, name, type] - self.changeSet = [] # all changes for the records of this add_rrest-del_rrest pair + self.changeSet = [] # all changes for the records of this add_rrset-del_rrset pair if change_type == "+": # addition self.changed_fields.append("name") self.changed_fields.append("type") self.changed_fields.append("ttl") - self.changeSet = get_record_changes(del_rrest, add_rrest) + self.changeSet = get_record_changes(del_rrset, add_rrset) elif change_type == "-": # removal self.changed_fields.append("name") self.changed_fields.append("type") self.changed_fields.append("ttl") - self.changeSet = get_record_changes(del_rrest, add_rrest) + self.changeSet = get_record_changes(del_rrset, add_rrset) elif change_type == "*": # edit of unchanged - if add_rrest['ttl'] != del_rrest['ttl']: + if add_rrset['ttl'] != del_rrset['ttl']: self.changed_fields.append("ttl") - self.changeSet = get_record_changes(del_rrest, add_rrest) + self.changeSet = get_record_changes(del_rrset, add_rrset) def toDict(self): return { - "add_rrest" : self.add_rrest, - "del_rrest" : self.del_rrest, + "add_rrset" : self.add_rrset, + "del_rrset" : self.del_rrset, "changed_fields" : self.changed_fields, "created_on" : self.history_entry.created_on, "created_by" : self.history_entry.created_by, @@ -803,7 +804,7 @@ class DetailedHistory(): authenticator=detail_dict['authenticator'], ip_address=detail_dict['ip_address']) - elif 'add_rrests' in detail_dict: # this is a domain record change + elif 'add_rrsets' in detail_dict: # this is a domain record change # changes_set = [] self.detailed_msg = "" # extract_changelogs_from_a_history_entry(changes_set, history, 0) @@ -902,7 +903,7 @@ def convert_histories(histories): detailedHistories = [] j = 0 for i in range(len(histories)): - if histories[i].detail and ('add_rrests' in histories[i].detail or 'del_rrests' in histories[i].detail): + if histories[i].detail and ('add_rrsets' in histories[i].detail or 'del_rrsets' in histories[i].detail): extract_changelogs_from_a_history_entry(changes_set, histories[i], j) if j in changes_set: detailedHistories.append(DetailedHistory(histories[i], changes_set[j])) diff --git a/powerdnsadmin/routes/domain.py b/powerdnsadmin/routes/domain.py index fe9e98c..6cc1bc1 100644 --- a/powerdnsadmin/routes/domain.py +++ b/powerdnsadmin/routes/domain.py @@ -63,7 +63,7 @@ def domain(domain_name): # Query domain's rrsets from PowerDNS API rrsets = Record().get_rrsets(domain.name) - current_app.logger.debug("Fetched rrests: \n{}".format(pretty_json(rrsets))) + current_app.logger.debug("Fetched rrsets: \n{}".format(pretty_json(rrsets))) # API server might be down, misconfigured if not rrsets and domain.type != 'Slave': @@ -202,7 +202,7 @@ def changelog(domain_name): # Query domain's rrsets from PowerDNS API rrsets = Record().get_rrsets(domain.name) - current_app.logger.debug("Fetched rrests: \n{}".format(pretty_json(rrsets))) + current_app.logger.debug("Fetched rrsets: \n{}".format(pretty_json(rrsets))) # API server might be down, misconfigured if not rrsets and domain.type != 'Slave': @@ -290,7 +290,7 @@ def record_changelog(domain_name, record_name, record_type): abort(404) # Query domain's rrsets from PowerDNS API rrsets = Record().get_rrsets(domain.name) - current_app.logger.debug("Fetched rrests: \n{}".format(pretty_json(rrsets))) + current_app.logger.debug("Fetched rrsets: \n{}".format(pretty_json(rrsets))) # API server might be down, misconfigured if not rrsets and domain.type != 'Slave': @@ -328,9 +328,9 @@ def record_changelog(domain_name, record_name, record_type): for change_num in changes_set_of_record: changes_i = changes_set_of_record[change_num] for hre in changes_i: # for each history record entry in changes_i - if 'type' in hre.add_rrest and hre.add_rrest['name'] == record_name and hre.add_rrest['type'] == record_type: + if 'type' in hre.add_rrset and hre.add_rrset['name'] == record_name and hre.add_rrset['type'] == record_type: continue - elif 'type' in hre.del_rrest and hre.del_rrest['name'] == record_name and hre.del_rrest['type'] == record_type: + elif 'type' in hre.del_rrset and hre.del_rrset['name'] == record_name and hre.del_rrset['type'] == record_type: continue else: changes_set_of_record[change_num].remove(hre) @@ -450,9 +450,9 @@ def add(): domain_name, 'template': template.name, - 'add_rrests': + 'add_rrsets': result['data'][0]['rrsets'], - 'del_rrests': + 'del_rrsets': result['data'][1]['rrsets'] }), created_by=current_user.username, @@ -685,8 +685,8 @@ def record_apply(domain_name): msg='Apply record changes to domain {0}'.format(pretty_domain_name(domain_name)), detail = json.dumps({ 'domain': domain_name, - 'add_rrests': result['data'][0]['rrsets'], - 'del_rrests': result['data'][1]['rrsets'] + 'add_rrsets': result['data'][0]['rrsets'], + 'del_rrsets': result['data'][1]['rrsets'] }), created_by=current_user.username, domain_id=domain.id) diff --git a/powerdnsadmin/templates/applied_change_macro.html b/powerdnsadmin/templates/applied_change_macro.html index 4bb1c4f..6a49b01 100644 --- a/powerdnsadmin/templates/applied_change_macro.html +++ b/powerdnsadmin/templates/applied_change_macro.html @@ -7,28 +7,28 @@ {% if hist_rec_entry.change_type == "+" %} {{hist_rec_entry.add_rrest['name']}} - {{hist_rec_entry.add_rrest['type']}} + style="background-color: lightgreen">{{hist_rec_entry.add_rrset['name']}} + {{hist_rec_entry.add_rrset['type']}} {% elif hist_rec_entry.change_type == "-" %} - {{hist_rec_entry.del_rrest['name']}} - {{hist_rec_entry.del_rrest['type']}} + {{hist_rec_entry.del_rrset['name']}} + {{hist_rec_entry.del_rrset['type']}} {% else %} - {{hist_rec_entry.add_rrest['name']}} - {{hist_rec_entry.add_rrest['type']}} + {{hist_rec_entry.add_rrset['name']}} + {{hist_rec_entry.add_rrset['type']}} {% endif %} , TTL: {% if "ttl" in hist_rec_entry.changed_fields %} - {{hist_rec_entry.del_rrest['ttl']}} + {{hist_rec_entry.del_rrset['ttl']}} {{hist_rec_entry.add_rrest['ttl']}} + style="background-color: lightgreen">{{hist_rec_entry.add_rrset['ttl']}} {% else %} - {{hist_rec_entry.add_rrest['ttl']}} + {{hist_rec_entry.add_rrset['ttl']}} {% endif %} @@ -120,7 +120,7 @@ - {% for comments in hist_rec_entry.add_rrest['comments'] %} + {% for comments in hist_rec_entry.add_rrset['comments'] %} {{comments['content'] }}
{% endfor %} @@ -130,4 +130,4 @@ {% endfor %} -{%- endmacro %} \ No newline at end of file +{%- endmacro %}