diff --git a/README.md b/README.md index eba1a90..e61f57b 100644 --- a/README.md +++ b/README.md @@ -28,29 +28,32 @@ Dynamic DNS services currently supported include: Duckdns - See https://duckdns.org/ for details Freemyip - See https://freemyip.com for details woima.fi - See https://woima.fi/ for details + Yandex - See https://domain.yandex.com/ for details + DonDominio - See https://www.dondominio.com for details -DDclient now supports many of cable/dsl broadband routers. +DDclient now supports many of cable/dsl broadband routers. -Comments, suggestions and requests: use the forums on +Comments, suggestions and requests: use the forums on http://sourceforge.net/projects/ddclient/ -The code was originally written by Paul Burry and is now hosted and maintained +The code was originally written by Paul Burry and is now hosted and maintained through sourceforge.net. Please check out http://ddclient.sf.net ------------------------------------------------------------------------------- -REQUIREMENTS: +## REQUIREMENTS: - one or more accounts from one of the dynamic DNS services - Perl 5.014 or later - (you need the IO::Socket::SSL perl library for ssl-support, - JSON::PP perl library for JSON support and - IO::Socket:INET6 perl library for ipv6-support) + - `Data::Validate::IP` perl library + - `IO::Socket::SSL` perl library for ssl-support + - `JSON::PP` perl library for JSON support + - `IO::Socket:INET6` perl library for ipv6-support - Linux or probably any common Unix system ------------------------------------------------------------------------------- -INSTALLATION: +## INSTALLATION: cp ddclient /usr/sbin/ mkdir /etc/ddclient @@ -59,6 +62,13 @@ INSTALLATION: vi /etc/ddclient/ddclient.conf -- and change hostnames, logins, and passwords appropriately + ## For those using systemd: + cp sample-etc_systemd.service /etc/systemd/system/ddclient.service + ## enable automatic startup when booting + systemctl enable ddclient.service + ## start the first time by hand + systemctl start ddclient.service + ## For those using Redhat style rc files and using daemon-mode: cp sample-etc_rc.d_init.d_ddclient /etc/rc.d/init.d/ddclient ## enable automatic startup when booting @@ -91,7 +101,7 @@ INSTALLATION: ## as described below. ------------------------------------------------------------------------------- -TROUBLESHOOTING: +## TROUBLESHOOTING: 1. enable debugging and verbose messages. ``$ ddclient -daemon=0 -debug -verbose -noquiet`` @@ -111,10 +121,10 @@ TROUBLESHOOTING: ``fw=url-to-your-router``'s-status-page ``fw-skip=any-string-preceding-your-IP-address`` - ddclient does something like this to provide builtin support for + ddclient does something like this to provide builtin support for common routers. For example, the Linksys routers could have been added with: - + fw=192.168.1.1/Status.htm fw-skip=WAN.*?IP Address @@ -136,7 +146,7 @@ TROUBLESHOOTING: while some others accept anything. ------------------------------------------------------------------------------- -USING DDCLIENT WITH ppp +## USING DDCLIENT WITH ppp If you are using a ppp connection, you can easily update your DynDNS entry with each connection, with: @@ -148,7 +158,7 @@ Alternatively, you may just configure ddclient to operate as a daemon and monitor your ppp interface. ------------------------------------------------------------------------------- -USING DDCLIENT WITH cron +## USING DDCLIENT WITH cron If you have not configured ddclient to use daemon-mode, you'll need to configure cron to force an update once a month so that the dns entry will @@ -159,7 +169,7 @@ not become stale. vi /etc/cron.d/ddclient ------------------------------------------------------------------------------- -USING DDCLIENT WITH dhcpcd-1.3.17 +## USING DDCLIENT WITH dhcpcd-1.3.17 If you are using dhcpcd-1.3.17 or thereabouts, you can easily update your DynDNS entry automatically every time your lease is obtained @@ -173,19 +183,19 @@ In my case, it is named dhcpcd-eth0.exe and contains the lines: #!/bin/sh PATH=/usr/sbin:/root/bin:${PATH} logger -t dhcpcd IP address changed to $1 - ddclient -proxy fasthttp.sympatico.ca -wildcard -ip $1 | logger -t ddclient + ddclient -proxy fasthttp.sympatico.ca -wildcard -ip $1 | logger -t ddclient exit 0 Other DHCP clients may have another method of calling out to programs -for updating DNS entries. +for updating DNS entries. Alternatively, you may just configure ddclient to operate as a daemon and monitor your ethernet interface. ------------------------------------------------------------------------------- -USING DDCLIENT WITH dhclient +## USING DDCLIENT WITH dhclient -If you are using the ISC DHCP client (dhclient), you can update +If you are using the ISC DHCP client (dhclient), you can update your DynDNS entry automatically every time your lease is obtained or renewed by creating an executable file named: /etc/dhclient-exit-hooks diff --git a/README.ssl b/README.ssl index ed8d19b..34497b9 100644 --- a/README.ssl +++ b/README.ssl @@ -9,3 +9,4 @@ On alpine, you need perl-io-socket-ssl to have IO::Socket::SSL ssl support is tested on folowing dynamic dns providers: - dyndns.com - freemyip.com +- dondominio.com diff --git a/ddclient b/ddclient index 5f65d95..3f0d170 100755 --- a/ddclient +++ b/ddclient @@ -483,6 +483,12 @@ my %variables = ( 'warned-min-interval' => setv(T_ANY, 0, 1, 0, 0, undef), 'warned-min-error-interval' => setv(T_ANY, 0, 1, 0, 0, undef), }, + 'yandex-common-defaults' => { + 'server' => setv(T_FQDNP, 1, 0, 1, 'pddimp.yandex.ru', undef), + }, + 'dondominio-common-defaults' => { + 'server' => setv(T_FQDNP, 1, 0, 1, 'dondns.dondominio.com', undef), + }, ); my %services = ( 'dyndns1' => { @@ -685,11 +691,30 @@ my %services = ( $variables{'woima-service-common-defaults'}, ), }, + 'yandex' => { + 'updateable' => undef, + 'update' => \&nic_yandex_update, + 'examples' => \&nic_yandex_examples, + 'variables' => merge( + { 'min-interval' => setv(T_DELAY, 0, 0, 1, interval('5m'), 0),}, + $variables{'yandex-common-defaults'}, + $variables{'service-common-defaults'}, + ), + }, + 'dondominio' => { + 'updateable' => undef, + 'update' => \&nic_dondominio_update, + 'examples' => \&nic_dondominio_examples, + 'variables' => merge( + $variables{'dondominio-common-defaults'}, + $variables{'service-common-defaults'}, + ), + }, ); $variables{'merged'} = merge($variables{'global-defaults'}, - $variables{'service-common-defaults'}, - $variables{'dyndns-common-defaults'}, - map { $services{$_}{'variables'} } keys %services, + $variables{'service-common-defaults'}, + $variables{'dyndns-common-defaults'}, + map { $services{$_}{'variables'} } keys %services, ); my @opt = ( @@ -2009,16 +2034,23 @@ sub geturl { verbose("CONNECT:", "%s", $to); $request = "$method "; - $request .= "http://$server" if $proxy; + if (!$use_ssl) { + $request .= "http://$server" if $proxy; + } else { + $request .= "https://$server" if $proxy; + } $request .= "/$url HTTP/1.0\n"; $request .= "Host: $server\n"; my $auth = encode_base64("${login}:${password}", ""); $request .= "Authorization: Basic $auth\n" if $login || $password; $request .= "User-Agent: ${program}/${version}\n"; + if ($data) { + $request .= "Content-Type: application/x-www-form-urlencoded\n" if ! $headers =~ /^Content-Type: /; + $request .= "Content-Length: " . length($data) . "\n"; + } $request .= "Connection: close\n"; $request .= "$headers\n"; - $request .= "Content-Length: ".length($data)."\n" if $data; $request .= "\n"; $request .= $data; @@ -3600,12 +3632,12 @@ Configuration variables applicable to the 'namecheap' protocol are: server=fqdn.of.service ## defaults to dynamicdns.park-your-domain.com login=service-login ## login name and password registered with the service password=service-password ## - hostname ## the hostname to update. + fully.qualified.host ## the hostname to update. Example ${program}.conf file entries: ## single host update - protocol=namecheap, \\ - login=my-namecheap.com-login, \\ + protocol=namecheap \\ + login=my-namecheap.com-login \\ password=my-namecheap.com-password \\ myhost @@ -3630,15 +3662,17 @@ sub nic_namecheap_update { ## update each configured host foreach my $h (@_) { - my $ip = delete $config{$h}{'wantip'}; + my $ip = delete $config{$h}{'wantip'}; info("setting IP address to %s for %s", $ip, $h); verbose("UPDATE:","updating %s", $h); my $url; $url = "https://$config{$h}{'server'}/update"; - my $domain = $config{$h}{'login'}; - $url .= "?host=$h"; - $url .= "&domain=$domain"; + my $domain = $config{$h}{'login'}; + my $host = $h; + $host =~ s/(.*)\.$domain(.*)/$1$2/; + $url .= "?host=$host"; + $url .= "&domain=$domain"; $url .= "&password=$config{$h}{'password'}"; $url .= "&ip="; $url .= $ip if $ip; @@ -4346,6 +4380,120 @@ sub nic_cloudflare_update { } } } +###################################################################### +## nic_yandex_examples +###################################################################### +sub nic_yandex_examples { + return <jsonToObj($reply); + if ($response->{success} eq 'error') { + failed ("%s", $response->{error}); + next; + } + + # Pull the ID out of the json + my ($id) = map { $_->{fqdn} eq $host ? $_->{record_id} : () } @{ $response->{records} }; + unless($id) { + failed("updating %s: DNS record ID not found.", $host); + next; + } + + # Update the DNS record + $url = "https://$config{$host}{'server'}/api2/admin/dns/edit"; + my $data = "domain="; + $data .= $config{$key}{'login'}; + $data .= "&record_id="; + $data .= $id; + $data .= "&content="; + $data .= $ip if $ip; + + $reply = geturl(opt('proxy'), $url, '', '', $headers, 'POST', $data); + unless ($reply) { + failed("updating %s: Could not connect to %s.", $host, $config{$host}{'server'}); + last; + } + last if !header_ok($host, $reply); + + # Strip header + $reply =~ s/^.*?\n\n//s; + $response = JSON::Any->jsonToObj($reply); + if ($response->{success} eq 'error') { + failed ("%s", $response->{error}); + } else { + success ("%s -- Updated Successfully to %s", $host, $ip); + } + + # Cache + $config{$host}{'ip'} = $ip; + $config{$host}{'mtime'} = $now; + $config{$host}{'status'} = 'good'; + } + } +} ###################################################################### ## nic_duckdns_examples @@ -4676,6 +4824,80 @@ sub nic_woima_update { } } +###################################################################### +## nic_dondominio_examples +###################################################################### +sub nic_dondominio_examples { + return <' \ - http://169.254.1.1:49000/upnp/control/WANCommonIFC1 | \ - sed -n -e 's#^.*\(.*\).*$#\1#p' + -d ' ' \ + 'http://fritz.box:49000/igdupnp/control/WANIPConn1' | \ + grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'