Source code for dyndns.names

"""Deal with different kind of names (FQDNs (Fully Qualified Domain Names),
record and zone names)

``record_name`` + ``zone_name`` = ``fqdn``

"""

from __future__ import annotations

from typing import TYPE_CHECKING

from dyndns.config import validate_name
from dyndns.exceptions import DnsNameError

if TYPE_CHECKING:
    from dyndns.zones import ZonesCollection


[docs] class FullyQualifiedDomainName: """ Stores a FQDN (Fully Qualified Domain Names), a zone name and a record along with the TSIG (Transaction SIGnature) key. ``record_name`` + ``zone_name`` = ``fqdn`` :param zones: The ZonesCollection object. :param fqdn: The Fully Qualified Domain Name (e. g. ``www.example.com.``). :param zone_name: The zone name (e. g. ``example.com.``). :param record_name: The name of the resource record (e. g. ``www.``). :raises NamesError: If both fqdn and zone_name/record_name are specified. :raises NamesError: If record_name is not provided. :raises NamesError: If zone_name is not provided. """ fqdn: str """The Fully Qualified Domain Name (e. g. ``www.example.com.``).""" zone_name: str """The zone name (e. g. ``example.com.``).""" record_name: str """The name of the resource record (e. g. ``www.``).""" tsig_key: str """The TSIG (Transaction SIGnature) key (e. g. ``tPyvZA==``)""" def __init__( self, zones: "ZonesCollection", fqdn: str | None = None, zone_name: str | None = None, record_name: str | None = None, ) -> None: """ Initialize the ``DomainName`` object. :param zones: The ZonesCollection object. :param fqdn: The Fully Qualified Domain Name (e. g. ``www.example.com.``). :param zone_name: The zone name (e. g. ``example.com.``). :param record_name: The name of the resource record (e. g. ``www.``). :raises NamesError: If both fqdn and zone_name/record_name are specified. :raises NamesError: If record_name is not provided. :raises NamesError: If zone_name is not provided. """ if fqdn and zone_name and record_name: raise DnsNameError('Specify "fqdn" or "zone_name" and "record_name".') if fqdn: fqdn = validate_name(fqdn) split = zones.split_fqdn(fqdn) if split: record_name = split[0] zone_name = split[1] else: raise DnsNameError( f"The fully qualified domain name '{fqdn}' could not be split into a record and a zone name." ) if not fqdn and zone_name and record_name: record_name = validate_name(record_name) zone_name = validate_name(zone_name) zone = zones.get_zone(zone_name) fqdn = zone.get_fqdn(record_name) if not fqdn: raise DnsNameError('Value "fqdn" is required.') if not record_name: raise DnsNameError('Value "record_name" is required.') if not zone_name: raise DnsNameError('Value "zone_name" is required.') self.fqdn = fqdn self.zone_name = zone_name self.record_name = record_name self.tsig_key = zones.get_zone(self.zone_name).tsig_key