dyndns package

Module contents

Set version.

Submodules

dyndns.cli module

Command line interface for the command dyndns-debug

dyndns.cli.get_argparser() ArgumentParser[source]
dyndns.cli.main() None[source]

dyndns.config module

Load and validate the configuration.

dyndns.config.load_config(config_file: str | None = None) Config[source]
dyndns.config.validate_secret(secret: Any) str[source]
dyndns.config.validate_config(config: Config | None = None) Config[source]
dyndns.config.get_config(config_file: str | None = None) Config[source]

dyndns.dns_updates module

Interface for DNS updates.

dyndns.dns_updates.authenticate(secret: Any, config: Config) None[source]
dyndns.dns_updates.raise_parameter_error(function, exception, *args, **kwargs)[source]
dyndns.dns_updates.update_dns_record(secret: str | None = None, fqdn: str | None = None, zone_name: str | None = None, record_name: str | None = None, ip_1: str | None = None, ip_2: str | None = None, ipv4: str | None = None, ipv6: str | None = None, ttl: int | None = None, config: Config | None = None) str[source]

Update a DNS record.

Parameters:
  • secret – A password like secret string. The secret string has to be at least 8 characters long and only alphnumeric characters are allowed.

  • fqdn – The Fully-Qualified Domain Name (e. g. www.example.com). If you specify the argument fqdn, you don’t have to specify the arguments zone_name and record_name.

  • zone_name – The zone name (e. g. example.com). You have to specify the argument record_name.

  • record_name – The record name (e. g. www). You have to specify the argument zone_name.

  • ip_1 – An IP address, can be version 4 or version 6.

  • ip_2 – A second IP address, can be version 4 or version 6. Must be a different version than ip_1.

  • ipv4 – An IP address version 4.

  • ipv6 – An IP address version 6.

  • ttl – Time to live.

  • config (dict) – The configuration in the Python dictionary format (as returned by the function validate_config()).

dyndns.dns_updates.delete_dns_record(secret: str | None = None, fqdn: str | None = None, config: Config | None = None) str[source]
dyndns.dns_updates.catch_errors(function, **kwargs)[source]

dyndns.dns module

Query the DSN server using the package “dnspython”.

class dyndns.dns.DnsUpdate(nameserver: str, names: Names, ipaddresses: IpAddressContainer | None = None, ttl: str | int | None = None)[source]

Bases: object

Update the DNS server

nameserver: str

The nameserver

names: Names
ipaddresses: IpAddressContainer | None
ttl: int
delete()[source]
update() list[UpdateRecord][source]

dyndns.exceptions module

A collection of exceptions.

exception dyndns.exceptions.DyndnsError[source]

Bases: Exception

Base exception of the package dyndns.

exception dyndns.exceptions.NamesError[source]

Bases: DyndnsError

This error gets thrown by invalid DNS names.

exception dyndns.exceptions.IpAddressesError[source]

Bases: DyndnsError

This error gets thrown by invalid IP addresses.

exception dyndns.exceptions.ConfigurationError[source]

Bases: DyndnsError

dyndns configuration error.

exception dyndns.exceptions.ParameterError[source]

Bases: DyndnsError

Client side parameter error.

exception dyndns.exceptions.DNSServerError[source]

Bases: DyndnsError

Communicating with the external DNS server.

dyndns.html_template module

A collection of HTML template functions.

class dyndns.html_template.RestructuredText[source]

Bases: object

static read(file_name: str) str[source]
static remove_heading(restructured_text: str) str[source]
static to_html(restructured_text: str, remove_heading: bool = False) str[source]
static read_to_html(file_name: str, remove_heading: bool = False)[source]
dyndns.html_template.template_usage(remove_heading: bool = False)[source]
dyndns.html_template.template_base(title: str, content: str) str[source]

dyndns.ipaddresses module

Deal with ipv4 and ipv6 IP addresses.

