Chris Sawall - 2018-03-18

Hello! I need some assistance as I cannot tell that ddclient is updating OpenDNS or DNS-O-Matic when left to run as a service… I have the output pasted below and all I ever see is the connections established to obtain the current external IP. I never see connectivity to actually update any of the services. From what I can tell, if I leverage DNS-O-Matic, it never sees an update when run just from the script and config file. If I manually run ddclient from the command line with all of the options, it works fine.

I have pasted all of my config infos and debug below. Any assistance would be fantastic! I am running this on a raspberry pi -> Raspbian GNU/Linux 8 (Jessie). I installed ddclient via apt-get and then enabled the daemon to run within init.d.

For configuration of DNS-O-Matic, I referenced this site: https://dnsomatic.com/wiki/ddclient

For multiple services, I referenced (all of which seem confusing on if, when, or where a comma may be needed, or use of the protocol variable as a global or within the specific service line).
https://github.com/ddclient/ddclient/blob/master/sample-etc_ddclient.conf
https://sourceforge.net/p/ddclient/wiki/usage/

This is the command I used to run it manually and which worked.

sudo /usr/sbin/ddclient -verbose -query -noquiet -web myip.dnsomatic.com -server updates.dnsomatic.com -login dnsomatic_email -password 'dnsomatic_password' -host all.dnsomatic.com

My primary configuration file. I have tried with the service variables on one line and on multiple lines. And noting that the daemon variable is not used as it is overridden by /etc/default/ddclient.

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf

daemon=3600
syslog=yes
use=web, web=myip.dnsomatic.com
ssl=yes

server=updates.opendns.com, protocol=dyndns2, login=opendns_email, password=opendns_pwd' defined_network

server=updates.dnsomatic.com, protocol=dyndns2, login=dnsomatic_email, password='dnsomatic_pwd' all.dnsomatic.com

It should be noted in the reference docs that this [default] file exists too and overrides the config file as well as the init.d config. But I found it and this is the current config.

# Configuration for ddclient scripts
# generated from debconf on Sat Mar 17 16:50:20 CDT 2018
#
# /etc/default/ddclient

run_dhclient="false"
run_ipup="false"
run_daemon="true"
daemon_interval="3600"

As reference, this is the header from /usr/sbin/ddclient to validate current version.

######################################################################
# $Id: ddclient 157 2013-12-26 09:02:05Z wimpunk $
#
# DDCLIENT - a Perl client for updating DynDNS information
#
# Author: Paul Burry (paul+ddclient@burry.ca)
# ddclient-developers: see https://sourceforge.net/project/memberlist.php?group_id=116817
#
# website: http://ddclient.sf.net
#
# Support for multiple IP numbers added by
# Astaro AG, Ingo Schwarze <ischwarze-OOs/4mkCeqbQT0dZR+AlfA@public.gmane.org> September 16, 2008
#
######################################################################

Here I have pasted selected portions of the etc/init.d/ddclient file for reference. And noting that the daemon_interval variable is not used as it is overridden by /etc/default/ddclient.

#! /bin/sh
#
# init script for the dynamic DNS service update utility: ddclient
<snip>
# Author: Torsten Landschoff <torsten@debian.org>

PATH=/sbin:/bin:/usr/sbin:/usr/bin
NAME="ddclient"
DAEMON=/usr/sbin/$NAME
PERL=/usr/bin/perl
DESC="Dynamic DNS service update utility"
<snip>
# Evaluate the config for the Debian scripts
run_daemon=true
daemon_interval=3600
<snip>

I have tried to run this command with and without the “-file” setting, but the results are the same. In an attempt to validate it was reading the right config. Verbose output below.

pi@raspberrypi:~ $ sudo /usr/sbin/ddclient -verbose -query -noquiet -file /etc/ddclient.conf

Other than the issue noted above in that I never see it connecting to update the services, the other questions I have are:
- I clearly defined the config to use “web” and to use “myip.dnsomatic.com”. But the output immediately starts with showing my local interface information. Why?
- I configured it to use myip.dnsomatic.com, but the script starts with also connecting to ipdetect.dnspark.com, checkip.dyndns.org, and dns.loopia.se before going to what I told it to do. Why?
- Is there a different issue in that these checks seem to be parsing and pulling down javascript? Which I assume the ddclient app is not parsing or doing anything with?

Verbose output:

