Привет! Один из моих клиентов пользуется ADSL с динамическим IP-адресом. Скрипт для обновления DynDNS запускается каждые 15 минут и работает нормально:
# Задаём нужные переменные
:local username "user"
:local password "pass"
:local hostname "myhost.dyndns.info"
:global dyndnsForce
:global previousIP
# выводим отладочную информацию
# :log info ("dyndns-update: username = $username")
# :log info ("dyndns-update: password = $password")
:log info ("dyndns-update: hostname = $hostname")
:log info ("dyndns-update: previousIP = $previousIP")
# получаем текущий IP из интернета (если стоит двойной NAT)
/tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"
:local result [/file get dyndns.checkip.html contents]
# парсим текущий IP из результата
:local resultLen [:len $result]
:local startLoc [:find $result ": " -1]
:set startLoc ($startLoc + 2)
:local endLoc [:find $result "</body>" -1]
:local currentIP [:pick $result $startLoc $endLoc]
:log info "dyndns-update: currentIP = $currentIP"
# Проверяем, нужно ли обновлять DynDNS
# подробности запроса обновления здесь:
:if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={
:set dyndnsForce false
:set previousIP $currentIP
/tool fetch user=$username password=$password mode=http address="members.dyndns.org" src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/dyndns.txt"
:local result [/file get dyndns.txt contents]
:log info ("dyndns-update: Обновление DynDNS требуется")
:log info ("dyndns-update: Результат обновления DynDNS: ".$result)
} else={
:log info ("dyndns-update: Обновление DynDNS не требуется")
}
Также настроен «netwatch» для быстрого обновления DNS после переподключения ADSL:
/tool netwatch
add disabled=no down-script="led user-led=no\r\n:log info \"Host 208.67.220.220 недоступен\"\r\n" host=208.67.222.222 interval=1m timeout=1s up-script="led user-led=yes\r\n/system script run dyndns-update\r\n:log info \"Host 208.67.220.220 доступен\"\r\n\r"
Проблема в том, что когда скрипт ‘dyndns-update’ вызывается из ‘netwatch’, глобальная переменная ‘previousIP’ почему-то пустая, хотя должна содержать строку с IP-адресом. Ниже лог:
21:45:00 script,info dyndns-update: hostname = myhost.dyndns.info
21:45:00 script,info dyndns-update: previousIP = 183.26.221.45
21:45:01 info fetch: file "dyndns.checkip.html" создан
21:45:01 script,info dyndns-update: currentIP = 183.26.221.45
21:45:01 script,info dyndns-update: Обновление DynDNS не требуется
21:54:11 system,info netwatch хост изменён администратором
21:54:11 script,info dyndns-update: hostname = myhost.dyndns.info
21:54:11 script,info dyndns-update: previousIP =
21:54:11 info fetch: файл "dyndns.checkip.html" создан
21:54:12 script,info dyndns-update: currentIP = 183.26.221.45
21:54:13 info fetch: файл "dyndns.txt" создан
21:54:13 script,info dyndns-update: Обновление DynDNS требуется
21:54:13 script,info dyndns-update: Результат обновления DynDNS: nochg 183.26.221.45
21:54:13 script,info Host 208.67.220.220 доступен
RB750, ROS 5.8
Кто-нибудь сталкивался с похожей проблемой с глобальными переменными? Или я что-то делаю не так? Заранее спасибо!
# Задаём нужные переменные
:local username "user"
:local password "pass"
:local hostname "myhost.dyndns.info"
:global dyndnsForce
:global previousIP
# выводим отладочную информацию
# :log info ("dyndns-update: username = $username")
# :log info ("dyndns-update: password = $password")
:log info ("dyndns-update: hostname = $hostname")
:log info ("dyndns-update: previousIP = $previousIP")
# получаем текущий IP из интернета (если стоит двойной NAT)
/tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"
:local result [/file get dyndns.checkip.html contents]
# парсим текущий IP из результата
:local resultLen [:len $result]
:local startLoc [:find $result ": " -1]
:set startLoc ($startLoc + 2)
:local endLoc [:find $result "</body>" -1]
:local currentIP [:pick $result $startLoc $endLoc]
:log info "dyndns-update: currentIP = $currentIP"
# Проверяем, нужно ли обновлять DynDNS
# подробности запроса обновления здесь:
:if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={
:set dyndnsForce false
:set previousIP $currentIP
/tool fetch user=$username password=$password mode=http address="members.dyndns.org" src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/dyndns.txt"
:local result [/file get dyndns.txt contents]
:log info ("dyndns-update: Обновление DynDNS требуется")
:log info ("dyndns-update: Результат обновления DynDNS: ".$result)
} else={
:log info ("dyndns-update: Обновление DynDNS не требуется")
}
Также настроен «netwatch» для быстрого обновления DNS после переподключения ADSL:
/tool netwatch
add disabled=no down-script="led user-led=no\r\n:log info \"Host 208.67.220.220 недоступен\"\r\n" host=208.67.222.222 interval=1m timeout=1s up-script="led user-led=yes\r\n/system script run dyndns-update\r\n:log info \"Host 208.67.220.220 доступен\"\r\n\r"
Проблема в том, что когда скрипт ‘dyndns-update’ вызывается из ‘netwatch’, глобальная переменная ‘previousIP’ почему-то пустая, хотя должна содержать строку с IP-адресом. Ниже лог:
21:45:00 script,info dyndns-update: hostname = myhost.dyndns.info
21:45:00 script,info dyndns-update: previousIP = 183.26.221.45
21:45:01 info fetch: file "dyndns.checkip.html" создан
21:45:01 script,info dyndns-update: currentIP = 183.26.221.45
21:45:01 script,info dyndns-update: Обновление DynDNS не требуется
21:54:11 system,info netwatch хост изменён администратором
21:54:11 script,info dyndns-update: hostname = myhost.dyndns.info
21:54:11 script,info dyndns-update: previousIP =
21:54:11 info fetch: файл "dyndns.checkip.html" создан
21:54:12 script,info dyndns-update: currentIP = 183.26.221.45
21:54:13 info fetch: файл "dyndns.txt" создан
21:54:13 script,info dyndns-update: Обновление DynDNS требуется
21:54:13 script,info dyndns-update: Результат обновления DynDNS: nochg 183.26.221.45
21:54:13 script,info Host 208.67.220.220 доступен
RB750, ROS 5.8
Кто-нибудь сталкивался с похожей проблемой с глобальными переменными? Или я что-то делаю не так? Заранее спасибо!
