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:

Code: Alles auswählen

‘--bind-address=ADDRESS’
in die Befehle mit einbauen.

Gruß
jensebub

/EDIT: dann könnte man in Z.57 vor "CONFIG - END" die Einzustellende Netzwerkkarte eintragen:

Code: Alles auswählen

#Netzwerkkarte
ETH='eth0'
Und dann die folgenden Zeilen:
Spoiler
Show

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:
Spoiler
Show

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.
Spoiler
Show

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

Spoiler
Show

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&#41;
    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&#41;
    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