Detta är pågående arbete och under testning, kan komma att ändras
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
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 |