def post(self): domain_id = request.form.get('domain_id') if domain_id is None: abort(400, message="domain_id parameter is required") domain_id = int(domain_id) # check if the domain exists try: domain = self.get_domain(domain_id) except peewee.DoesNotExist: abort(404, message="domain_id does not exist: " + str(domain_id)) record_type = request.form.get('record_type') try: readable_type = RecordType().set(record_type) except RecordTypeException: abort(400, message="Invalid record_type: " + str(record_type)) # If SOA, make sure a record doesn't yet exist if record_type == "SOA": try: ModelRecord.get( ModelRecord.type == RecordType().set(record_type), ModelRecord.domain_id == domain_id) abort(400, message="SOA record already exists for this domain") except peewee.DoesNotExist: pass TypeModel = RecordType().get_class(RecordType().set(record_type))() self.request_form_to_type_model(request.form, TypeModel, domain) TypeModel.values["domain_id"] = domain.domain_id model = TypeModel.to_model() # get domain and check authorization domain = self.auth.account.get_domain_by_record_acl( domain_id, model.host, record_type) if domain is False: self.auth.account.load_domains() domain = self.get_write_domain(domain_id) try: model.save() except RecordValueException as e: abort(400, message=e.message) self.dns_log(domain.domain_id, ("added " + record_type + " with host " + model.host + " and value " + model.val)) # notify listeners of dns data change self.send_update_notification() return {'status': 'ok', 'record': model.to_recordtype().to_dict()}, 201
def post(self): domain_id = request.form.get('domain_id') if domain_id is None: abort(400, message="domain_id parameter is required") domain_id = int(domain_id) # check if the domain exists try: self.get_domain(domain_id) except peewee.DoesNotExist: abort(404, message="domain_id does not exist: " + domain_id) # get domain and check authorization self.auth.account.load_domains() domain = self.get_write_domain(domain_id) record_type = request.form.get('record_type') try: readable_type = RecordType().set(record_type) except RecordTypeException: abort(400, message="Invalid record_type: " + str(record_type)) # If SOA, make sure a record doesn't yet exist if record_type == "SOA": try: ModelRecord.get( ModelRecord.type == RecordType().set(record_type), ModelRecord.domain_id == domain_id ) abort(400, message="SOA record already exists for this domain") except peewee.DoesNotExist: pass TypeModel = RecordType().get_class(RecordType().set(record_type))() self.request_form_to_type_model(request.form, TypeModel, domain) TypeModel.values["domain_id"] = domain.domain_id model = TypeModel.to_model() try: model.save() except RecordValueException as e: abort(400, message=e.message) self.dns_log( domain.domain_id, ( "added " + record_type + " with host " + model.host + " and value " + model.val ) ) return {'status': 'ok', 'record': model.to_recordtype().to_dict()}, 201
def add_default_soa_record(self, endpoint=None): """Returns None if already exists, DoesNotExist bubbles up when no default soa exists""" # sanity check if not self.domain_id: raise Exception( "Cannot add default records when domain_id is not set") # don't duplicate SOA record try: existing_soa = Record.get(Record.domain_id == self.domain_id, Record.type == RecordType().set("SOA")) return None except DoesNotExist: # create SOA record, let DoesNotExist bubble up default_soa = DefaultRecord.get( DefaultRecord.type == RecordType().set("SOA")) soa = Record() soa.domain_id = self.domain_id soa.host = default_soa.host.replace("DOMAIN", self.domain) soa.val = default_soa.val soa.ttl = default_soa.ttl soa.type = default_soa.type # replace uses of DOMAIN soa.save() if endpoint is not None: endpoint.dns_log(soa.domain_id, "added soa") return soa
def add_default_records(self, endpoint=None): # sanity check if not self.domain_id: raise Exception("Cannot add default records when domain_id is not set") # don't duplicate SOA record try: existing_soa = Record.get(Record.domain_id == self.domain_id, Record.type == RecordType().set("SOA")) except DoesNotExist: # create SOA record try: default_soa = DefaultRecord.get(DefaultRecord.type == RecordType().set("SOA")) soa = Record() soa.domain_id = self.domain_id soa.host = default_soa.host.replace("DOMAIN", self.domain) soa.val = default_soa.val soa.ttl = default_soa.ttl soa.type = default_soa.type # replace uses of DOMAIN soa.save() if endpoint is not None: endpoint.dns_log(soa.domain_id, "added soa") except DoesNotExist: # no default SOA record set! pass # create all other records default_records = DefaultRecord.select().where(DefaultRecord.type != RecordType().set("SOA")) for record in default_records: new = Record() new.domain_id = self.domain_id new.distance = record.distance new.host = record.host.replace("DOMAIN", self.domain) new.val = record.val.replace("DOMAIN", self.domain) new.distance = record.distance new.port = record.port new.ttl = record.ttl new.type = record.type new.weight = record.weight new.save() if endpoint is not None: endpoint.dns_log( new.domain_id, ("added " + RecordType().get(new.type) + " with host " + new.host + " and value " + new.val), )
def get_record(self, record_id): return ModelRecord.get(ModelRecord.record_id == record_id)