Save this ruby script at /var/mobile/dyndns/update_ip.rb, (dont forget to chmod it to runable.)
UPDATE: It appears that dyndns gets peeved if you keep updating to the same IP. The code has been patched for it.
#!/usr/bin/env ruby
require 'base64'
host = "example.dyndns.tv"
auth = Base64.encode64('user:password')
timeout = 600
while 1
output = ""
puts "Discovering current IP.."
# current ip resolve from checkip.dyndns.com
IO.popen("telnet checkip.dyndns.com 80", "w+") do |pipe|
output = pipe.readline
puts output
pipe.puts "GET / HTTP/1.1"
pipe.puts "Host: checkip.dyndns.com"
pipe.puts "Connection: close"
pipe.puts ""
pipe.puts ""
puts "SENT ip query.."
output = pipe.readlines.join("");
puts "---------------RESPONSE--------------------"
puts output
puts "--------------- END --------------------"
pipe.close_write
end
if output =~ /.*Current IP Address: ([0-9]+.[0-9]+.[0-9]+.[0-9]+).*/
ip = $1
ip = ip.chomp
puts ""
puts "DETECTED At: " + ip
end
oldip = ""
File.open('currentIP.txt', 'r') do |f|
oldip = f.gets
oldip = oldip.chomp
end
puts "PRIOR At: " + oldip
if oldip == ip
puts "MATCH sleeping..."
else
File.open('currentIP.txt', 'w') do |f|
f.puts ip
end
exit
puts ""
puts "installing new IP..."
#http://login:password@members.dyndns.org/nic/update?hostname=example.dyndns.tv&myip=99.99.99.99
IO.popen("telnet members.dyndns.org 80", "w+") do |pipe|
output = pipe.readline
puts output
pipe.puts "GET /nic/update?hostname=" + host + "&myip=" + ip + " HTTP/1.1"
pipe.puts "Host: members.dyndns.org"
pipe.puts "User-Agent: codeslimjim/1.0 rubyscript/1.0"
pipe.puts "Authorization: Basic " + auth
pipe.puts "Connection: close"
pipe.puts ""
pipe.puts ""
puts "SENT new ip.."
output = pipe.readlines
puts "---------------RESPONSE--------------------"
puts output
puts "--------------- END --------------------"
pipe.close_write
end
end
#timeout for x sec..
sleep timeout
end
Then install the plist daemon
touch /Library/LaunchDaemons/com.dyndns.plist chmod go-wrx /Library/LaunchDaemons/com.dyndns.plist nano /Library/LaunchDaemons/com.dyndns.plist
Paste in the code
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.dyndns</string>
<key>ProgramArguments</key>
<array>
<string>/var/mobile/dyndns/update_ip.rb</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>UserName</key>
<string>mobile</string>
<key>WorkingDirectory</key>
<string>/var/mobile/dyndns</string>
</dict>
</plist>
And boot/load up the daemon and test
launchctl load -w /Library/LaunchDaemons/com.dyndns.plist ps aux | grep dyndns
Remmber if u need to shut it down use
launchctl unload -w /Library/LaunchDaemons/com.dyndns.plist
No comments:
Post a Comment