diff --git a/README.md b/README.md index bd0cf62..4dc2042 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ Dynamic DNS services currently supported include: ClouDNS - See https://www.cloudns.net dinahosting - See https://dinahosting.com Gandi - See https://gandi.net + dnsexit - See https://dnsexit.com/ for details DDclient now supports many of cable/dsl broadband routers. diff --git a/ddclient.conf.in b/ddclient.conf.in index 164a260..e48e74b 100644 --- a/ddclient.conf.in +++ b/ddclient.conf.in @@ -301,3 +301,10 @@ ssl=yes # use ssl-support. Works with # login=myusername, \ # password=mypassword \ # myhost.mydomain.com + +## dnsexit (www.dnsexit.com) +## +#protocol=dnsexit, \ +#login=myusername, \ +#password=mypassword, \ +#subdomain-1.domain.com,subdomain-2.domain.com diff --git a/ddclient.in b/ddclient.in index 4ddd505..c47b199 100755 --- a/ddclient.in +++ b/ddclient.in @@ -461,6 +461,12 @@ my %variables = ( 'static' => setv(T_BOOL, 0, 1, 0, undef), 'wildcard' => setv(T_BOOL, 0, 1, 0, undef), }, + 'dnsexit-common-defaults' => { + 'ssl' => setv(T_BOOL, 0, 0, 0, 0, undef), + 'use' => setv(T_USE, 0, 1, 1, 'web',undef), + 'server' => setv(T_FQDNP, 0, 1, 1, 'update.dnsexit.com', undef), + 'script' => setv(T_STRING, 0, 1, 1, '/RemoteUpdate.sv', undef), + }, ); my %services = ( 'changeip' => { @@ -758,6 +764,15 @@ my %services = ( 'zone' => setv(T_OFQDN, 0, 0, undef, undef), }, }, + 'dnsexit' => { + 'updateable' => undef, + 'update' => \&nic_dnsexit_update, + 'examples' => \&nic_dnsexit_examples, + 'variables' => merge( + $variables{'dnsexit-common-defaults'}, + $variables{'service-common-defaults'}, + ), + }, ); $variables{'merged'} = { map({ %{$services{$_}{'variables'}} } keys(%services)), @@ -3408,7 +3423,82 @@ sub nic_dyndns2_update { } } +###################################################################### +## nic_dnsexit_examples +###################################################################### +sub nic_dnsexit_examples { + return <<"EoEXAMPLE"; +o 'dnsexit' +The 'dnsexit' protocol is the protocol used by the dynamic hostname services +of the 'DnsExit' dns services. This is currently used by the free +dynamic DNS service offered by www.dnsexit.com. + +Configuration variables applicable to the 'dnsexit' protocol are: + ssl=no ## turn off ssl + protocol=dnsexit ## + server=update.dnsexit.com ## defaults to update.dnsexit.com + use=web ## defaults to web + web=update.dnsexit.com ## defaults to update.dnsexit.com + script=/RemoteUpdate.sv ## defaults to /RemoteUpdate.sv + login=service-userid ## userid registered with the service + password=service-password ## password registered with the service + fully.qualified.host ## the host registered with the service. + +Example ${program}.conf file entries: + ## single host update + protocol=dnsexit \\ + login=service-userid \\ + password=service-password \\ + fully.qualified.host + +EoEXAMPLE +} +###################################################################### +## nic_dnsexit_update +###################################################################### +sub nic_dnsexit_update { + debug("\nnic_dnsexit_update -------------------"); + + ## update each configured host + foreach my $h (@_) { + my $ip = delete $config{$h}{'wantip'}; + info("setting IP address to %s for %s", $ip, $h); + verbose("UPDATE:","updating %s", $h); + + # Set the URL that we're going to update + my $url; + $url = "http://$config{$h}{'server'}$config{$h}{'script'}"; + $url .= "?login=$config{$h}{'login'}"; + $url .= "&password=$config{$h}{'password'}"; + $url .= "&host=$h"; + $url .= "&myip=$ip"; + + # Try to get URL + my $reply = geturl(opt('proxy'), $url); + + # No response, declare as failed + if (!defined($reply) || !$reply) { + failed("updating %s: Could not connect to %s.", $h, $config{$h}{'server'}); + last; + } + last if !header_ok($h, $reply); + + # Response found + if ($reply =~ /(\d+)=(.+)/) + { + $config{$h}{'ip'} = $ip; + $config{$h}{'mtime'} = $now; + $config{$h}{'status'} = 'good'; + success("updating %s: good: IP address set to %s", $h, $ip); + } else { + my @reply = split /\n/, $reply; + my $returned = pop(@reply); + $config{$h}{'status'} = 'failed'; + failed("updating %s: Server said: '$returned'", $h); + } + } +} ###################################################################### ## nic_noip_update ## Note: uses same features as nic_dyndns2_update, less return codes