#!/bin/bash
# yandex dynDNS ver.3
##################################################
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
#PDDтокены получены
https://pddimp.yandex.ru/api2/admin/get_tokenTOKEN1=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # x-site1
TOKEN2=BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB # site2
TOKEN3=TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT # site3
TOKEN4=PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP # site4
#список доменов
DOMEN1="x-site1" #он же - контрольный домен
DOMEN2="site2"
DOMEN3="site3"
DOMEN4="site4"
#сабдомены
SUB="@"
SUBWWW="www"
SUBDKIM="mail._domainkey"
#
# id DNS записей в yandex API
RECID1=11111111 # @<---> x-site1
RECID2=22222222 # www<-> x-site1
#
RECID3=33333333 # @<--->site2
RECID4=44444444 # www<->site2
RECID5=55555555 # @<--->site2 TXT spf
#
RECID6=66666666 # @<--->site3
RECID7=77777777 # www<->site3
#
RECID8=88888888 # @<--->site4
RECID9=99999999 # www<->site4
#
yaipfile="/tmp/yaip" #файл с нашим IP из DNS записей yandex
ipnowfile="/tmp/ipnow" #временный файл с IP WAN интерфейса роутера
IPfield='\b[1-9]{1,3}(\.[0-9]{1,3}){3}\b' #регулярное выражение, шаблон ip-адреса начиная с 1.0.0.0
#
#далее объявление функции получения адреса контрольного домена с сервера DNS с контролем IP по шаблону
#
dnsgetaddr ()
{
YAIP="$(host $DOMEN1 dns1.yandex.ru 2>&1 | grep has | awk '{print $4}')"
if ! [[ $YAIP =~ $IPfield ]]; then
echo "$(date +%x-%X) не удалось получить ip-адрес домена $DOMEN1"
exit 0
fi
echo -n $YAIP > $yaipfile
}
#
stty 500:1:cbd:8a33:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 -F /dev/ttyS0 #установка параметров com-порта к которому подключен роутер
echo > /dev/ttyS0 #отправляем перевод строки, и ждем секунду. Иначе сразу после загрузки роутера в строке символ
# "ромб" остается, и подставляясь в начало команды ниже, ломает запрос. столкнулся с таким глюком, пришлось обойти...
sleep 1
echo "show Address IP4Address InterfaceAddresses/wan_ip" >/dev/ttyS0 #отправка команды роутеру через com-порт. гугли CLI для Dlink dfl-210
(echo -n "$(grep -m 1 -oE $IPfield /dev/ttyS0)" > $ipnowfile)& #слушаем com-порт, отсеиваем наш IP и пишем его в временный файл, все это в дочернем процессе
sleep 3 # ждем 3 секунды, т.к. на 9600 бод обмен идет медленно
if ! [[ -s $ipnowfile ]]; then #если за это время файл не образовался, значит com-порт в отвале ...видимо что-то случилось... Галыгин, цитата.
echo "$(date +%x-%X) не удалось подключиться к роутеру, проверьте com-порт подключение"
kill $! #убиваем дочерний процесс
exit 0 #сваливаем потому как не сработало
else IPNOW="$(cat $ipnowfile)" #продолжаем, если ipnowfile образовался
rm $ipnowfile
fi
if [[ -w $yaipfile ]]; then #проверка существует файла yaip, и права записи.
fileage=$(($(date +%s)-$(date -d "$(ls $yaipfile --full-time |awk '{print $6 OFS $7}')" +%s))) #вычисляем возраст файла в секундах с момента создания
if (($fileage > 86400)); then # и ЕСЛИ возраст больше суток
dnsgetaddr
echo "$(date +%x-%X) файл $yaipfile обновлен"
else YAIP="$(cat $yaipfile)" #если файл не старый то берем YAIP из файла
fi
else #а ЕСЛИ файл вообще не существует...
dnsgetaddr
echo "$(date +%x-%X) файл $yaipfile создан"
fi
#
if [[ $IPNOW != $YAIP ]]; then #ЕСЛИ внешний IP роутера равен адресу контрольного домена ТО правим наши DNS записи:
curl -H "PddToken: $TOKEN1" -d "domain=$DOMEN1&record_id=$RECID1&subdomain=$SUB&ttl=21600&content=$IPNOW" '
https://pddimp.yandex.ru/api2/admin/dns/edit'
curl -H "PddToken: $TOKEN1" -d "domain=$DOMEN1&record_id=$RECID2&subdomain=$SUBWWW&ttl=21600&content=$IPNOW" '
https://pddimp.yandex.ru/api2/admin/dns/edit'
#
curl -H "PddToken: $TOKEN2" -d "domain=$DOMEN2&record_id=$RECID3&subdomain=$SUB&ttl=21600&content=$IPNOW" '
https://pddimp.yandex.ru/api2/admin/dns/edit'
curl -H "PddToken: $TOKEN2" -d "domain=$DOMEN2&record_id=$RECID4&subdomain=$SUBWWW&ttl=21600&content=$IPNOW" '
https://pddimp.yandex.ru/api2/admin/dns/edit'
#далее обновление записи _spf c добавлением YAIP в адреса разрешенные для отправки почты
#%2b это в URL код знака плюс, иначе собственно знак плюс будет расценен как знак пробел, то есть пошлем +mx
curl -H "PddToken: $TOKEN2" -d "domain=$DOMEN2&record_id=$RECID5&subdomain=$SUB&ttl=14400&content=v=spf1 ip4:$IPNOW include:_spf.yandex.net %2bmx ~all" '
https://pddimp.yandex.ru/api2/admin/dns/edit'
#
curl -H "PddToken: $TOKEN3" -d "domain=$DOMEN3&record_id=$RECID6&subdomain=$SUB&ttl=21600&content=$IPNOW" '
https://pddimp.yandex.ru/api2/admin/dns/edit'
curl -H "PddToken: $TOKEN3" -d "domain=$DOMEN3&record_id=$RECID7&subdomain=$SUBWWW&ttl=21600&content=$IPNOW" '
https://pddimp.yandex.ru/api2/admin/dns/edit'
#
curl -H "PddToken: $TOKEN4" -d "domain=$DOMEN4&record_id=$RECID8&subdomain=$SUB&ttl=21600&content=$IPNOW" '
https://pddimp.yandex.ru/api2/admin/dns/edit'
curl -H "PddToken: $TOKEN4" -d "domain=$DOMEN4&record_id=$RECID9&subdomain=$SUBWWW&ttl=21600&content=$IPNOW" '
https://pddimp.yandex.ru/api2/admin/dns/edit'
echo -n $IPNOW > $yaipfile
echo "$(date +%x-%X) Внешний IP адрес: $YAIP изменен на $IPNOW и записан в файл $yaipfile"
else
echo "$(date +%X) Внешний IP адрес: $YAIP не изменился"
fi