use=if, if=eth0 address is 192.168.x.yyy
use=if, if=lo address is 127.0.0.1
CONNECT:  ipdetect.dnspark.com
CONNECTED:  using HTTP
SENDING:  GET / HTTP/1.0
SENDING:   Host: ipdetect.dnspark.com
SENDING:   User-Agent: ddclient/3.8.2
SENDING:   Connection: close
SENDING:   
RECEIVE:  HTTP/1.1 200 OK
RECEIVE:  Server: nginx
RECEIVE:  Date: Sun, 18 Mar 2018 15:18:49 GMT
RECEIVE:  Content-Type: text/html; charset=UTF-8
RECEIVE:  Connection: close
RECEIVE:  Vary: Accept-Encoding
RECEIVE:  X-Powered-By: PHP/5.5.30-1+deb.sury.org~precise+1
RECEIVE:  
RECEIVE:  <html>
RECEIVE:  <head><script type="text/javascript">window.NREUM||(NREUM={}),__nr_require=function(e,t,n){function r(n){if(!t[n]){var o=t[n]={exports:{}};e[n][0].call(o.exports,function(t){var o=e[n][1][t];return r(o||t)},o,o.exports)}return t[n].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<n.length;o++)r(n[o]);return r}({1:[function(e,t,n){function r(){}function o(e,t,n){return function(){return i(e,[f.now()].concat(u(arguments)),t?null:this,n),t?void 0:this}}var i=e("handle"),a=e(2),u=e(3),c=e("ee").get("tracer"),f=e("loader"),s=NREUM;"undefined"==typeof window.newrelic&&(newrelic=s);var p=["setPageViewName","setCustomAttribute","setErrorHandler","finished","addToTrace","inlineHit","addRelease"],d="api-",l=d+"ixn-";a(p,function(e,t){s[t]=o(d+t,!0,"api")}),s.addPageAction=o(d+"addPageAction",!0),s.setCurrentRouteName=o(d+"routeName",!0),t.exports=newrelic,s.interaction=function(){return(new r).get()};var m=r.prototype={createTracer:function(e,t){var n={},r=this,o="function"==typeof t;return i(l+"tracer",[f.now(),e,n],r),function(){if(c.emit((o?"":"no-")+"fn-start",[f.now(),r,o],n),o)try{return t.apply(this,arguments)}catch(e){throw c.emit("fn-err",[arguments,this,e],n),e}finally{c.emit("fn-end",[f.now()],n)}}}};a("setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","),function(e,t){m[t]=o(l+t)}),newrelic.noticeError=function(e){"string"==typeof e&&(e=new Error(e)),i("err",[e,f.now()])}},{}],2:[function(e,t,n){function r(e,t){var n=[],r="",i=0;for(r in e)o.call(e,r)&&(n[i]=t(r,e[r]),i+=1);return n}var o=Object.prototype.hasOwnProperty;t.exports=r},{}],3:[function(e,t,n){function r(e,t,n){t||(t=0),"undefined"==typeof n&&(n=e?e.length:0);for(var r=-1,o=n-t||0,i=Array(o<0?0:o);++r<o;)i[r]=e[t+r];return i}t.exports=r},{}],4:[function(e,t,n){t.exports={exists:"undefined"!=typeof window.performance&&window.performance.timing&&"undefined"!=typeof window.performance.timing.navigationStart}},{}],ee:[function(e,t,n){function r(){}function o(e){function t(e){return e&&e instanceof r?e:e?c(e,u,i):i()}function n(n,r,o,i){if(!d.aborted||i){e&&e(n,r,o);for(var a=t(o),u=m(n),c=u.length,f=0;f<c;f++)u[f].apply(a,r);var p=s[y[n]];return p&&p.push([b,n,r,a]),a}}function l(e,t){v[e]=m(e).concat(t)}function m(e){return v[e]||[]}function w(e){return p[e]=p[e]||o(n)}function g(e,t){f(e,function(e,n){t=t||"feature",y[n]=t,t in s||(s[t]=[])})}var v={},y={},b={on:l,emit:n,get:w,listeners:m,context:t,buffer:g,abort:a,aborted:!1};return b}function i(){return new r}function a(){(s.api||s.feature)&&(d.aborted=!0,s=d.backlog={})}var u="nr@context",c=e("gos"),f=e(2),s={},p={},d=t.exports=o();d.backlog=s},{}],gos:[function(e,t,n){function r(e,t,n){if(o.call(e,t))return e[t];var r=n();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:r,writable:!0,enumerable:!1}),r}catch(i){}return e[t]=r,r}var o=Object.prototype.hasOwnProperty;t.exports=r},{}],handle:[function(e,t,n){function r(e,t,n,r){o.buffer([e],r),o.emit(e,t,n)}var o=e("ee").get("handle");t.exports=r,r.ee=o},{}],id:[function(e,t,n){function r(e){var t=typeof e;return!e||"object"!==t&&"function"!==t?-1:e===window?0:a(e,i,function(){return o++})}var o=1,i="nr@id",a=e("gos");t.exports=r},{}],loader:[function(e,t,n){function r(){if(!x++){var e=h.info=NREUM.info,t=d.getElementsByTagName("script")[0];if(setTimeout(s.abort,3e4),!(e&&e.licenseKey&&e.applicationID&&t))return s.abort();f(y,function(t,n){e[t]||(e[t]=n)}),c("mark",["onload",a()+h.offset],null,"api");var n=d.createElement("script");n.src="https://"+e.agent,t.parentNode.insertBefore(n,t)}}function o(){"complete"===d.readyState&&i()}function i(){c("mark",["domContent",a()+h.offset],null,"api")}function a(){return E.exists&&performance.now?Math.round(performance.now()):(u=Math.max((new Date).getTime(),u))-h.offset}var u=(new Date).getTime(),c=e("handle"),f=e(2),s=e("ee"),p=window,d=p.document,l="addEventListener",m="attachEvent",w=p.XMLHttpRequest,g=w&&w.prototype;NREUM.o={ST:setTimeout,SI:p.setImmediate,CT:clearTimeout,XHR:w,REQ:p.Request,EV:p.Event,PR:p.Promise,MO:p.MutationObserver};var v=""+location,y={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-1071.min.js"},b=w&&g&&g[l]&&!/CriOS/.test(navigator.userAgent),h=t.exports={offset:u,now:a,origin:v,features:{},xhrWrappable:b};e(1),d[l]?(d[l]("DOMContentLoaded",i,!1),p[l]("load",r,!1)):(d[m]("onreadystatechange",o),p[m]("onload",r)),c("mark",["firstbyte",u],null,"api");var x=0,E=e(4)},{}]},{},["loader"]);</script>
RECEIVE:  <meta http-equiv="Expires" content="Tues, 04 Dec 1996 21:00:00 GMT">
RECEIVE:  <meta http-equiv="pragma" content="no cache">
RECEIVE:  </head>
RECEIVE:  <body>
RECEIVE:  
RECEIVE:  
RECEIVE:  Current Address: <MY EXTERNAL IP>
RECEIVE:  <script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"<LICENSE KEY REMOVED AS I AM NOT SURE WHAT IT IS","applicationID":"4148543,4148544","transactionName":"ZwdaZEQEV0RUURJZDl5NbUJfSlBZUVceHhFYEg==","queueTime":0,"applicationTime":0,"atts":"S0BZEgweREo=","errorBeacon":"bam.nr-data.net","agent":""}</script></body>
RECEIVE:  </html>
use=web, web=dnspark address is <MY EXTERNAL IP>
CONNECT:  checkip.dyndns.org
CONNECTED:  using HTTP
SENDING:  GET / HTTP/1.0
SENDING:   Host: checkip.dyndns.org
SENDING:   User-Agent: ddclient/3.8.2
SENDING:   Connection: close
SENDING:   
RECEIVE:  HTTP/1.1 200 OK
RECEIVE:  Content-Type: text/html
RECEIVE:  Server: DynDNS-CheckIP/1.0.1
RECEIVE:  Connection: close
RECEIVE:  Cache-Control: no-cache
RECEIVE:  Pragma: no-cache
RECEIVE:  Content-Length: 105
RECEIVE:  
RECEIVE:  <html><head><title>Current IP Check</title></head><body>Current IP Address: <MY EXTERNAL IP></body></html>
use=web, web=dyndns address is <MY EXTERNAL IP>
CONNECT:  dns.loopia.se
CONNECTED:  using HTTP
SENDING:  GET /checkip/checkip.php HTTP/1.0
SENDING:   Host: dns.loopia.se
SENDING:   User-Agent: ddclient/3.8.2
SENDING:   Connection: close
SENDING:   
RECEIVE:  HTTP/1.1 200 OK
RECEIVE:  Server: nginx/1.12.2
RECEIVE:  Date: Sun, 18 Mar 2018 15:18:51 GMT
RECEIVE:  Content-Type: text/html; charset=UTF-8
RECEIVE:  Connection: close
RECEIVE:  X-Powered-By: PHP/5.6.32
RECEIVE:  
RECEIVE:  <html><head><title>Current IP Check</title></head><body>Current IP Address: <MY EXTERNAL IP></body></html>
use=web, web=loopia address is <MY EXTERNAL IP>
CONNECT:  myip.dnsomatic.com
CONNECTED:  using HTTP
SENDING:  GET / HTTP/1.0
SENDING:   Host: myip.dnsomatic.com
SENDING:   User-Agent: ddclient/3.8.2
SENDING:   Connection: close
SENDING:   
RECEIVE:  HTTP/1.1 200 OK
RECEIVE:  Server: Varnish
RECEIVE:  Retry-After: 5
RECEIVE:  Content-Type: text/html
RECEIVE:  Content-Length: 13
RECEIVE:  Accept-Ranges: bytes
RECEIVE:  Date: Sun, 18 Mar 2018 15:18:51 GMT
RECEIVE:  X-Varnish: 1184590421
RECEIVE:  Age: 0
RECEIVE:  Via: 1.1 varnish
RECEIVE:  Connection: close
RECEIVE:  
RECEIVE:  24.107.127.41
use=web, web=myip.dnsomatic.com address is <MY EXTERNAL IP>

Thanks in advance for taking the time to review and help me with this!