summaryrefslogtreecommitdiff
path: root/interface-definitions
diff options
context:
space:
mode:
authorIndrajit Raychaudhuri <irc@indrajit.com>2023-04-23 18:25:21 -0500
committerIndrajit Raychaudhuri <irc@indrajit.com>2023-06-03 21:54:03 -0500
commitf2392055a33e537ce88c6a3124106bfd3b8b8e57 (patch)
tree6dce2e96ad5a672a7bc7bd11d4537199b687dd89 /interface-definitions
parent12b7da289665c75c3839b32c77a491d8909f3e73 (diff)
downloadvyos-1x-f2392055a33e537ce88c6a3124106bfd3b8b8e57.tar.gz
vyos-1x-f2392055a33e537ce88c6a3124106bfd3b8b8e57.zip
dns: T5144: Modernize dynamic dns operation
Apply next round of configuration tree updates to 'service dns dynamic' with the following changes: - Migrate `service dns dynamic interface <interface> [use-web]` to `service dns dynamic address <interface>` or `service dns dynamic address web [web-options]` This communicates the intent that dynamic dns IP address is detected in only one way - using the `<interface>` or using an external web request, not both. - When using external web request, (`service dns dynamic address web`), external url is optional (`web-options url`). Ddclient defaults are used when unspecified, - Rename all config `login` to `username` for consistency and also to align better with alternative ddclient backends in consideration. - Apply global 'ipv6-enable' to per service 'ip-version: ipv6'. Selecting usage of IPv4 or IPv6 (or both simultaneously) is now at per service (protocol) level instead of global level. This allows more control on the ability to select IPv4 in some cases and IPv6 in some other cases wherever supported by the underlying ddclient protocol. - While the IP address (and by extension, the detection mechanism) is global, the way it is applied to a particular ddclient protocol depends on whether it supports IPv4 or IPv6 or both. - Related to the above, this also prevents generating incorrect config file (`ddclient.conf`) with multiple global sections leading to an unpredictable behavior of ddclient. - Implement provider (protocol) specific custom tweaks whenever possible (e.g., `zone`, `username`, `server` are not necessary in all cases). - Move service name from a combination of 'protocol' (with protocol config autodetected) and custom (with protocol config specified) to a single 'service' key. This allows for consisent setup of multiple config for the same ddclient protocol (with different options and credentials). This also avoid ambiguity with usual networking term 'protocol' and ddclient specific term 'protocol' (and can change with a move to a different backend). - Apply upfront XML constraints and validations consistently wherever applicable. - RFC2136 specific change: Rename rfc2136 config `record` to `host-name` for consistency. - Cloudflare specific change: While ddclient still supports authenticating with email and global auth key, skipping `username` in config will indicate the intent to use API token authentication (with special 'token' literal as `username`).
Diffstat (limited to 'interface-definitions')
-rw-r--r--interface-definitions/dns-dynamic.xml.in190
-rw-r--r--interface-definitions/include/dns/dynamic-service-host-name-server.xml.i34
2 files changed, 106 insertions, 118 deletions
diff --git a/interface-definitions/dns-dynamic.xml.in b/interface-definitions/dns-dynamic.xml.in
index 48c101d73..308dc5de0 100644
--- a/interface-definitions/dns-dynamic.xml.in
+++ b/interface-definitions/dns-dynamic.xml.in
@@ -12,141 +12,94 @@
<help>Dynamic DNS</help>
</properties>
<children>
- <tagNode name="interface">
+ <tagNode name="address">
<properties>
- <help>Interface to send Dynamic DNS updates for</help>
- <completionHelp>
- <script>${vyos_completion_dir}/list_interfaces</script>
- </completionHelp>
+ <help>Obtain IP address to send Dynamic DNS update for</help>
<valueHelp>
<format>txt</format>
- <description>Interface name</description>
+ <description>Use interface to obtain the IP address</description>
</valueHelp>
+ <valueHelp>
+ <format>web</format>
+ <description>Use HTTP(S) web request to obtain the IP address</description>
+ </valueHelp>
+ <completionHelp>
+ <script>${vyos_completion_dir}/list_interfaces</script>
+ <list>web</list>
+ </completionHelp>
<constraint>
#include <include/constraint/interface-name.xml.i>
+ <regex>web</regex>
</constraint>
</properties>
<children>
- <tagNode name="rfc2136">
+ <node name="web-options">
<properties>
- <help>RFC2136 Update name</help>
+ <help>Options when using HTTP(S) web request to obtain the IP address</help>
</properties>
<children>
- <leafNode name="key">
+ #include <include/url.xml.i>
+ <leafNode name="skip">
<properties>
- <help>File containing the secret key shared with remote DNS server</help>
+ <help>Pattern to skip from the HTTP(S) respose</help>
<valueHelp>
- <format>filename</format>
- <description>File in /config/auth directory</description>
+ <format>txt</format>
+ <description>Pattern to skip from the HTTP(S) respose to extract the external IP address</description>
</valueHelp>
</properties>
</leafNode>
- <leafNode name="record">
- <properties>
- <help>Record to be updated</help>
- <multi/>
- </properties>
- </leafNode>
- <leafNode name="server">
- <properties>
- <help>Server to be updated</help>
- </properties>
- </leafNode>
- <leafNode name="ttl">
+ </children>
+ </node>
+ <tagNode name="rfc2136">
+ <properties>
+ <help>RFC2136 nsupdate configuration</help>
+ <valueHelp>
+ <format>txt</format>
+ <description>RFC2136 nsupdate service name</description>
+ </valueHelp>
+ </properties>
+ <children>
+ #include <include/generic-description.xml.i>
+ #include <include/dns/dynamic-service-host-name-server.xml.i>
+ <leafNode name="key">
<properties>
- <help>Time To Live (default: 600)</help>
+ <help>File containing the TSIG secret key shared with remote DNS server</help>
<valueHelp>
- <format>u32:1-86400</format>
- <description>DNS forwarding cache size</description>
+ <format>filename</format>
+ <description>File in /config/auth directory</description>
</valueHelp>
<constraint>
- <validator name="numeric" argument="--range 1-86400"/>
+ <validator name="file-path" argument="--strict --parent-dir /config/auth"/>
</constraint>
</properties>
- <defaultValue>600</defaultValue>
</leafNode>
+ #include <include/dns/time-to-live.xml.i>
<leafNode name="zone">
<properties>
- <help>Zone to be updated</help>
+ <help>Forwarding zone to be updated</help>
+ <valueHelp>
+ <format>txt</format>
+ <description>RFC2136 Zone to be updated</description>
+ </valueHelp>
+ <constraint>
+ <validator name="fqdn"/>
+ </constraint>
</properties>
</leafNode>
</children>
</tagNode>
<tagNode name="service">
<properties>
- <help>Service being used for Dynamic DNS</help>
- <completionHelp>
- <list>afraid changeip cloudflare dnspark dslreports dyndns easydns namecheap noip sitelutions zoneedit</list>
- </completionHelp>
+ <help>Dynamic DNS configuration</help>
<valueHelp>
<format>txt</format>
- <description>Dynanmic DNS service with a custom name</description>
- </valueHelp>
- <valueHelp>
- <format>afraid</format>
- <description>afraid.org Services</description>
- </valueHelp>
- <valueHelp>
- <format>changeip</format>
- <description>changeip.com Services</description>
- </valueHelp>
- <valueHelp>
- <format>cloudflare</format>
- <description>cloudflare.com Services</description>
+ <description>Dynamic DNS service name</description>
</valueHelp>
- <valueHelp>
- <format>dnspark</format>
- <description>dnspark.com Services</description>
- </valueHelp>
- <valueHelp>
- <format>dslreports</format>
- <description>dslreports.com Services</description>
- </valueHelp>
- <valueHelp>
- <format>dyndns</format>
- <description>dyndns.com Services</description>
- </valueHelp>
- <valueHelp>
- <format>easydns</format>
- <description>easydns.com Services</description>
- </valueHelp>
- <valueHelp>
- <format>namecheap</format>
- <description>namecheap.com Services</description>
- </valueHelp>
- <valueHelp>
- <format>noip</format>
- <description>noip.com Services</description>
- </valueHelp>
- <valueHelp>
- <format>sitelutions</format>
- <description>sitelutions.com Services</description>
- </valueHelp>
- <valueHelp>
- <format>zoneedit</format>
- <description>zoneedit.com Services</description>
- </valueHelp>
- <constraint>
- <regex>(custom|afraid|changeip|cloudflare|dnspark|dslreports|dyndns|easydns|namecheap|noip|sitelutions|zoneedit|\w+)</regex>
- </constraint>
- <constraintErrorMessage>You can use only predefined list of services or word characters (_, a-z, A-Z, 0-9) as service name</constraintErrorMessage>
</properties>
<children>
- <leafNode name="host-name">
- <properties>
- <help>Hostname to register with Dynamic DNS service</help>
- <constraint>
- #include <include/constraint/host-name.xml.i>
- </constraint>
- <constraintErrorMessage>Host-name must be alphanumeric and can contain hyphens</constraintErrorMessage>
- <multi/>
- </properties>
- </leafNode>
- <leafNode name="login">
- <properties>
- <help>Login/Username for Dynamic DNS service</help>
- </properties>
- </leafNode>
+ #include <include/generic-description.xml.i>
+ #include <include/dns/dynamic-service-host-name-server.xml.i>
+ #include <include/generic-username.xml.i>
#include <include/generic-password.xml.i>
<leafNode name="protocol">
<properties>
@@ -159,7 +112,6 @@
</constraint>
</properties>
</leafNode>
- #include <include/server-ipv4-fqdn.xml.i>
<leafNode name="zone">
<properties>
<help>DNS zone to update (not used by all protocols)</help>
@@ -169,31 +121,33 @@
</valueHelp>
</properties>
</leafNode>
- </children>
- </tagNode>
- <node name="use-web">
- <properties>
- <help>Use HTTP(S) web request to obtain external IP address instead of the IP address associated with the interface</help>
- </properties>
- <children>
- <leafNode name="skip">
+ <leafNode name="ip-version">
<properties>
- <help>Pattern to skip from the respose</help>
+ <help>IP address version to use</help>
<valueHelp>
- <format>txt</format>
- <description>Pattern to skip from the respose of the given URL to extract the external IP address</description>
+ <format>_ipv4</format>
+ <description>Use only IPv4 address</description>
+ </valueHelp>
+ <valueHelp>
+ <format>_ipv6</format>
+ <description>Use only IPv6 address</description>
</valueHelp>
+ <valueHelp>
+ <format>both</format>
+ <description>Use both IPv4 and IPv6 address</description>
+ </valueHelp>
+ <completionHelp>
+ <list>ipv4 ipv6 both</list>
+ </completionHelp>
+ <constraint>
+ <regex>(ipv[46]|both)</regex>
+ </constraint>
+ <constraintErrorMessage>IP Version must be literal 'ipv4', 'ipv6' or 'both'</constraintErrorMessage>
</properties>
+ <defaultValue>ipv4</defaultValue>
</leafNode>
- #include <include/url.xml.i>
</children>
- </node>
- <leafNode name="ipv6-enable">
- <properties>
- <help>Explicitly use IPv6 address instead of IPv4 address to update the Dynamic DNS IP address</help>
- <valueless/>
- </properties>
- </leafNode>
+ </tagNode>
</children>
</tagNode>
</children>
diff --git a/interface-definitions/include/dns/dynamic-service-host-name-server.xml.i b/interface-definitions/include/dns/dynamic-service-host-name-server.xml.i
new file mode 100644
index 000000000..ee1af2a36
--- /dev/null
+++ b/interface-definitions/include/dns/dynamic-service-host-name-server.xml.i
@@ -0,0 +1,34 @@
+<!-- include start from dns/dynamic-service-host-name-server.xml.i -->
+<leafNode name="host-name">
+ <properties>
+ <help>Hostname to register with Dynamic DNS service</help>
+ <constraint>
+ #include <include/constraint/host-name.xml.i>
+ </constraint>
+ <constraintErrorMessage>Host-name must be alphanumeric and can contain hyphens</constraintErrorMessage>
+ <multi/>
+ </properties>
+</leafNode>
+<leafNode name="server">
+ <properties>
+ <help>Remote Dynamic DNS server to send updates to</help>
+ <valueHelp>
+ <format>ipv4</format>
+ <description>IPv4 address of the remote server</description>
+ </valueHelp>
+ <valueHelp>
+ <format>ipv6</format>
+ <description>IPv6 address of the remote server</description>
+ </valueHelp>
+ <valueHelp>
+ <format>hostname</format>
+ <description>Fully qualified domain name of the remote server</description>
+ </valueHelp>
+ <constraint>
+ <validator name="ip-address"/>
+ <validator name="fqdn"/>
+ </constraint>
+ <constraintErrorMessage>Remote server must be IP address or fully qualified domain name</constraintErrorMessage>
+ </properties>
+</leafNode>
+<!-- include end -->