GoDaddy DDNS Updater

As I’m running this site itself on my 4TB WDMyCloud home NAS, refer to my post WebHosting on WDMyCloud V4 Firmwares, I will need my DNS to be always pointing to it when my public IP changes.

Although my public IP seldom changes, I’ve been using a Python based script with its ‘pygodaddy’ module for a while to auto update my GoDaddy DDNS pointing to my WDMyCloud NAS. The script is supposed to update my current public IP by parsing GoDaddys DNS update form. But on few occasions when there’s the need to update, the script failed to work because obviously GoDaddy had changed something in their front-end. I’ve also used a similar PHP based script but that too failed to work. And worst still, for as long that I know of, GoDaddy hasn’t provide any means of updating the records other than manually from their site itself.

Like many others with paid GoDaddy domain account, I’ve been looking for permanent solution not until recently and long awaited for, GoDaddy has finally implemented some APIs for developments which now provides the ability to update the DNS records via a REST call. You can see more details at their developer’s site, https://developer.godaddy.com.

Disclaimer: As I’m frequently updating the original guides and installers here on TeaNazaR.com, I will not be responsible for any brick issues if you were to follow my obsolete guides copied elsewhere. Thus subscribe to this post to get latest updates. Modifying any part of a device may void its warranty.

With this API, I’ve written another simple shell script to perform the DDNS update which can be scheduled with a 5mins repeating Cron job. It should work on any Linux based systems. Why shell script? It’s simple, low-resource and does the update faster than any similar Python, PHP, Perl, Java JIT compiler I’ve tested on the NAS. On each run, the script will check for public IP changes against the local cache and GoDaddy records itself using cURL and only attempt to update if necessary. Even though GoDaddy did not specify the minimum update interval, updating too frequently could affect DNS propagation which could cause delay of the DNS being updated across the internet.

GoDaddy.sh
GoDaddy.sh

First you will need is of course your paid domain name, then a GoDaddy “ProductionAPI key/secret to use with this script. Go to this specific link, log in with your GoDaddy account then generate the API key/secret. Note that the very first time you do this, it will be created as “Test” environment (seen at the time of writing). Go back to the same page again or click on the “Keys” top menu then generate a new “ProductionAPI key/secret instead.

GoDaddy API
GoDaddy API

You can place this script anywhere on your server. I’ll explain more for users who’s not familiar with Linux.

Launch the editor i.e. nano /root/scripts/GoDaddy.sh; . Copy & paste the script source from the bottom of this post into the terminal, update the API key/secret , Domain and other desired options, then CTRL+X to save. Test the script if it’s working:

Once the script is in place, schedule a Cron job every 5mins, crontab -e; , examples below on a single line:

a. No logging (recommended):

b. With logging for debugging purposes (you will need to do your own log housekeeping, try logrorate?):

To update a subdomain (second-level domain i.e. subdomain.domain.com) instead of primary domain (top-level domain i.e. domain.com), set Type=A Type=CNAME (Updated: CNAME by default  can’t point to an IP) and Name=subdomain where subdomain is your subdomain.domain.com as seen in the GoDaddy DNS setup page.

I’ve also added optional advanced variables to include any custom scripts, programs or commands to execute when the IP update occurs or failed. This is so that you can place this script on top of your other applications i.e. those which requires public IP update cached in /tmp/current_ip or those which triggers upon IP changes. Read the script’s comments for more details. For instance, you can use Postfix‘s sendmail to trigger an email notification upon IP update or failures by setting the SuccessExec or FailedExec values. Those who’s using my WebHosting on WDMyCloud V4 Firmwares mods, you can configure its ESMTP to get similar results. For an example to get notified upon successful IP update, set the  SuccessExec value to:

