Gavin’s Odd Bits of Code

2010-05-13 (Thu)

Automatic EasyDNS (or other dynamic DNS) updates from your iPhone

Filed under: Hacks,MacOS X — Gavin Brock @ 3:49 pm
Tags: , ,
2010/10/10: Update: It appaears that the current version of curl on Cydia does not support HTTPS so the dns.sh script was changed to use wget.
I use EasyDNS to provide name resolution for my domain names. They provide a web based dynamic DNS updates service that allows people with dynamic IP address to update their records to point back to their machines.
I wanted to do this for my (jailbroken) iphone, so I documented my procedure below.

1 – Jailbreak your iPhone

There are plenty of guides on the web about this, and it’s too much to go into here. Try Google.
Once you are jailbroken, continue…

2 – Using Cydia, install the following packages

  • SBSettings
  • OpenSSH
  • cURL (Now using wget, so no download needed)
  • BigBossRecommended Tools

3 – Start SSH and get your IP address

Swipe the top of the screen to bring up the SBSettings menu.
Make sure that SSH is started. If you cannot see “SSH”, goto More -> Set Toggles and enable the SSH toggle button.
Read off the “Data IP Address:” (Should be of the form 1.2.3.4)

4 – Check SSH is working

Check you can connect to the phone over ssh (replace the IP with the one you found above):
computer# ssh root@1.2.3.4
The default root password is “alpine”. If you have the default password, change it now, before doing anything else:
iphone# passwd root
Changing password for root.
New password: <type password>
Retype new password: <type password again>

iphone# passwd mobile
Changing password for mobile.
New password: <type another password>
Retype new password: <type another password again>
Now log out of the phone:
iphone# logout

5 – Create the following two files on your computer:

Use your favorite text editor and create the following files (changing the red text to match your account):

dns.sh

#!/bin/sh
LAST_IP=xxx
while (true); do
IP=`ifconfig  pdp_ip0 | grep inet |  cut -d " " -f 2`
if [ "$IP" != "" ]; then
if [ "$IP" != "$LAST_IP" ]; then
RES=`wget -qO - --no-check-certificate --user=username --password=password "https://members.easydns.com/dyn/dyndns.php?hostname=iphone.example.com&myip=${IP}"`
if [ "$RES" == "NOERROR" ]; then
LAST_IP=$IP
fi
fi
fi
sleep 60
done

easydns.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>easydns</string>
<key>OnDemand</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/var/root/dns.sh</string>
</array>
<key>StandardErrorPath</key>
<string>/dev/null</string>
</dict>
</plist>
6 - Copy the files to the phone
computer# scp dns.sh root@1.2.3.4:/var/root/
computer# scp easydns.plist root@1.2.3.4:/Library/LaunchDaemons/

7 – Setup permissions and Launchd item

computer# ssh root@1.2.3.4
iphone# chmod +x dns.sh
iphone# sh -x ./dns.sh
If it runs with no error (it will keep running), you should see (among a lot of debug):
+ RES=NOERROR
Now press control-c to stop it.
Next, load the launch agent to keep the script running in the background (the script needs to stay running so it remembers your last IP and only updates DNS if it changes):
iphone# launchctl load /Library/LaunchDaemons/easydns.plist
This should complete with no output. You can finally check the script is running
iphone# ps -ef |grep dns
0  1886     1   0   0:00.22 ??   0:00.29 /bin/bash /var/root/dns.sh

8 – You’re done

Try connecting to your phone by name:

computer# ssh root@iphone.example.com

Create a free website or blog at WordPress.com.