예제 #1
0
 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)
예제 #2
0
 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
             )
예제 #3
0
    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
예제 #4
0
 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)
예제 #5
0
    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
예제 #6
0
    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
예제 #7
0
 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)
예제 #8
0
    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