diff --git a/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/Api/AccountsController.php b/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/Api/AccountsController.php
index 55e775635..2f6367856 100644
--- a/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/Api/AccountsController.php
+++ b/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/Api/AccountsController.php
@@ -39,11 +39,22 @@ class AccountsController extends ApiMutableModelControllerBase
public function searchItemAction()
{
- return $this->searchBase(
+ $result = $this->searchBase(
"accounts.account",
- ['enabled', 'service', 'description', 'username', 'hostnames'],
+ ['enabled', 'service', 'description', 'username', 'hostnames', 'use_interface', 'interface', 'protocol'],
"description"
);
+ foreach ($result['rows'] as &$row) {
+ if ($row['use_interface'] == "0") {
+ $row['interface'] = "";
+ }
+ unset($row['use_interface']);
+ if ($row['service'] == 'Custom') {
+ $row['service'] = 'Custom ('.$row['protocol'].')';
+ }
+ unset($row['protocol']);
+ }
+ return $result;
}
public function setItemAction($uuid)
diff --git a/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/dialogAccount.xml b/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/dialogAccount.xml
index 9aad7678b..dd0b6f0ae 100644
--- a/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/dialogAccount.xml
+++ b/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/dialogAccount.xml
@@ -11,6 +11,20 @@
dropdown
Select the service to use.
+
+ account.protocol
+
+ dropdown
+ Select the protocol to use.
+
+
+
+ account.server
+
+ text
+ DynDNS Server
+
+
account.username
@@ -27,7 +41,7 @@
account.wildcard
checkbox
-
+
add a DNS wildcard CNAME record that points to the configured host.
@@ -45,6 +59,17 @@
true
Hostname to update
+
+ account.use_interface
+
+ checkbox
+ Use the IP of a specified interface for the update
+
+
+ account.interface
+
+ dropdown
+
account.description
diff --git a/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/settings.xml b/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/settings.xml
index 4aca916e9..756a2c440 100644
--- a/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/settings.xml
+++ b/dns/ddclient/src/opnsense/mvc/app/controllers/OPNsense/DynDNS/forms/settings.xml
@@ -24,4 +24,10 @@
dropdown
How to determine the address to use for this host
+
+ ddclient.general.interface
+
+ dropdown
+
+
diff --git a/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.xml b/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.xml
index c80e5b046..7f01a0158 100644
--- a/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.xml
+++ b/dns/ddclient/src/opnsense/mvc/app/models/OPNsense/DynDNS/DynDNS.xml
@@ -40,8 +40,14 @@
nsupdate.info-ipv4
nsupdate.info-ipv6
zoneedit
+ Interface
+
+ N
+ N
+ wan
+
@@ -69,8 +75,21 @@
nsupdate.info (IPv6)
STRATO
Zoneedit
+ Custom
+
+ N
+ A protocol type is required.
+
+ DynDns1
+ DynDns2
+
+
+
+ N
+ N
+
N
/^([a-zA-Z0-9\-.@_:+])*$/u
@@ -94,6 +113,15 @@
N
N
+
+ 0
+ Y
+
+
+ N
+ N
+ wan
+
N
/^([\t\n\v\f\r 0-9a-zA-Z.,_\x{00A0}-\x{FFFF}]){1,255}$/u
diff --git a/dns/ddclient/src/opnsense/mvc/app/views/OPNsense/DynDNS/index.volt b/dns/ddclient/src/opnsense/mvc/app/views/OPNsense/DynDNS/index.volt
index 4355f4144..c60d78949 100644
--- a/dns/ddclient/src/opnsense/mvc/app/views/OPNsense/DynDNS/index.volt
+++ b/dns/ddclient/src/opnsense/mvc/app/views/OPNsense/DynDNS/index.volt
@@ -54,22 +54,48 @@ POSSIBILITY OF SUCH DAMAGE.
return dfObj;
}
});
- $('#DialogAccount').on('shown.bs.modal', function (e) {
- $("#account\\.service").change(function(){
- let service = $(this).val();
- $(".optional_setting").each(function(){
- let this_item = $(this);
- if (this_item.hasClass("service_"+service)) {
- this_item.prop( "disabled", false );
- this_item.closest("tr").show();
- } else {
- this_item.closest("tr").hide();
- this_item.prop( "disabled", true );
- }
- });
+ $("#account\\.service").change(function(){
+ let service = $(this).val();
+ $("#frm_DialogAccount .optional_setting").each(function(){
+ let this_item = $(this);
+ if (this_item.hasClass("service_"+service)) {
+ this_item.prop( "disabled", false );
+ this_item.closest("tr").show();
+ } else {
+ this_item.closest("tr").hide();
+ this_item.prop( "disabled", true );
+ }
});
- $("#account\\.service").change();
});
+ $("#account\\.use_interface").change(function(){
+ if ($(this).is(':checked')) {
+ $("#account\\.interface").prop( "disabled", false );
+ $("#account\\.interface").closest("tr").show();
+ } else {
+ $("#account\\.interface").closest("tr").hide();
+ $("#account\\.interface").prop( "disabled", true );
+ }
+ $('#account\\.interface').selectpicker('refresh');
+ });
+ $('#DialogAccount').on('shown.bs.modal', function (e) {
+ $("#account\\.service").change();
+ $("#account\\.use_interface").change();
+ });
+
+ $("#ddclient\\.general\\.checkip").change(function(){
+ let checkip = $(this).val();
+ $("#frm_settings .optional_setting").each(function(){
+ let this_item = $(this);
+ if (this_item.hasClass("checkip_"+checkip)) {
+ this_item.prop( "disabled", false );
+ this_item.closest("tr").show();
+ } else {
+ this_item.closest("tr").hide();
+ this_item.prop( "disabled", true );
+ }
+ });
+ });
+ $("#ddclient\\.general\\.checkip").change();
});
@@ -88,6 +114,7 @@ POSSIBILITY OF SUCH DAMAGE.
| {{ lang._('Enabled') }} |
{{ lang._('Service') }} |
{{ lang._('Username') }} |
+ {{ lang._('Interface') }} |
{{ lang._('Description') }} |
{{ lang._('Commands') }} |
diff --git a/dns/ddclient/src/opnsense/service/templates/OPNsense/ddclient/ddclient.conf b/dns/ddclient/src/opnsense/service/templates/OPNsense/ddclient/ddclient.conf
index b676d9e30..5aa00ca1c 100644
--- a/dns/ddclient/src/opnsense/service/templates/OPNsense/ddclient/ddclient.conf
+++ b/dns/ddclient/src/opnsense/service/templates/OPNsense/ddclient/ddclient.conf
@@ -1,3 +1,4 @@
+{% from 'OPNsense/Macros/interface.macro' import physical_interface %}
daemon={{OPNsense.DynDNS.general.daemon_delay|default('300')}}
syslog=yes # log update msgs to syslog
pid=/var/run/ddclient.pid # record PID in file.
@@ -8,79 +9,87 @@ verbose=yes
#
# setup how we expect to retrieve an IP address
#
-{% if not helpers.empty('OPNsense.DynDNS.general.checkip') and OPNsense.DynDNS.general.checkip.startswith('web_') %}
-{% set checkip = OPNsense.DynDNS.general.checkip.lstrip('web_') %}
-{% if checkip == 'dyndns' %}
+{% if not helpers.empty('OPNsense.DynDNS.general.checkip') %}
+{% set checkip = OPNsense.DynDNS.general.checkip %}
+{% if checkip == 'if' and OPNsense.DynDNS.general.interface|default('') != '' %}
+use=if, if={{physical_interface(OPNsense.DynDNS.general.interface)}}
+{% elif checkip == 'web_dyndns' %}
use=web, web=http://checkip.dyndns.org/, web-skip="Current IP Address:"
-{% elif checkip == 'freedns' %}
+{% elif checkip == 'web_freedns' %}
use=web, web=https://freedns.afraid.org/dynamic/check.php
-{% elif checkip == 'googledomains' %}
+{% elif checkip == 'web_googledomains' %}
use=web, web=https://domains.google.com/checkip
-{% elif checkip == 'he' %}
+{% elif checkip == 'web_he' %}
use=web, web=http://checkip.dns.he.net/
-{% elif checkip == 'ip4only.me' %}
+{% elif checkip == 'web_ip4only.me' %}
use=web, web=http://ip4only.me/api/
-{% elif checkip == 'ip6only.me' %}
+{% elif checkip == 'web_ip6only.me' %}
use=web, web=http://ip6only.me/api/
-{% elif checkip == 'ipify-ipv4' %}
+{% elif checkip == 'web_ipify-ipv4' %}
use=web, web=https://api.ipify.org/
-{% elif checkip == 'ipify-ipv6' %}
+{% elif checkip == 'web_ipify-ipv6' %}
use=web, web=https://api6.ipify.org/
-{% elif checkip == 'loopia' %}
+{% elif checkip == 'web_loopia' %}
use=web, web=http://dns.loopia.se/checkip/checkip.php, web-skip="Current IP Address:"
-{% elif checkip == 'myonlineportal' %}
+{% elif checkip == 'web_myonlineportal' %}
use=web, web=https://myonlineportal.net/checkip
-{% elif checkip == 'noip-ipv4' %}
+{% elif checkip == 'web_noip-ipv4' %}
use=web, web=http://ip1.dynupdate.no-ip.com/
-{% elif checkip == 'noip-ipv6' %}
+{% elif checkip == 'web_noip-ipv6' %}
use=web, web=http://ip1.dynupdate6.no-ip.com/
-{% elif checkip == 'nsupdate.info-ipv4' %}
+{% elif checkip == 'web_nsupdate.info-ipv4' %}
use=web, web=https://ipv4.nsupdate.info/myip
-{% elif checkip == 'nsupdate.info-ipv6' %}
+{% elif checkip == 'web_nsupdate.info-ipv6' %}
use=web, web=https://ipv6.nsupdate.info/myip
-{% elif checkip == 'zoneedit' %}
+{% elif checkip == 'web_zoneedit' %}
use=web, web=http://dynamic.zoneedit.com/checkip.html
-{% endif %}
+{% endif %}
{% endif %}
{% if helpers.exists('OPNsense.DynDNS.accounts.account') %}
{% for account in helpers.toList('OPNsense.DynDNS.accounts.account') %}
{% if account.enabled|default('0') == '1' %}
-{% if account.service == 'cloudflare' %}
-protocol=cloudflare
-zone={{account.zone}}
+{% if account.use_interface|default('0') == '1' %}
+use=if, if={{physical_interface(account.interface)}}, \
+{% endif %}
+{% if account.service == 'custom' %}
+protocol={{account.protocol}}, \
+ssl=yes, \
+server={{account.server}}, \
+{% elif account.service == 'cloudflare' %}
+protocol=cloudflare, \
+zone={{account.zone}}, \
{% elif account.service == 'he-net' %}
-protocol=dyndns2
-ssl=yes
-server=dyn.dns.he.net
+protocol=dyndns2, \
+ssl=yes, \
+server=dyn.dns.he.net, \
{% elif account.service == 'he-net-tunnel' %}
-protocol=dyndns2
-ssl=yes
-server=ipv4.tunnelbroker.net
+protocol=dyndns2, \
+ssl=yes, \
+server=ipv4.tunnelbroker.net, \
{% elif account.service == 'nsupdatev4' %}
-protocol=dyndns2
-ssl=yes
-server=ipv4.nsupdate.info
+protocol=dyndns2, \
+ssl=yes, \
+server=ipv4.nsupdate.info, \
{% elif account.service == 'nsupdatev6' %}
-protocol=dyndns2
-ssl=yes
-server=ipv6.nsupdate.info
+protocol=dyndns2, \
+ssl=yes, \
+server=ipv6.nsupdate.info, \
{% elif account.service == 'strato' %}
-use=web
-protocol=dyndns2
-ssl=yes
-server=dyndns.strato.com
+protocol=dyndns2, \
+ssl=yes, \
+server=dyndns.strato.com, \
{% else %}
-protocol={{account.service}}
-ssl=yes
+protocol={{account.service}}, \
+ssl=yes, \
{% endif %}
{% if account.wildcard|default('0') == '1' %}
-wildcard=yes
+wildcard=yes, \
{% endif %}
{% if account.username %}
-login={{account.username}}
+login={{account.username}}, \
{% endif %}
-password={{account.password}}
+password={{account.password}} \
{{account.hostnames}}
{% endif %}