Namecheap Dynamic Dns

Imagine you want to host your development server from home. So you buy a domain from namecheap and point the sub-domains to your home I.P address. Now the problem is every couple of months or on every power failure (how ever rare they might be) you external I.P ends up changing. Now you have to login to your domain host and change the I.P for all of them.

This gem allows you to automatically easily change the I.P address of the subdomains that are pointing to your home Internet. It does this by checking your external I.P address with each specified subdomains to see if they match. Then if they don't match a call is made to namecheap to change it.

Installation

Add this line to your application's Gemfile:

gem 'namecheap-dynamic-dns'

And then execute:

$ bundle

Or install it yourself as:

$ gem install namecheap-dynamic-dns

Usage

In order to use this gem you must first create a YML file that tells this gem information about what are the domain/s to target and some additional information. You control the run time interval either through ruby script via cronjob or by rails. I recommend at least 5 minutes gap in-between checks. Some DNS takes time to update.

You will need to have connection to Internet.If you are in highly secure site then the following domains needs to be white listed:

  • dynamicdns.park-your-domain.com
  • whatismyip.akamai.com

YML

The file you are about to create can have any name. I named mine domains.yml. As long as you specify the file path you should be fine.

Create a YML file with the following:

---
domains:
  example.com:
    password: 74gh9j3eufh86gh39jygh9f8h3f4

    subdomains:
      home:
      test:
        # Subdomain level
        ip: 1.2.3.4

  foo.com:
    password: 3fj987jg0wi4u9e84fh0342jghjd
    # Domain level
    ip: 2.4.6.8

    subdomains:
      bar:
      donkey:
        ip: aaa.com    

Password

The password here you will get from NameCheap when you select a domain and under Advanced DNS and enable DYNAMIC DNS and you will see Dynamic DNS Password.

I.P

I.P can be host name as well. By default if you don't specify any I.P anywhere then the I.P will be the external I.P (wan) of the computer this gem is running from. If you specify an I.P address in domain level then any subdomains that did not specified an I.P address will user the I.P address of the domain. Any I.P you specifies in the subdomain level will only affect that subdomain. One thing to note which is if you are using a host name that uses load balancers then you may get different I.P on every call or every other call.

Explanation

The above settings translates to, example.com has two subdomains. First home.example.com will always have the external I.P address of the machine you are using this gem on. The last subdomain test.example.com will always have the I.P 1.2.3.4

The second part of the settings translates to, foo.com has two subdomains. First subdomain bar.foo.com will always have I.P 2.4.6.8 and the second subdomain donkey.foo.com will always have I.P address of host aaa.com

NOTE: Make sure that you git ignore this file since it has your password in it.

Using Script

In your ruby script include the modules.

require 'namecheap-dynamic-dns'

include Namecheap::Dynamic::Dns

setup('domains.yml')
process_domains

Using Rails

In you class enter the following.

class Example
  include Namecheap::Dynamic::Dns

  def initialize(config_file)
    setup(config_file)
  end
end

Then to process the domains

foo = Example.new('config/domains.yml')
foo.process_domains

Other Methods

These methods you won't need to use but can be useful for you in other way.

# Get external I.P
external_ip

# Get IP from hostname
host_to_ip('google.com')

# Valid IP?
an_ip?('1.2.3.4')

# Get list of domains
domains

# Chack is domain specified is valid
valid_domain?('google.com')

# Force reload config YML file
load_config

# See raw response
xml_response

# See JSON response
response

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/namecheap-dynamic-dns.

License

The gem is available as open source under the terms of the MIT License.