This should be the permanent solution for now until GoDaddy decides to make other changes. Need a Windows based DDNS client updater? Not sure why would anyone leave their PC always awaked, unless it’s a Windows based NAS/server. Perhaps I can help to write a simple Windows executable. But you can always run Cygwin to deploy shell scripts also Ubuntu is already runnable in Windows 10 Insider Preview (at the time of writing). For now, only my NAS running 24/7 needs this. Any questions you can post it here, enjoy (-:

GoDaddy.sh

201 thoughts on “GoDaddy DDNS Updater”

  1. Nazar, thanks for the script and for pointing out GoDaddy’s API. Works like a charm!

  2. Hi, very good script, I don’t know if no one is changing the godaddy DNS, actually the external IP can be recorded on the server rather than get it from godaddy. If IP is not changed then no further action is needed. This can avoid 5 min check with godaddy but less secure, what do you think

    1. really embarrassing just noticed the IP is cached, I should read through the script before writing down my ideas here, get too excited as this script is so good =) Please ignore my last comment

      1. No problem, I was about to reply about the IP caching. Glad it helps (-:

  3. Thanks for this I have applied it to my Pfsense firewall had to make a few tweaks but does the jobs 😉

    1. Hi Rich…I’m trying to do the same with my PFsense with no success…any pointers on what tweaks you did to get it working?

      Error I get when I run the script – Checking current ‘Public IP’ from ‘http://api.ipify.org’…/etc/GoDaddy.sh: [[: not found
      Fail! 101.xxx.xxx.xxx

      1. Hello JR,

        The script needs bash, doesn't work with sh due to the RegExp. What is your bash version?

        bash --version

        Try running below, you should see “foobar” as result:

        bash -c "[[ foobar =~ bar ]] && echo foobar"

        You could try running with:

        bash /root/scripts/GoDaddy.sh

        Worst case you could ignore the IP detection as long as it's not empty, try replacing line 73:

        if [ $? -eq 0 ] && [ "${PublicIP}" != "" ];then

  4. I am trying to implement this but when i run the script i get errors pertaining to line 208, 209, 226 and 227.

    line 208 & 226 – applicaiton / json: no such file or directory
    line 209 & 227 – URL: no such file or directory

  5. mike dennison says:

    Will this script work for multiple domains if I have 3 domains…

    so if on line

    24 | domain1.com
    25| domain2.com
    26| domain3.com

    will it update all three or do I need to run 3 different cron jobs ?

    1. You will need 3 different cron or just link them up using the SuccessExec variable. Meaning when the first script succeed updating, it will run the next 2nd and 3rd script. Note each script needs a unique CachedIP path value.

  6. Harsha says:

    Thanks a lot! I was struggling to make my own script for my website since a few weeks. Yours was so easy. Thank you for your contribution.

  7. Just wanted to add my big “Thank You” also. I don’t know enough about shell scripts, but want to know if its possible to add a port number before it updates the IP.

    1. Hello Pat,

      I’m not sure why the need to add a port number? DDNS doesn’t need any port changes. Any port you open in the NAT will work with your DDNS. Perhaps you could explain your situation further.

      1. Pretty sure I’m just tired and not thinking straight. I have a few raspberry pis that run different programs for me. Each with their own front ends so they have ports assigned to them. I was just wondering about using the script to update different domains to point to specific ports. Am I overthinking this?

        1. You could schedule multiple instances of this script for each of your domain either separately or all on one device (need unique cache variable). Need not worry about the ports.

          1. Lol thank you. Sleep makes a big difference. Forgot that DNS doesn’t interact with TCP so I couldn’t add a port anyway. Thank you for the help. Works great.

  8. Worked perfectly on my Raspberry Pi. Thanks for making the GoDaddy update script i’ve wanted for years.

  9. Hello,

    Thank you for the script.

    I have an issue though: UNKNOWN_DOMAIN
    I tried to update my sub-domain, so I put Domain=subdomain(.a.TLD) and Type=CNAME but it doesn’t work. Same when I try on the goDaddy API documentation.

    Can you help me please?
    Thanks

    1. Hello Mims,

      The Domain variable is still your primary domain. Then set your subdomain to the Name variable and Type=CNAME. Take it example foo.bar.com is your subdomain, the correct settings are as below:

      Domain=bar.com
      Type=CNAME
      Name=foo

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax