[Info] DynDNS als Shell-Skript aktualisieren!

risaer

Neuer User
Mitglied seit
25 Apr 2005
Beiträge
169
Punkte für Reaktionen
0
Punkte
16
Mein ursprüngliches Ziel war es, eine Dynorg-Adresse meiner Box im ATA-Mode aktuell zu halten. Leider hat die FBF das selbst nicht unterstützt. Ob sie dies nun tut weiss ich nicht. Inzwischen habe ich das Skript etwas weiterentwickelt und es läuft seit langem stabil. Bis Dynorg irgendetwas geändert hat und nur noch ein "good 127.0.0.1" zurückgegeben hat. Die Korrektur nehme ich als Anlass, das Skript noch einmal zu posten. Das wget-binary hab ich aus einer alten Fritzload-Installation genutzt. Da sollte aber auch jede andere FBF-taugliche version klappen.

Features:
  • funktioniert auch im ATA/Client-Mode
  • unterstützt beliebig viele Accounts / Domains
  • funktioniert theoretisch auch ohne freetz (Rückmeldung erbeten)
  • Aktualisierungseinträge auf AVM-Webif

getestet mit: FBF 7170, 7270

Voraussetzungen:
Bei mir liegen die wget binary, die Config-files und das script selbst auf meinem USB-Stick (/var/freetz/...).
Durch den Autoruneintrag mit freetz werden u.a. die Aktualisierungsskripte gestartet. Dies kann natürlich auch über die debug.cfg o.ä. passieren.

Hier starte ich das Update (Pfade anpassen) mit:
Code:
/var/freetz/bin/dynorg_update.sh -c /var/freetz/etc/ddns.beispiel.dnsalias.com.conf &
genauso werden dann weitere Accounts bedient.

Wer nur einen Account hat kann auch ohne conf-file direkt die Daten im Skript eintragen (wenn ich das recht erinnere ;-) )

config-file, z.B. "ddns.beispiel.dnsalias.com.conf":
Code:
u_name=ddnsuser
u_pass=ddnspass
ddns_url=beispiel.dnsalias.com
update_interval=60

"dynorg_update.sh"
Code:
#!/bin/sh
################################
# Updates dyndns.com
# (c) HHAW Risaer - GPL
# V.1.1
################################

#config
config_file=/var/freetz/etc/ddns.conf

#put your wget binary here - just "wget" if exists otherwise with path if you use an external binary
wget_file=/var/freetz/bin/wget
update_interval=60

##Use these parameters if you do not want to use one or more config files:
#u_name=name
#u_pass=password
#ddns_url=beispiel.dnsalias.com
#update_interval=60

################################
showHelp(){
################################
	echo Parameter:
	echo "$0 [--help ]| [-c configfilename]"
	echo --help, -h: This help
	echo configfilename: file containing options, if no config file is given, $config_file is assumed
}



################################
getExternalIp(){
################################
	externalIp=$($wget_file -q -O - http://checkip.dyndns.com|sed -n "s/.*: //;s/<.*//;p")
}




################################
logDebugEvent(){
################################
# zur Fehlersuche
#       
	echo `date` "$*" >> /var/tmp/ddns_ddns_url.log
	echo `date` "$*"

	#dummy, falls  echo auskommentiert:
	#sleep 1&
}




################################
logEvent(){
################################
	logDebugEvent "$*"
	eventadd 1 "$*"
}



################################
doOnUpdate() {
################################
    logEvent "neue externe IP-Adresse: $new_ip"
	logDebugEvent  "current_ip: -$current_ip- -> updating"
	#restart VOIP daemon
	voipd -R
	
	## Put here whatever else you want to do ....

	#prepare DDNS-adress -update
	secret_url="http://$u_name:[email protected]/nic/update?hostname=$ddns_url&myip=$new_ip"
	secret_url_log="http://$u_name:[email protected]/nic/update?hostname=$ddns_url&myip=$new_ip"
	logDebugEvent $secret_url_log

	#execute update request  
	ddns_result="$($wget_file --user-agent=wget -q -O - $secret_url)"
	logEvent "Update $ddns_url Result DDNS: $ddns_result"

	#check result
	if [ "$ddns_result" != "good $new_ip" ] ; then
		# if error occured:
		logEvent "Update DDNS failed: next try in 60 min -> http://www.dyndns.com/developers/specs/return.html"
		logEvent `date` FAILED: $ddns_result
		logEvent waiting for 60mins
		sleep 3600
	fi
	#sleep 60
	return
}


################################
getDdnsIp(){
################################
	ddnsIp=`ping -c 1 -s 1 -w 1 $ddns_url|sed -n "s/).*//;s/.*(//p"`
#	ddnsIp=`get_ip --all`
}


################################
# MAIN
################################



#echo $# Parameter
#echo Using '"$@"': $@;
#for p in "$@";
#do
#	echo "[$p]";
#	echo ${#p}
	
	p="$1"
	case "$p" in
		"-c")
			config_file="$2"
		;;
			
		"--help") showHelp; exit ;;
		"-h") showHelp; exit;;
		*) showHelp; exit 1;;
	esac		
#done

#
if  [ ! -e $config_file ]; then 
	echo $config_file does not exist
	exit 1
fi

u_name=`cat ${config_file}|grep u_name|sed -n "s/u_name=//;p"`
u_pass=`cat ${config_file}|grep u_pass|sed -n "s/u_pass=//;p"`
ddns_url=`cat ${config_file}|grep ddns_url|sed -n "s/ddns_url=//;p"`
update_interval=`cat ${config_file}|grep update_interval|sed -n "s/update_interval=//;p"`

if  [ "${u_name}" == "" ]; then echo "u_name is empty"; exit 2; fi;
if  [ "${u_pass}" == "" ]; then echo "u_pass is empty"; exit 2; fi;
if  [ "${ddns_url}" == "" ]; then echo "ddns_url is empty"; exit 2; fi;



###

logDebugEvent 
logDebugEvent "###########################################"
logDebugEvent DDNS "for $ddns_url"
logDebugEvent PID: $$
logDebugEvent "###########################################"

sleep 5
{
        while true; do
	        #get current ddns-ip
			getDdnsIp
			current_ip=$ddnsIp
			#new_ip="$($wget_file -q -O - $update_ip)"
	        new_ip="$(get_ip --all)"
	        
			#error while fetching ips?
			if [[ "$current_ip" = "" || "$new_ip" = "" ]]; then
				#nix			
				#correct execution
				logDebugEvent WARNING "current_ip: -$current_ip-       new_ip: -$new_ip-"
			else
				#logDebugEvent "current_ip: -$current_ip-       new_ip: -$new_ip-"
				#update needed?
				if [ "$current_ip" != "$new_ip" ] ; then
					doOnUpdate
				fi
			fi
			sleep $update_interval
        done
}
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
244,883
Beiträge
2,220,096
Mitglieder
371,611
Neuestes Mitglied
Mandylion73
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.