Seite 1 von 2
modifikation DDNSupdater2.sh
Verfasst: Fr 14. Jun 2013, 22:00
von jensebub
Hallo,
in Anlehnung an den
Thread
habe ich eine leichte Modifikation des Onlineskripts DDNSupdater2.sh gemacht, in der kann man die, für den UPDATER gültige Netzwerkkarte einstellen.
Hallo,
ich habe mir mal das DDNSupdater2.sh angeschaut, dort wird die Globale-IP per "wget-Befehl" bei verschiedenen IP-Responsediensten geholt.
"wget" hat viele optionen, wie man hier sehen kann.
Man könnte vielleicht:
in die Befehle mit einbauen.
Gruß
jensebub
/EDIT: dann könnte man in Z.57 vor "CONFIG - END" die Einzustellende Netzwerkkarte eintragen:
Und dann die folgenden Zeilen:
Code: Alles auswählen
# get current internet ip
CURRENTIP=$(wget -q -O - http://myip.dnsomatic.com)
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q -O - http://my.ip.fi)
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q -O - http://www.myip.ch | grep "IP Address" | cut -d ' ' -f4 | sed -e 's/\$//g' -e 's/\\r//g')
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q -O - http://www.ip-lookup.de | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>')
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q -O - http://checkip.dyndns.org | sed s/[^0-9.]//g)
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q -O - http://checkip.two-dns.de | grep "IP Address" | cut -d ' ' -f4 | sed -e 's/\$//g' -e 's/\\r//g')
fi
durch folgende ersetzen:
Code: Alles auswählen
# get current internet ip
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'` -O - http://myip.dnsomatic.com)
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'` -O - http://my.ip.fi)
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'` -O - http://www.myip.ch | grep "IP Address" | cut -d ' ' -f4 | sed -e 's/\$//g' -e 's/\\r//g')
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'` -O - http://www.ip-lookup.de | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>')
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'` -O - http://checkip.dyndns.org | sed s/[^0-9.]//g)
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'` -O - http://checkip.two-dns.de | grep "IP Address" | cut -d ' ' -f4 | sed -e 's/\$//g' -e 's/\\r//g')
fi
so sollte es funktionieren
Zu erreichen und zu testen unter:
i os mod_DDNSupdater2.sh
Gruß
jensebub
DDNSupdater2 mit zwei Netzwerkkarten
Verfasst: Di 30. Jul 2013, 14:42
von lügnix
in einem anderen Board hatte ich schon mal die Frage gestellt. Wegen DDNSupdater2 mit zwei NIC. Danke "jensebub"
Die abfrage der IP Adresse funktioniert soweit super.
Ich habe in mein Server zwei NIC´s drin. Mit zwei verschiedenen Netzen. Eine VDSL und eine DSL Leitung.
Und über die eth1 soll die IP in NO-IP eingetragen werden.
Vor END Config > ETH="eth1"
ab get current internet ip so geändert.
Code: Alles auswählen
# get current internet ip
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://myip.dnsomatic.com)
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://my.ip.fi)
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://www.myip.ch | grep "IP Address" | cut -d ' ' -f4 | sed -e 's/\$//g' -e 's/\\r//g')
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://www.ip-lookup.de | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>')
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://checkip.dyndns.org | sed s/[^0-9.]//g)
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://checkip.two-dns.de | grep "IP Address" | cut -d ' ' -f4 | sed -e 's/\$//g' -e 's/\\r//g')
fi
So wenn ich auf dem eth0 (Router) hat die IP 87.157.134.134 und eth1 (Router) 84.23.100.100
DDNSupdater2.sh now
Code: Alles auswählen
DDNSHOST: cgew.zapto.org - DYNIP: 87.157.134.134 - CURRENTIP: 84.23.100.100 - answer: cgew.zapto.org:0
erhalte ich in der Console. Wenn ich unter NO-IP Host Managmend sehe dann hat die Adresse die IP 87.157.134.134 wäre also falsch. Habe diese manuell auf 100.100.100.100 gesetzt und DDNSupdater2.sh now neu ausgeführt.
Code: Alles auswählen
DDNSHOST: cgew.zapto.org - DYNIP: 100.100.100.100 - CURRENTIP: 84.23.100.100 - answer: cgew.zapto.org:1
answer:...1 sagt ja das eine neue IP geschrieben worden ist. Normal sollte jetzt die CURRENTIP drin stehen. Aber es steht wieder 87.157.134.134 von eth0 drin.
mal nur den befehl in der Console eingeben eth1 hat die IP 192.168.1.3
Code: Alles auswählen
CURRENTIP=$(wget -q --bind-address=192.168.1.3 -O - http://myip.dnsomatic.com) && echo = $CURRENTIP
erhalte dann 84.23.100.100 > ist richtig.
Also die abfrage klappt richtig. Aber das update nicht. Was läuft da falsch?
Re: modifikation DDNSupdater2.sh
Verfasst: Di 30. Jul 2013, 16:17
von feissmaik
der ausgabe des scripts zufolge:
DDNSHOST: cgew.zapto.org - DYNIP: 87.157.134.134 - CURRENTIP: 84.23.100.100
funktioniert das script.. es ermittelt die korrekte IP 84.23.100.100 von eth1
spontan würde ich vermuten das du das script entweder 2x laufen hast (vllt ist noch eins im hintergrund) oder das updaten ist noch auf einer der beiden router eingerichtet
Re: modifikation DDNSupdater2.sh
Verfasst: Di 30. Jul 2013, 16:33
von lügnix
das konnte ich ausschließen. Habe extra eine test Adresse angelegt, die nur in den Script drin ist.
Und unter htop ist das script nur einmal offen. Unter no-ip.com habe ich gelesen das man die option myip hinzufügen kann.
Habe damit kein Ergebnis erziehlt.
Re: modifikation DDNSupdater2.sh
Verfasst: Di 30. Jul 2013, 16:34
von feissmaik
das ist die einzige erklärung die bleibt - habe es eben ausgiebig getestet und die modífikation funktioniert absolut problemlos
wenn das script keine last erzeugt wird das script auch nicht zwangsläufig unter "htop" zu sehen sein!
prüf das bitte stattdessen vernünftig über ps aux
desweiteren kontrolliere nochmals gründlich ob du nicht vielleicht doch das updaten im Router an hast - oder auf irgendeinem anderen Gerät das Updaten aktiv hast
das script funktioniert wie bereits erwähnt, absolut problemlos - habe es wie bereits erwähnt ausgiebig auf einem system mit 4 Netzwerkkarten bzw IPs getestet und das Script hat stets die korrekte IP geupdated ....
Re: modifikation DDNSupdater2.sh
Verfasst: Di 30. Jul 2013, 16:50
von lügnix
30.07.2013 17:39:09: DDNSHOST: capotest.dynvpn.de - DYNIP: 87.176.145.133 - CURRENTIP: 84.234.234.189 - answer: good 87.176.145.133
Edit: gebe ich bei dem Script eth0 an dann steht bei CURRENTIP: 87.176.145.133 drin also abfragt läuft richtig
habe es mal bei einen anderen Anbieter versucht. Die Adresse ist nur im Script eingetragen. ps aux habe ich geprüft Script ist nur einmal geladen.
jensebub und alx-83: das haben dir mir geschrieben das es funktioniert. Bei der Abfrage kann aber das Problem nicht liegen. Hast du Routing angelegt? damit das funktioniert. Vlt habe ich doch da ein Fehler, denke zwar das alles in Ordnung ist, da der Befehl die richtige IP abfragt.
Re: modifikation DDNSupdater2.sh
Verfasst: Di 30. Jul 2013, 17:05
von feissmaik
nein Ich hab das auf diesem server getestet wo auch das forum drüber läuft - der hat 4 ips
Re: modifikation DDNSupdater2.sh
Verfasst: Di 30. Jul 2013, 17:45
von lügnix
http://www.thomas-krenn.com/de/wiki/Zwe ... nem_System
habe nach der Anleitung die Netzwerkkarten eingerichtet.
Re: modifikation DDNSupdater2.sh
Verfasst: Mi 31. Jul 2013, 09:51
von feissmaik
Das kann ich mir eher weniger vorstellen da wie bereits gesagt der wget Befehl, zum ermitteln der derzeitigen Internet-IP ja problemlos funktioniert, also passt auch das Routing auf selbigen Rechner, sonst würde das ja bereits nicht funktionieren...
Nochmal zusammenfassend:
Auf dem selben Rechner wo auch das Routing verändert/eingestellt wurde, wird DDNSupdater2.sh ausgeführt, oder?
Auf diesem Rechner wird nun DDNSupdater2.sh ausgeführt, der wget Befehl nutzt die 2. Netzwerkkarte (eth1) und verbindet sich zu einer Webseite im Internet um die derzeit aktuelle Internet-IP zu ermitteln..
Angezeigt wird CURRENTIP = 84.23.100.100 und dabei handelt es sich auch wie gewünscht um die aktuelle Internet-IP des 2. Routers der an der 2.Netzwerkkarte angeschlossen ist
Soweit so gut - das Script DDNSupdater2.sh funktioniert also fehlerfrei
Nun passiert es aber leider trotzdem aus bisher unerklärlichen Gründen dass, vermutlich Zeitnah, die Internet-IP des 1.Routers bei DynDNS.org eingetragen wird - und das lässt eigentlich nur den Schluss zu das bei dir im Netzwerk irgendwo noch ein Script oder Programm läuft was eben noch nicht angepasst wurde und vermutlich das Default Gateway, also den 1.Router nutzt
Um das tatsächlich auszuschliesen, würde ich dir einfach mal raten dein Zugangs-Password von DynDNS.org zu ändern und das trägst du dann ausschlieslich in das modifizierte DDNSupdater2.sh ein - aber mach es bitte exakt so, nicht noch nebenbei in irgendeinem Router ebenfals anpassen oder so denn sonst drehen wir uns hier im Kreis!!
Und poste auch bitte den vollständigen CONFIG Abschnitt aus deinem DDNSupdater2.sh
Re: modifikation DDNSupdater2.sh
Verfasst: Mi 31. Jul 2013, 14:02
von lügnix
Passwort geändert. Selbes Fehler.
Ja Routing und Script sind auf dem selben Rechner.
Das Script schreibt ja selbst das es die falsche ip sendet.
Code: Alles auswählen
DDNSHOST: capotest.dynvpn.de - DYNIP: 87.160.130.111 - CURRENTIP: 84.223.147.124 - answer: good 87.170.119.118
das kommt nach wenn ich DDNS now ausführe. answer: good 87.170.119.118 das sagt mir das beim ausführen was falsch läuft. Oder sehe ich das falsch?
Wenn ich im DDNSupdater2.sh ETH='eth1' auf 'eth0' ändere und DDNS now ausführe.
(100.100.100.100 habe ich manuell in two-dns angelegt, damit das script auch die IP anpasst.)
Code: Alles auswählen
DDNSHOST: capotest.dynvpn.de - DYNIP: 100.100.100.100 - CURRENTIP: 87.170.119.118 - answer: good 87.170.119.118
answer: good 87.170.119.118 also richtig da eth0 eingestellt. eth0 hat 87.170.119.118
Code: Alles auswählen
#!/bin/bash
#
# DynamicDNSupdater - supports: DynDNS.org, NO-IP.com, DYNServ.ca and IPActive.de
#
# Es koennen auch verschiedene Dienste genutzt werden um mehrere DNS-Hosts zu nutzen...
#
# Sonderzeichen im Password werden nun auch supported (danke IDDQD)
#
# credits: Didge2002, SnowHead, r00t, rj.2001, IDDQD
#
### CONFIG - START
# Zugangsdaten...
# es koennen mehrere accounts geupdated werden... (rest auskommentieren)
USERNAME["1"]="capotest" # DDNS Benutzername1
PASSWORD["1"]="test1" # DDNS Passwort1
DDNSHOST["1"]="capotest.zapto.org" # DDNS Hostname1
USERNAME["2"]="capotest" # DDNS Benutzername2
PASSWORD["2"]="test1" # DDNS Passwort2
DDNSHOST["2"]="capotest.dynvpn.de" # DDNS Hostname2
#USERNAME["3"]="benutzer3" # DDNS Benutzername3
#PASSWORD["3"]="password3" # DDNS Passwort3
#DDNSHOST["3"]="host3.dyndns.org" # DDNS Hostname3
#
# Provider URL's - pro DDNSHOST muss wie oben ein dazu passendes URL["<zahl>"] angelegt werden!
# (beliebig erweiterbar)
#
# $USERNAME , $PASSWORD , $DDNSHOST werden innerhalb der URL mit %USER% , %PASS% , %HOST% angegeben!
#
URL["2"]="http://%USER%:%PASS%@update.two-dns.de/update?hostname=%HOST%"
URL["1"]="http://dynupdate.no-ip.com/dns?username=%USER%&password=%PASS%&hostname=%HOST%"
URL["3"]="http://%USER%:%PASS%@members.dyndns.org/nic/update?hostname=%HOST%"
#
# BEISPIEL URL's
#
# DynDNS.org: "http://%USER%:%PASS%@members.dyndns.org/nic/update?hostname=%HOST%"
# No-IP.com: "http://dynupdate.no-ip.com/dns?username=%USER%&password=%PASS%&hostname=%HOST%"
# DYNServ.ca: "http://dynserv.ca/dyn/dynengine.cgi?name=%USER%&pass=%PASS%&func=set&domain=%HOST%"
# IPActive.de: "http://logon.ipactive.de/cgi-bin/logon_off.pl?V=2.1&B=%USER%&P=%PASS%&IP=%HOST%&F=1"
# two-dns.de: "http://%USER%:%PASS%@update.two-dns.de/update?hostname=%HOST%"
EVERY="60" # Zeit in Sekunden zwischen den Abfragen
LOG="1" # Erstelle Logfile vom update? [0=nein; 1=ja]
# Verschicke EMail bei Problemen? [no=nein; yes=ja]
# ( benoetigt: apt-get install sendEmail )
EMAIL="yes"
EMAILFROM="a***e"
EMAILTO='D***m'
EMAILSERVER='m***e'
EMAILUSER='a***e'
EMAILPASS='X***1'
ETH='eth1'
### CONFIG - END
# -------------------------------------------------------------- #
# >>> >> > DO NOT MESS WiTH ANYTHiNG BELOW THiS LiNE! < << <<< #
# -------------------------------------------------------------- #
# required system cmd's:
# basename cat cut date echo expr killall ping rm sed sleep wget
Osrcn="DDNSupdater2.sh"
srcn=$(basename $0)
srcv="2.251"
srccfg="config.$Osrcn"
LOGFILE="/var/log/log.$Osrcn"
CHKFILE="/tmp/.$Osrcn"
PiDFILE="/tmp/.pid.$Osrcn"
OnlinePing="google.de"
ProfileSwitchSleep=2
IPCcfgdir="/var/emu/conf"
IPCfunctions="/var/emu/script/functions.sh"
IPCddnssrc="/var/emu/script/$Osrcn"
IPCddnslinkname="ddns"
C="\033[";Ca="${C}0;33m";Cb="${C}1;33m";Cn="${C}0m";ROT="${C}1;31m";GRUEN="${C}1;32m";BOLD="${C}1;37m"
Bo="${C}1m";Bc="${C}21m"; Ro="${C}3m";Rc="${C}23m"; Uo="${C}4m";Uc="${C}24m"
Blo="${C}5m";Blc="${C}25m"; Io="${C}7m";Ic="${C}27m"
## Return Codes
declare -A ReturnCodes
ReturnCodes["good"]="DNS hostname update successful."
ReturnCodes["nochg"]="IP address is current, no update performed."
ReturnCodes["nohost"]="Hostname supplied does not exist under specified account."
ReturnCodes["badauth"]="Invalid username password combination."
ReturnCodes["badagent"]="The user agent was not sent or HTTP method is not permitted (we recommend use of GET request method)."
ReturnCodes["!donator"]="An option available only to credited users (such as offline URL) was specified, but the user is not a credited user."
ReturnCodes["abuse"]="The hostname specified is blocked for update abuse."
ReturnCodes["911"]="A fatal error on our side such as a database outage. Retry the update no sooner 30 minutes."
ReturnCodes["notfqdn"]="The hostname specified is not a fully-qualified domain name (not in the form hostname.dyndns.org or domain.com)."
ReturnCodes["0"]="IP address is current, no update performed."
ReturnCodes["1"]="Update successful."
ReturnCodes["2"]="Hostname supplied does not exist under specified account."
ReturnCodes["3"]="Invalid password."
ReturnCodes["4"]="Invalid username."
function AddonInstalled () {
[ -f "/var/emu/conf/addons.info" ] && echo "ok" > /tmp/.AddonInstalled_$(basename $0)
}
function remove_addon () {
#onlinescript als addon entfernen
if [ -f "/var/emu/conf/addons.info" ]; then
Anum=$(sed -ne "/^$(basename $0).*/=" /var/emu/conf/addons.info)
[ ! -z "$Anum" ] && sed -i -e "$Anum d" /var/emu/conf/addons.info
fi
}
if [ -f "$IPCfunctions" -a ! -f "/sbin/$IPCddnslinkname" ]; then
echo ".. $srcn v$srcv .."
echo "Erstbenutzung dieses Scripts? IPC erkannt... kopiere Script $srcn..."
cp -f $0 $IPCddnssrc ; chmod 755 $IPCddnssrc >/dev/null 2>&1
echo -e "\nErstelle Symlink fuer ${Ro}$IPCddnslinkname${Rc} auf $IPCddnssrc"
ln -sf $IPCddnssrc /sbin/$IPCddnslinkname
echo -e "Nun muss noch der ${Ro}CONFIG${Rc} Abschnitt in dem Script $srcn angepasst werden!"
sleep 3
nano -R $IPCddnssrc
#[ ! -f "$IPCcfgdir/$srccfg" ] && proc_Create_Script_CFG "$IPCcfgdir/$srccfg"
echo -e "Fertig! Das Script kann kuenftig ueber den Befehl ${Ro}$IPCddnslinkname${Rc} ausgefuehrt werden"
AddonInstalled
$IPCddnssrc help
exit
fi
# load script config?
[ -d "$IPCcfgdir" -a -f "$IPCcfgdir/$srccfg" ] && source $IPCcfgdir/$srccfg
[ ! -d "$IPCcfgdir" -a -f "$srccfg" ] && source $srccfg
# Verschicke EMail..
function send_EMail() {
MESSAGE=$1
SUBJECT="$Osrcn"
if [ $EMAIL = "yes" -o $EMAIL = "1" ]; then
echo "Verschicke EMail.."
sendEmail -f $EMAILFROM -t $EMAILTO -u "$SUBJECT" -m "$MESSAGE" -s $EMAILSERVER -xu "$EMAILUSER" -xp "$EMAILPASS"
fi
}
# Simple URL encoding
function proc_url_encode() {
out=${1//%/%25}; out=${out//\{/%7B}; out=${out//\}/%7D}; out=${out//|/%7C};
out=${out//\\/%5C}; out=${out//^/%5E}; out=${out//~/%7E}; out=${out//[/%5B};
out=${out//]/%5D}; out=${out//\`/%60}; out=${out//#/%23}; out=${out//>/%3E};
out=${out//\$/%24}; out=${out//&/%26}; out=${out//+/%2B}; out=${out//,/%2C};
out=${out//\//%2F}; out=${out//:/%3A}; out=${out//;/%3B}; out=${out//=/%3B};
out=${out//\?/%3F}; out=${out// /%20}; out=${out//</%3C};
out=${out//\!/%21}; out=${out//\"/%22}; out=${out//\@/%40}; out=${out//\'/%27};
out=${out//\(/%28}; out=${out//\)/%29}; out=${out//\*/%2A}; out=${out//\-/%2D};
out=${out//\_/%5F}; out=${out//\./%2E}; out=${out//\€/%80};
echo $out
}
function LOG_msg() {
message=$1
if [ $LOG = "1" ]; then
_DT=$(date +"%d.%m.%Y %H:%M:%S")
echo "$_DT: $message" >> $LOGFILE
fi
}
function ReturnCode () {
for index in ${!ReturnCodes[*]}; do
[ "$index" == "$1" ] && echo "${ReturnCodes[$1]}" && break
done
}
function abuse_check() {
index=$1
answer=$(cat ${CHKFILE}_answer_$index)
MSG=""
if [ "$answer" = "abuse" ]; then
MSG="WARNING!! You abused the DNS update function! You must Unlock your hostname: ${DDNSHOST[$index]} !"
fi
[ "$answer" = "nohost" ] && MSG="ERROR: Unknown host ${DDNSHOST[$index]} !"
[ "$answer" = "badauth" ] && MSG="ERROR: Bad auth! Check USERNAME and PASSWORD setting for ${DDNSHOST[$index]} !"
if [ ! -z "$MSG" ]; then
echo "$MSG"
LOG_msg "$MSG"
send_EMail "$MSG"
fi
}
function get_IPs() {
CURRENTIP=""
# get current internet ip
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://myip.dnsomatic.com)
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://my.ip.fi)
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://www.myip.ch | grep "IP Address" | cut -d ' ' -f4 | sed -e 's/\$//g' -e 's/\\r//g')
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://www.ip-lookup.de | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>')
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://checkip.dyndns.org | sed s/[^0-9.]//g)
fi
if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
CURRENTIP=$(wget -q --bind-address=`ifconfig "$ETH" | grep 'inet Adresse:' | cut -d: -f2 | awk '{print $1}'` -O - http://checkip.two-dns.de | grep "IP Address" | cut -d ' ' -f4 | sed -e 's/\$//g' -e 's/\\r//g')
fi
if [ -z "$CURRENTIP" ]; then
eRROR["0"]="Cant get current internet ip"
else
# get current dyndns ip
for index in ${!DDNSHOST[*]}; do
#DYNIP[$index]=$(nslookup ${DDNSHOST[$index]} | tail -n2 | grep A | sed s/[^0-9.]//g)
DYNIP[$index]=$(ping -c1 "${DDNSHOST[$index]}" | sed -n 1p | sed -e 's/(//g' -e 's/)//g' | cut -d " " -f3 | sed -e 's/\://g')
[ -z "${DYNIP[$index]}" ] && eRROR[$index]="Cant get IP of DDNSHOST: ${DDNSHOST[$index]}"
done
fi
}
# answer return codes: 1=ip.updated ; 3=wrong.pwd ; 4=wrong.username
function do_update() {
index=$1
# Replace %USER% , %PASS% , %HOST%
URL=${URL[$index]}
URL=${URL//%USER%/`proc_url_encode "${USERNAME[$index]}"`}
URL=${URL//%PASS%/`proc_url_encode "${PASSWORD[$index]}"`}
URL=${URL//%HOST%/${DDNSHOST[$index]}}
wget -q -O ${CHKFILE}_answer_$index $URL
answer=$(cat ${CHKFILE}_answer_$index)
echo "DDNSHOST: ${DDNSHOST[$index]} - DYNIP: ${DYNIP[$index]} - CURRENTIP: $CURRENTIP - answer: $answer"
LOG_msg "DDNSHOST: ${DDNSHOST[$index]} - DYNIP: ${DYNIP[$index]} - CURRENTIP: $CURRENTIP - answer: $answer"
}
# fuer jedes "profil" (DDNSHOST) die jeweilige "action" abarbeiten (function-names)
function check_profils() {
ACTION=$1
eRROR=""
get_IPs
for index in ${!DDNSHOST[*]}; do
if [ -z "$eRROR" ]; then
# for each $ACTION...
if [ ! -z "$ACTION" ]; then
for actionfunction in $ACTION; do
$actionfunction "$index"
done
fi
fi
sleep $ProfileSwitchSleep
done
[ ! -z "$eRROR" ] && for Eidx in ${!eRROR[*]}; do echo "${eRROR[$Eidx]}"; done
}
function update_interval() {
PiDs="$$ $!"
echo $PiDs > $PiDFILE
echo "Running Script in Background with PID(s): $PiDs"
while true; do
[ ! -f "$PiDFILE" ] && echo "$srcn: Interval stopped" && break
# check if online...
ONLINE=0
[ "$(ping -c1 "$OnlinePing" | grep -c "seq")" -eq 1 ] && ONLINE=1
# if online, check each DDNSHOST (array)...
if [ "$ONLINE" ]; then
get_IPs
for index in ${!DDNSHOST[*]}; do
[ "${DYNIP[$index]}" != "$CURRENTIP" ] && do_update "$index" && abuse_check "$index"
done
fi
if [ ! -z "$eRROR" ]; then
Error=""
for Eidx in ${!eRROR[*]}; do
Error="$Error ${eRROR[$Eidx]}\n"
done
echo -e "$Error" && LOG_msg "$Error" && send_EMail "$Error"
eRROR=""
fi
sleep $EVERY
done
}
function show_status() {
get_IPs
for index in ${!DDNSHOST[*]}; do
if [ "${DYNIP[$index]}" != "$CURRENTIP" ]; then
echo "The IP of ${DDNSHOST[$index]} (${DYNIP[$index]}) does NOT match your current Internet-IP: $CURRENTIP"
echo "You should update immediately! (with: $0 now)"
else
echo "Your host ${DDNSHOST[$index]} with IP ${DYNIP[$index]} is still up to date: $CURRENTIP"
if [ -f "${CHKFILE}_answer_$index" ]; then
answer=$(cat ${CHKFILE}_answer_$index)
echo -e "Last Answer was: $answer \t $(ReturnCode "$(echo $answer|sed -e s/.*://)")"
fi
fi
echo " "
done
[ -f "$PiDFILE" ] && echo "Script seems to run in background with PID(s): $(cat $PiDFILE)"
}
function kill_script() {
counter="5"
[ -f "$PiDFILE" ] && PID=$(cat $PiDFILE)
#[ -z "$PID" ] && PID="$$ $!"
if [ ! -z "$PID" ]; then
echo "PID(s): $PID"
echo -n "Stopping Script"
if ( kill -TERM $PID 2> /dev/null ); then
c=1
while [ "$c" -le 300 ]; do
if ( kill -0 $PID 2> /dev/null ); then
echo -n "."
sleep 1
else
break
fi
c=$((++c))
done
fi
if ( kill -0 $PID 2> /dev/null ); then
echo -e "\rScript is not shutting down cleanly - killing"
kill -KILL $PID
else
echo " done"
fi
#for P in $PID; do
# kill -9 $P >/dev/null 2>&1
# echo "Killed PID $P"
#done
killall -9 $IPCddnslinkname $srcn >/dev/null 2>&1
else
echo "Nothing to $1!"
fi
rm -f $PiDFILE
}
function echo_PIDs() {
[ -f "$PiDFILE" ] && PID=$(cat $PiDFILE)
[ -z "$PID" ] && PID="$$ $!"
if [ -z "$PID" ]; then
echo "Seems script isnt running in background"
else
echo "Scripts currently ProcessIDs: $PID"
fi
}
if [ -f "$IPCfunctions" -a -f "$IPCddnssrc" ]; then
linkname=$IPCddnslinkname
else
linkname=$0
fi
case "$1" in
"")
update_interval &
;;
[aA][uU][tT][oO]|[sS][tT][aA][rR][tT])
bash $0 & >/dev/null 2>&1
;;
[kK][iI][lL][lL]|[sS][tT][oO][pP])
kill_script $1
;;
[nN][oO][wW])
check_profils "do_update abuse_check"
;;
[pP][iI][dD]*)
echo_PIDs
;;
[sS][tT][aA][tT][uU][sS])
show_status
;;
[hH][eE][lL][pP]|[hH][iI][lL][fF][eE]|?)
echo "Usage: $linkname [now|auto|kill|status|pid|help]"
echo "$linkname now -> Force to update DDNSHOST immediately (erzwinge sofortiges updaten von DDNSHOST)"
echo "$linkname auto -> Checks/updates DDNSHOST every $EVERY seconds (Ueberprueft/updated DDNSHOST alle $EVERY Sekunden)"
echo "$linkname kill -> Kills running script (Script wird beendet)"
echo "$linkname status -> Show current DDNSHOSTs status (Zeigt den aktuellen Status, ob ein update noetig ist)"
echo "$linkname pid -> Show Process IDs (Zeigt die verwendeten ProzessIDs dieses Scripts)"
echo "$linkname deinstall -> Deinstalls Script (Deinstalliert das Script)"
echo "$linkname help -> This help... (Zeigt diese Hilfe...)"
;;
[dD][eE][iI][nN][sS]*)
kill_script $1
rm -f $IPCddnssrc /sbin/$IPCddnslinkname
remove_addon
echo "Script deinstalled!"
;;
*)
echo "Usage: $linkname [now|auto|kill|status|pid|help]"
;;
esac
exit 0