Страница 1 из 3

Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 08:55
vomus
Добрый день,
Решаю задачу связки двух сайтов (на обоих концах "Микротики") по IPsec поверх Интернета. Публичные адреса на WAN'ах "Микротиков" могут меняться и, соответственно необходимо менять IP-адреса в /ip ipsec peer и /ip ipsec policy.

Для этого на два WAN'а прикрутил DDNS и теперь необходимо периодически проверять, не поменялся ли IP на этих DDNS'ах. Для этого пытаюсь сохранить старый IP в глобальной переменной, но ее значение почему-то не доступно изнутри скрипта. Делаю:

Код: Выделить всё

1. из командной строки
  > :global b;
  > :set b "456"
  > /system/script/environment/print
  # NAME               VALUE                                                                                                                             
  0 b                  456           

2. Затем создаю простой скрипт:

Код: Выделить всё

:log info "Variable $b"
:set b "test1"

и запускаю его. Ожидается, что первый запуск покажет в логе "Variable 456", а второй "Variable test1". Но в логе ничего не видно. Где ошибка?

Re: Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 09:34
vqd

Код: Выделить всё

:global b
:log info "Variable $b"
:set b "test1"


Вот так надо

Re: Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 09:46
vomus
vqd писал(а):

Код: Выделить всё

:global b
:log info "Variable $b"
:set b "test1"


Вот так надо


Таким образом он ведь не сохраняет значение b между последующими запусками скрипта. Тогда должно быть первый раз просто "Variable", а второй "Variable test1". Но два последующих запуска скрипта дают "Variable". Я так понимаю, что объявление b как global внутри скрипта просто инициализирует ее со значением null. Как же тогда сохранять ее значение?

Re: Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 09:57
vqd
нет, он ее просто инициализирует.
Можете посмотреть в переменных. После завершения значения там остаются.
А вот local каждый раз пересоздаются

Re: Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 10:41
vomus
vqd писал(а):нет, он ее просто инициализирует.
Можете посмотреть в переменных. После завершения значения там остаются.
А вот local каждый раз пересоздаются


Почему тогда:

Код: Выделить всё

:global b;
:log info "Variable $b";
:set b "test1";

При запуске оба раза показывает пустоту?

Код: Выделить всё

11:44:51 system,info changed script settings by vomus 
11:45:01 script,info Variable 
11:45:13 script,info Variable 
11:45:15 system,info address list entry removed by vomus

Re: Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 10:52
vqd

Код: Выделить всё

:global b;
:log info "Variable " . $b;
:set b "test1";

Re: Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 11:13
vomus
vqd писал(а):

Код: Выделить всё

:global b;
:log info "Variable " . $b;
:set b "test1";


Сделал cut-paste. Счетчик запусков скрипта увеличивается, время тоже меняется, в логе нет ничего. Поставил все в кавычки - появилось "Variable" без значений. И почему-то в /system/script/environment нет переменной b.

Re: Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 11:21
vqd
это проверил. точно работает

Код: Выделить всё

:global b
:log info ("Variable " . $b)
:set b test1

Re: Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 12:09
vomus
vqd писал(а):это проверил. точно работает

Код: Выделить всё

:global b
:log info ("Variable " . $b)
:set b test1


Вот прикол... Если выполнять скрипт из командной стоки - работает, если в веб-интерфейсе нажимать RunScript - не работает. Это так и должно быть?

Re: Работа с глобальными переменными (для IPsec-соединений)

Добавлено: 04 апр 2014, 12:13
vqd
винбоксом работайте. Там все хорошо