Привет! Один из моих клиентов пользуется ADSL с динамическим IP-адресом. Скрипт для обновления DynDNS запускается каждые 15 минут и работает нормально:
# выводим отладочную информацию # :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]
# Проверяем, нужно ли обновлять DynDNS # подробности запроса обновления здесь: http://www.dyndns.com/developers/specs/syntax.html :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
Кто-нибудь сталкивался с похожей проблемой с глобальными переменными? Или я что-то делаю не так? Заранее спасибо!
Кто-нибудь может подтвердить, что эта проблема решена? У меня такая же проблема на ROS v5.16. Я также пытался настроить Netwatch так, чтобы он вызывал скрипт, который обновляет глобальную переменную, но это не сработало (ошибок нет, но и обновления тоже нет).
Проблема пока не решена. Я бы предложил временное решение — записывать данные в файл или вместо netwatch использовать запланированный скрипт пинга, который делает то же самое, но запускается от правильного пользователя.
Спасибо за быстрый ответ, mrz. Я перейду на использование скрипта расписания вместо Netwatch, как вы и советуете. Однако это делает инструмент Netwatch бесполезным вообще для запуска скриптов, которые зависят от результатов других скриптов. Есть ли какая-то информация, в какой версии ROS это будет исправлено?
Та же проблема с netwatch возникает, когда к глобальным переменным обращаются через hotspot userprofile в скриптах onlogin и onlogout (как в самих скриптах, так и во внешних). Проверял на версиях 5 и 6. Есть какие-нибудь новости?
Привет, кажется, эта ошибка всё ещё сохраняется даже в версии 6.18. Да, я знаю, что сейчас актуальна 6.19… В любом случае, где в списке задач находится решение по обмену «глобальными» переменными между скриптами и netwatches? Будут ли вообще настоящие глобальные переменные, которые можно будет использовать без каких-либо ограничений?
Да. Пробовал несколькими способами, используя полного администратора как в скриптах, так и в планировщике. Результат одинаковый — не получилось. Вместо глобальной переменной я использую DNS-запись. Как-то работает.
Привет, ребята! У меня тоже проблема с глобальными переменными. У меня уже есть два скрипта: один читает «маршруты по умолчанию» (которые даёт DHCP-сервер), и эти IP-адреса сохраняются как глобальные переменные — по одной для каждого WAN-интерфейса (у меня их два). Но когда я запускаю другой скрипт, который должен использовать эти переменные (IP-адреса) для редактирования существующих маршрутов, эти глобальные переменные (они сохранены и видны в /system script environment) как будто недоступны. Скрипт их просто «не видит». Есть какое-то решение? Я использую «stable» 6.38.5, rb2011. Сейчас я решаю проблему с глобальными переменными с помощью «всё-в-одном» скриптов, где всё необходимое находится в одном месте, и тогда я могу без проблем обращаться и к глобальным, и к локальным переменным. Спасибо, ребята!