From f2f9472c4a4e5670f920925c3175f6f51972c6e9 Mon Sep 17 00:00:00 2001 From: Townsend Date: Wed, 2 Apr 2025 21:48:10 -0400 Subject: [PATCH] Improved dynamic DNS --- .../matrix-dynamic-dns/defaults/main.yml | 18 +++-- .../tasks/validate_config.yml | 4 +- .../templates/ddclient.conf.j2 | 67 ++++++++++++++----- 3 files changed, 65 insertions(+), 24 deletions(-) diff --git a/roles/custom/matrix-dynamic-dns/defaults/main.yml b/roles/custom/matrix-dynamic-dns/defaults/main.yml index 6ecdcd404..8ef58b095 100644 --- a/roles/custom/matrix-dynamic-dns/defaults/main.yml +++ b/roles/custom/matrix-dynamic-dns/defaults/main.yml @@ -55,6 +55,18 @@ matrix_dynamic_dns_base_path: "{{ matrix_base_data_path }}/dynamic-dns" matrix_dynamic_dns_config_path: "{{ matrix_dynamic_dns_base_path }}/config" matrix_dynamic_dns_docker_src_files_path: "{{ matrix_dynamic_dns_base_path }}/docker-src" +# Config options +matrix_dynamic_dns_use: "web" + +# The endpoint to use to determine your external IP +matrix_dynamic_dns_web: "https://cloudflare.com/cdn-cgi/trace" + +# The field to extract the IP from +# If your endpoint defined in `matrix_dynamic_dns_web` doesn't need this, just set it to "" +matrix_dynamic_dns_web_skip: "ip=" + +matrix_dynamic_dns_additional_configuration_blocks: [] + # Holds the configurations (the domains to update DNS for, the providers they use, etc.) # # Example: @@ -64,8 +76,4 @@ matrix_dynamic_dns_docker_src_files_path: "{{ matrix_dynamic_dns_base_path }}/do # username: XXXXXXXXXXXXXXXX # password: XXXXXXXXXXXXXXXX # domain: "{{ matrix_domain }}" -matrix_dynamic_dns_domain_configurations: [] - -# Config options -matrix_dynamic_dns_additional_configuration_blocks: [] -matrix_dynamic_dns_use: "web" +matrix_dynamic_dns_domain_configurations: [] \ No newline at end of file diff --git a/roles/custom/matrix-dynamic-dns/tasks/validate_config.yml b/roles/custom/matrix-dynamic-dns/tasks/validate_config.yml index 3b567415a..e86ae2317 100644 --- a/roles/custom/matrix-dynamic-dns/tasks/validate_config.yml +++ b/roles/custom/matrix-dynamic-dns/tasks/validate_config.yml @@ -14,8 +14,8 @@ - name: Fail if required matrix-dynamic-dns settings not defined in configuration blocks ansible.builtin.fail: msg: >- - One of the configurations in matrix_dynamic_dns_domain_configurations is missing a required key (domain, provider, protocol). - when: "'domain' not in configuration or 'provider' not in configuration or 'protocol' not in configuration" + One of the configurations in matrix_dynamic_dns_domain_configurations is missing a required key (domain, protocol). + when: "'domain' not in configuration or 'protocol' not in configuration" with_items: "{{ matrix_dynamic_dns_domain_configurations }}" loop_control: loop_var: configuration diff --git a/roles/custom/matrix-dynamic-dns/templates/ddclient.conf.j2 b/roles/custom/matrix-dynamic-dns/templates/ddclient.conf.j2 index 158f9f66e..9a7801dbc 100644 --- a/roles/custom/matrix-dynamic-dns/templates/ddclient.conf.j2 +++ b/roles/custom/matrix-dynamic-dns/templates/ddclient.conf.j2 @@ -10,24 +10,57 @@ syslog=no pid=/var/run/ddclient/ddclient.pid ssl=yes use={{ matrix_dynamic_dns_use }} - -{% for dynamic_dns_domain_configuration in matrix_dynamic_dns_domain_configurations %} -protocol={{ dynamic_dns_domain_configuration.protocol }} -server={{ dynamic_dns_domain_configuration.provider }} {% if 'username' in dynamic_dns_domain_configuration %} -login='{{ dynamic_dns_domain_configuration.username }}' {% endif %} {% if 'password' in dynamic_dns_domain_configuration %} -password='{{ dynamic_dns_domain_configuration.password }}' {% endif %} {% if 'static' in dynamic_dns_domain_configuration %} -static=yes {% endif %} {% if 'custom' in dynamic_dns_domain_configuration %} -custom=yes {% endif %} {% if 'zone' in dynamic_dns_domain_configuration %} -zone={{ dynamic_dns_domain_configuration.zone }} {% endif %} {% if 'ttl' in dynamic_dns_domain_configuration %} -ttl={{ dynamic_dns_domain_configuration.ttl }} {% endif %} {% if 'mx' in dynamic_dns_domain_configuration %} -mx={{ dynamic_dns_domain_configuration.mx }} {% endif %} {% if 'wildcard' in dynamic_dns_domain_configuration %} -wildcard=yes {% endif %} -{{ dynamic_dns_domain_configuration.domain }} - -{% endfor %} - +web='{{ matrix_dynamic_dns_web }}' +{% if matrix_dynamic_dns_web_skip %} +web-skip='{{ matrix_dynamic_dns_web_skip }}' +{% endif %} {% for matrix_dynamic_dns_additional_configuration in matrix_dynamic_dns_additional_configuration_blocks %} {{ matrix_dynamic_dns_additional_configuration }} - {% endfor %} + +{% for dynamic_dns_domain_configuration in matrix_dynamic_dns_domain_configurations %} +protocol={{ dynamic_dns_domain_configuration.protocol }} + +{% if 'provider' in dynamic_dns_domain_configuration %} +server={{ dynamic_dns_domain_configuration.provider }} +{% endif %} + +{% if 'username' in dynamic_dns_domain_configuration %} +login='{{ dynamic_dns_domain_configuration.username }}' +{% endif %} + +{% if 'password' in dynamic_dns_domain_configuration %} +password='{{ dynamic_dns_domain_configuration.password }}' +{% endif %} + +{% if 'static' in dynamic_dns_domain_configuration %} +static=yes +{% endif %} + +{% if 'custom' in dynamic_dns_domain_configuration %} +custom=yes +{% endif %} + +{% if 'zone' in dynamic_dns_domain_configuration %} +zone={{ dynamic_dns_domain_configuration.zone }} +{% endif %} + +{% if 'ttl' in dynamic_dns_domain_configuration %} +ttl={{ dynamic_dns_domain_configuration.ttl }} +{% endif %} + +{% if 'mx' in dynamic_dns_domain_configuration %} +mx={{ dynamic_dns_domain_configuration.mx }} +{% endif %} + +{% if 'wildcard' in dynamic_dns_domain_configuration %} +wildcard=yes +{% endif %} + +{% if 'script' in dynamic_dns_domain_configuration %} +script={{ dynamic_dns_domain_configuration.script }} +{% endif %} + +{{ dynamic_dns_domain_configuration.domain }} +{% endfor %} \ No newline at end of file