Skript för att uppdatera DNS entries med ny IP Publicerat 24 januari, 2021 av orjan Detta är pågående arbete och under testning, kan komma att ändras waittime="0" ZONENAME="example.com" LOGFILE="/home/yourusername/update-local-dns-with-public-ip.log" #PATH TO LOGFILE [ ! -f "$LOGFILE" ] && touch "$LOGFILE" #CREATE LOGFILE IF NOT EXIST TIMESPAMP=$(date +'%Y-%m-%d %H:%M:%S') SCRIPTEVAL=true if [ "$SCRIPTEVAL" == true ] then ZONEFILE="/home/yourusername/example.com.hosts" #WE USE THIS FILE WHILE EVALUATING SCRIPT FUNCTION else ZONEFILE="/var/lib/bind/example.com.hosts" #THIS IS PRODUCTION ZONE FILE fi if [ "$SCRIPTEVAL" == true ] ;then echo "$ZONEFILE";fi while true do #EXTRACT CURRENT PUBLIC IP MYPUBLICIP=$(dig +short myip.opendns.com @resolver1.opendns.com) # EXTRACT CURRENT REGISTRED IP FOR MAIL ENTRY # THIS WILL SUFFICE SINCE IF THIS DIFFERS FROM CURRENT PUBLIC IP WE WILL THEN REPLACE ALL OCCURENSES OF THIS # SINCE THIS SCRIPT IS MADE FOR HOME AND THERE IS ONLY ONE PUBLIC IP WE CAN PUBLISH TO # MYMXIP=$(dig @localhost. mail.example.com +noall +answer | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}") MYMXIP=$(grep "^mail.example.com." "$ZONEFILE" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}") # COMPARE CURRENT REGISTRED IP WITH CURRENT PUBLIC IP if [ "$MYPUBLICIP" != "$MYMXIP" ] then NEWSERIALDATEPART=$(date +%Y%m%d) # GENERATE DATEPART OF NEW SERIAL NUMBER NEWSERIALSTART=$(echo $NEWSERIALDATEPART"01") # GENERATE AN INITIAL NEW SERIAL KEY NEWSERIALCOUNTPART=$(grep -o -P "\d{2}$" <<< $NEWSERIALSTART) # EXTRACT THE COUNT PART FROM SERIAL NUMBER NEWSERIALCOUNTPART=$(expr $NEWSERIALCOUNTPART + 0) # THIS CONVERTS STRING TO NUMBER OLDSERIAL=$(grep -o -w -P '(?<!\d)\d{10}(?!\d)' $ZONEFILE) # EXTRACT CURRENT (OLD) SERIAL NUMBER OLDSERIALDATEPART=$(grep -o -P "(^\d{8})" <<< $OLDSERIAL) # EXTRACT DATEPART FROM OLD SERIAL NUMBER OLDSERIALCOUNTPART=$(grep -o -P "\d{2}$" <<< $OLDSERIAL) # EXTRACT THE COUNT PART FROM OLD SERIAL NUMBER OLDSERIALCOUNTPART=$(expr $OLDSERIALCOUNTPART + 0) # THIS CONVERTS FROM STRING TO NUMBER if [ $OLDSERIALDATEPART -lt $NEWSERIALDATEPART ] then if [ "$SCRIPTEVAL" == true ] ;then echo "Old date is less than new date";fi NEWSERIAL=$NEWSERIALSTART fi if [ "$OLDSERIALDATEPART" == "$NEWSERIALDATEPART" ] then if [ "$SCRIPTEVAL" == true ] ;then echo "Old date is equal to new date";fi while [ $OLDSERIALCOUNTPART -ge $NEWSERIALCOUNTPART ] do if [ $NEWSERIALCOUNTPART -lt 10 ] then NEWSERIALCOUNTPART="0"$(expr $NEWSERIALCOUNTPART + 1) # ADD 1 TO COUNT else NEWSERIALCOUNTPART=$(expr $NEWSERIALCOUNTPART + 1) # ADD 1 TO COUNT fi done if [ "$SCRIPTEVAL" == true ] ;then echo "Old serial: "$OLDSERIAL" New Serial: "$NEWSERIALDATEPART""$NEWSERIALCOUNTPART;fi if [ "$SCRIPTEVAL" == true ] ;then echo "Old count: "$OLDSERIALCOUNTPART" New count: "$NEWSERIALCOUNTPART;fi NEWSERIAL=$NEWSERIALDATEPART$NEWSERIALCOUNTPART if [ "$SCRIPTEVAL" == true ] ;then echo $NEWSERIAL;fi fi # sed -i "s/20[0-9][0-9]\{7\}/$NEWSERIAL/g" "$ZONEFILE" sed -i "s/[0-9]\{10\}/$NEWSERIAL/g" "$ZONEFILE" sed -i "s/$MYMXIP/$MYPUBLICIP/g" "$ZONEFILE" # rndc reload $ZONENAME echo $(date +'%Y-%m-%d %H:%M:%S')": old IP $MYMXIP replaced with new IP $MYPUBLICIP" >> "$LOGFILE" else echo $(date +'%Y-%m-%d %H:%M:%S')": no update needed" >> "$LOGFILE" fi if [ "$SCRIPTEVAL" == true ] ;then cat $ZONEFILE;fi STR="Sleeping $waittime" echo $STR if [ "$waittime" == "0" ] then break else sleep "$waittime" fi done