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 %}