def _validate_record(self, record_id, name, record_type, data, extra): if len(data) > 1024: raise RecordError('Record data must be <= 1024 characters', driver=self, record_id=record_id) if extra and 'ttl' in extra: if extra['ttl'] < TTL_MIN: raise RecordError('TTL must be at least 30 seconds', driver=self, record_id=record_id) if extra['ttl'] > TTL_MAX: raise RecordError('TTL must not excdeed 30 days', driver=self, record_id=record_id)
def _validate_record(self, record_id, name, record_type, data, extra): if len(data) > 1024: raise RecordError( "Record data must be <= 1024 characters", driver=self, record_id=record_id, ) if extra and "ttl" in extra: if extra["ttl"] < TTL_MIN: raise RecordError( "TTL must be at least 30 seconds", driver=self, record_id=record_id ) if extra["ttl"] > TTL_MAX: raise RecordError( "TTL must not excdeed 30 days", driver=self, record_id=record_id )
def create_record(self, name, zone, type, data, extra=None): """ Create a new record. We can create 40 record per domain. If all slots are full, we can replace one of them by choosing a specific entry in ``extra`` argument. :param name: Record name without the domain name (e.g. www). Note: If you want to create a record for a base domain name, you should specify empty string ('') for this argument. :type name: ``str`` :param zone: Zone where the requested record is created. :type zone: :class:`Zone` :param type: DNS record type (MX, CNAME, A, NS, SRV, TXT). :type type: :class:`RecordType` :param data: Data for the record (depends on the record type). :type data: ``str`` :param extra: Contains 'entry' Entry position (1 thru 40) :type extra: ``dict`` :rtype: :class:`Record` """ if (extra is None) or ("entry" not in extra): # If no entry is specified, we look for an available one. If all # are full, raise error. record_id = self._get_available_record_entry(zone) if not record_id: raise WorldWideDNSError( value="All record entries are full", driver=zone.driver ) else: record_id = extra.get("entry") if name == "": name = "@" if type not in self.RECORD_TYPE_MAP: raise RecordError( value="Record type is not allowed", driver=zone.driver, record_id=record_id, ) extra = { "S%s" % record_id: name, "T%s" % record_id: type, "D%s" % record_id: data, } zone = self.update_zone(zone, zone.domain, extra=extra) record = self.get_record(zone.id, record_id) return record
def _validate_record(self, record_id, name, record_type, data, extra): if len(data) > 1024: raise RecordError('Record data must be <= 1024 characters', driver=self, record_id=record_id) if type == 'MX' or type == RecordType.MX: if extra is None or 'priority' not in extra: raise RecordError('MX record must have a priority', driver=self, record_id=record_id) if extra is not None and '_other_records' in extra: for other_value in extra.get('_other_records', []): if len(other_value['data']) > 1024: raise RecordError('Record data must be <= 1024 characters', driver=self, record_id=record_id) if type == 'MX' or type == RecordType.MX: if (other_value['extra'] is None or 'priority' not in other_value['extra']): raise RecordError('MX record must have a priority', driver=self, record_id=record_id) if extra is not None and 'ttl' in extra: if extra['ttl'] < TTL_MIN: raise RecordError('TTL must be at least 300 seconds', driver=self, record_id=record_id) if extra['ttl'] > TTL_MAX: raise RecordError('TTL must not exceed 30 days', driver=self, record_id=record_id)
def update_record(self, record, name, type, data, extra=None): """ Update an existing record. :param record: Record to update. :type record: :class:`Record` :param name: Record name without the domain name (e.g. www). Note: If you want to create a record for a base domain name, you should specify empty string ('') for this argument. :type name: ``str`` :param type: DNS record type (MX, CNAME, A, NS, SRV, TXT). :type type: :class:`RecordType` :param data: Data for the record (depends on the record type). :type data: ``str`` :param extra: Contains 'entry' Entry position (1 thru 40) :type extra: ``dict`` :rtype: :class:`Record` """ if (extra is None) or ("entry" not in extra): raise WorldWideDNSError( value="You must enter 'entry' parameter", driver=self ) record_id = extra.get("entry") if name == "": name = "@" if type not in self.RECORD_TYPE_MAP: raise RecordError( value="Record type is not allowed", driver=record.zone.driver, record_id=name, ) zone = record.zone extra = { "S%s" % record_id: name, "T%s" % record_id: type, "D%s" % record_id: data, } zone = self.update_zone(zone, zone.domain, extra=extra) record = self.get_record(zone.id, record_id) return record
def create_record(self, name, zone, type, data, extra=None): """ Create a new record. :param name: Record name without the domain name (e.g. www). Note: If you want to create a record for a base domain name, you should specify empty string ('') for this argument. :type name: ``str`` :param zone: Zone where the requested record is created. :type zone: :class:`Zone` :param type: DNS record type (MX, CNAME, A, NS, SRV, TXT). :type type: :class:`RecordType` :param data: Data for the record (depends on the record type). :type data: ``str`` :param extra: Contains 'entry' Entry position (1 thru 40) :type extra: ``dict`` :rtype: :class:`Record` """ if (extra is None) or ('entry' not in extra): raise WorldWideDNSError(value="You must enter 'entry' parameter", driver=zone.driver) entry = extra.get('entry') if name == '': name = '@' if type not in self.RECORD_TYPE_MAP: raise RecordError(value="Record type is not allowed", driver=zone.driver, record_id=name) extra = {'S%s' % entry: name, 'T%s' % entry: type, 'D%s' % entry: data} zone = self.update_zone(zone, zone.domain, extra=extra) record = self.get_record(zone.id, name) return record
def _validate_record(self, record_id, name, record_type, data, extra): if len(data) > 1024: raise RecordError( "Record data must be <= 1024 characters", driver=self, record_id=record_id, ) if type == "MX" or type == RecordType.MX: if extra is None or "priority" not in extra: raise RecordError("MX record must have a priority", driver=self, record_id=record_id) if extra is not None and "_other_records" in extra: for other_value in extra.get("_other_records", []): if len(other_value["data"]) > 1024: raise RecordError( "Record data must be <= 1024 characters", driver=self, record_id=record_id, ) if type == "MX" or type == RecordType.MX: if (other_value["extra"] is None or "priority" not in other_value["extra"]): raise RecordError( "MX record must have a priority", driver=self, record_id=record_id, ) if extra is not None and "ttl" in extra: if extra["ttl"] < TTL_MIN: raise RecordError("TTL must be at least 300 seconds", driver=self, record_id=record_id) if extra["ttl"] > TTL_MAX: raise RecordError("TTL must not exceed 30 days", driver=self, record_id=record_id)
def update_record( self, record, name: Optional[str], type: Optional[RecordType], data: Optional[str], extra=None, ): payload = {} payload["name"] = record.name if name is None else name payload["type"] = record.type if type is None else type payload["content"] = record.data if data is None else data url = f"v1/domains/{record.zone.id}/records/{record.id}" headers = {"Content-Type": "application/json"} data = json.dumps(payload) try: response = self.connection.request( url, method="PUT", headers=headers, data=data, ) except ProviderError as e: if e.value == "domain_not_found": raise ZoneDoesNotExistError(e.value, self, record.zone.id) if e.value == "record_not_found": raise RecordDoesNotExistError(e.value, self, record.id) if e.value == "record_already_exists": raise RecordAlreadyExistsError(e.value, self, record.id) if e.value in ( "cname_record_conflict", "record_does_not_belong_to_domain", "cant_add_soa", "string_required", "bad_zone_name", "bad_record_name", "zone_name_too_long", ): raise RecordError(e.value, self, record.id) raise result = response.object result_id = str(result.pop("id")) name = result.pop("name") result_type = result.pop("type") data = result.pop("content") ttl = result.pop("ttl") extra = result record = Record( id=result_id, name=name, type=result_type, data=data, zone=record.zone, driver=self, ttl=ttl, extra=extra, ) return record