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

Advertisements

2010-04-24 (Sat)

csshX 0.71 (and 0.65) released

Filed under: Hacks,MacOS X,Perl,Software — Gavin Brock @ 12:49 pm
Tags:

For Earth Day – the ecological carbon-free release ;-)

Two new versions of csshX are now available!!

As you may remember, I ran into problems with the release of 64bit Snow Leopard. This was due to Apple dropping carbon support in 64bit perl. The work-around at the time was to run the program using 32bit perl. Obviously this was not the long-term solution.

To control Terminal.app, instead of using the, carbon based, MacPerl module to call the Applescript, the advice was to use the NSAppleScript cocoa class through the PerlObjCBridge perl module. Although this worked great for calling scripts, getting the return value from scripts was extremely messy (NSAppleScript seems only half finished). I then had a look at the ScriptingBridge SBApplication class. This gives me an Objective-C like interface to applescript (although it is much more deceptive than it looks). This was much more suitable and so csshX was changed to use it*.

The downside of this is that 10.4 does not support the ScriptingBridge and so any legacy 10.4 user out there (are there any?) will be stuck on csshX 0.65 forever (0.65 is just a minor bug-fix release to 0.64).

The new csshX 0.70 is a major rewrite of the Terminal.app handling. This appears to make things a lot more responsive, but of course, it may have introduced other bugs. One major benefit is that I can now reliably get handles back for the windows created – this means no more race conditions if you click on any Terminal window while csshX is starting.

Other new features (as way of a bribe to get you to try this) are:

  • Growl messages for certain events. This is experimental, so please let me know if you would like more information, or if it’s too annoying (see the man page for how to disable it).
  • –ssh command line switch to specify the ssh command (handy if you have some wrapper script).
  • Keyboard cursor based move/resize in the bounds-setting mode (in case you hate reaching for the mouse).

You can grab the packages here:

As usual feedback, especially bug reports, are greatly appreciated.

csshX now on Twitter!

Follow brockgr on Twitter

* Nearly.. there is a bug introduced in 10.6 PerlObjCBridge that prevents it calling functions that return boolean values (quite common in Applescript). A bug report has been opened with Apple. In the interim, some of the ScriptingBridge calls are actually being substituted with NSAppleScript ones.

Create a free website or blog at WordPress.com.