dyndns.ipaddresses.validate(address: Any, ip_version: Literal[4, 6] | None = None) tuple[str, Literal[4, 6]][source]
dyndns.ipaddresses.format_attr(ip_version: Literal[4, 6]) str[source]
class dyndns.ipaddresses.IpAddressContainer(ip_1: str | None = None, ip_2: str | None = None, ipv4: str | None = None, ipv6: str | None = None, request: Request | None = None)[source]

Bases: object

A container class to store and detect IP addresses in both versions (ipv4 and ipv6).

Parameters:
  • ip_1 (str) – Am IP address of unkown version.

  • ip_2 (str) – An IP address of unkown version.

  • ipv4 (str) – An ipv4 IP address.

  • ipv6 (str) – An ipv6 IP address.

request: Request
ipv4: str | None

The ipv4 address to update the DNS record with.

ipv6: str | None

The ipv6 address to update the DNS record with.

dyndns.log module

Bundle the logging functionality.

class dyndns.log.DateTime(date_time_string: str | None = None)[source]

Bases: object

iso8601() str[source]
iso8601_short() str[source]
class dyndns.log.UpdatesDB[source]

Bases: object

db_file: str
connection: Connection
cursor: Cursor
get_fqdns() list[str][source]
static normalize_row(row: list[str]) Update[source]
get_updates_by_fqdn(fqdn: str) list[Update][source]
log_update(updated: bool, fqdn: str, record_type: Literal['a', 'aaaa'], ip: str) None[source]
class dyndns.log.Update[source]

Bases: TypedDict

update_time: str
updated: bool
fqdn: str
record_type: str
ip: str
class dyndns.log.Message[source]

Bases: object

log_levels: dict[str, int]
message(msg: str, log_level: Literal['CONFIGURATION_ERROR', 'DNS_SERVER_ERROR', 'PARAMETER_ERROR', 'UPDATED', 'UNCHANGED']) str[source]
dyndns.log.msg(msg: str, log_level: Literal['CONFIGURATION_ERROR', 'DNS_SERVER_ERROR', 'PARAMETER_ERROR', 'UPDATED', 'UNCHANGED']) str

dyndns.names module

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

record_name + zone_name = fqdn

dyndns.names.validate_hostname(hostname: str) str[source]
dyndns.names.validate_tsig_key(tsig_key: str) str[source]
class dyndns.names.Zone(zone_name: str, tsig_key: str)[source]

Bases: object

zone_name: str
tsig_key: str
split_fqdn(fqdn: str) tuple[str, str][source]

Split hostname into record_name and zone_name for example: www.example.com -> www. example.com.

build_fqdn(record_name: str) str[source]
class dyndns.names.Zones(zones_config: ZoneConfig)[source]

Bases: object

zones: dict[str, Zone]
get_zone_by_name(zone_name: str)[source]
split_fqdn(fqdn: str) tuple[str, str] | Literal[False][source]

Split hostname into record_name and zone_name for example: www.example.com -> www. example.com.

class dyndns.names.Names(zones: Zones, fqdn: str | None = None, zone_name: str | None = None, record_name: str | None = None)[source]

Bases: object

record_name: str

The name of the resource record (e. g. www.).

zone_name: str

The zone name (e. g. example.com.).

fqdn: str

The Fully Qualified Domain Name (e. g. www.example.com.).

tsig_key: str

The twig key (e. g. tPyvZA==)

dyndns.webapp module

Initialize the Flask app.

dyndns.webapp.update_by_path(secret: str, fqdn: str, ip_1: str | None = None, ip_2: str | None = None) str[source]
dyndns.webapp.update_by_query_string() str[source]
dyndns.webapp.delete_by_path(secret: str, fqdn: str) str[source]
dyndns.webapp.home()[source]
dyndns.webapp.about() str[source]
dyndns.webapp.docs_installation() str[source]
dyndns.webapp.docs_configuration() str[source]
dyndns.webapp.docs_usage() str[source]
dyndns.webapp.statistics_updates_by_fqdn() str[source]
dyndns.webapp.statistics_latest_submissions() str[source]