1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Talk DDNSupdater2.sh einrichten

Dieses Thema im Forum "Alles rund um Dyndns" wurde erstellt von starturk, 8. September 2012.

  1. starturk
    Offline

    starturk Super Elite User

    Registriert:
    30. Juni 2011
    Beiträge:
    2.547
    Zustimmungen:
    177
    Punkte für Erfolge:
    63
    Hallo

    Ist das jetzt so richtig eingestellt wen man dyndns.com benutzt?

    #!/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"]="Mein Benutzer Name" # DDNS Benutzername1
    PASSWORD["1"]="Mein Passwort" # DDNS Passwort1
    DDNSHOST["1"]="Dyndns Adresse" # DDNS Hostname1


    USERNAME["2"]="benutzer2" # DDNS Benutzername2
    PASSWORD["2"]="password2" # DDNS Passwort2
    DDNSHOST["2"]="host2.zapto.org" # 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["1"]="http://%USER%:%PASS%@members.dyndns.org/nic/update?hostname=%HOST%"
    URL["2"]="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="300" # Zeit in Sekunden zwischen den Abfragen
    LOG="0" # Erstelle Logfile vom update? [0=nein; 1=ja]


    # Verschicke EMail bei Problemen? [no=nein; yes=ja]
    # ( benoetigt: apt-get install sendEmail )
    EMAIL="no"
    EMAILFROM="`hostname`@fqdn.net"
    EMAILTO='admin@fqdn.net'
    EMAILSERVER='mail.fqdn.net'
    EMAILUSER=''
    EMAILPASS=''




    ### 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.25"
    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 () {
    [ ! -z "$AddOnInfos" ] && echo "ok" > /tmp/.AddonInstalled_$(basename $0)
    }


    function remove_addon () {
    #onlinescript als addon entfernen
    if [ ! -z "$AddOnInfos" ]&&[ -f "$AddOnInfos" ]; then
    Anum=$(sed -ne "/^$(basename $0).*/=" $AddOnInfos)
    [ ! -z "$Anum" ] && sed -i -e "$Anum d" $AddOnInfos
    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 -O -

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?

    )
    if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
    CURRENTIP=$(wget -q -O -

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?

    )
    fi
    if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
    CURRENTIP=$(wget -q -O -

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?

    | 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 -

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?

    | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>')
    fi
    if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
    CURRENTIP=$(wget -q -O -

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?

    | sed s/[^0-9.]//g)
    fi
    if [ -z "$CURRENTIP" -o "$CURRENTIP" = " *" -o "$CURRENTIP" = "*1.0 *" ]; then
    CURRENTIP=$(wget -q -O -

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?

    | 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]*)
    rm -f $IPCddnssrc /sbin/$IPCddnslinkname
    remove_addon
    echo "Script deinstalled!"
    ;;
    *)
    echo "Usage: $linkname [now|auto|kill|status|pid|help]"
    ;;
    esac


    exit 0
     
    #1
  2. phantom

    Nervigen User Advertisement

  3. aragorn
    Online

    aragorn Guest

    AW: DDNSupdater2.sh einrichten

    1) wieso fragst du nicht in dem board nach von dem das script stammt? da ist nämlich auch beschrieben wie das eingestellt werden sollte..
    2) du brauchst nicht das komplette script posten da du ja nur wissen willst ob es richtig eingestellt wurde..
    3) wenn du nur ein profil nutzt wieso lässt du die anderen dann einkommentiert?

    wer lesen kann ist? im vorteil!!


    (immer wieder das selbe mit dir..)
     
    #2

Diese Seite empfehlen