Автор просил делиться мыслями, нам не жалко. Не критики ради, а обучения для.
Первый вариант не смотрел, второй разобрал. Скрипт создает
netwatch-и с типом
simple и прописывает код в
up-script и
down-script и вот там вся логика.
Разберем на примере
down-script:
Код: Выделить всё
:local state [tool netwatch get value-name=comment [find host=\"$v\"]];
Здесь вы получаете состояние
netwatch путем поиска этой записи по полю
host, получая из нее комментарии. Далее по скрипту вся работа идет с ними.
Возник вопрос зачем через комментарии это делать, если можно обратиться к полю
status этой записи, раз уже нашли её. Но можно вообще ничего не искать. Поиск - операция затратная.
Все нужные переменные уже есть в памяти во время выполнения скрипта. Можете в этом убедиться прописав в
up или down:
Код: Выделить всё
:log info ("host:" . $host)
:log info ("type:" . $type)
:log info ("interval:" . $interval)
:log info ("status:" . $status)
:log info ("done-tests:" . $"done-tests")
А если все переменные есть, то не нужно ничего искать. Скрипт и так знает о себе всё.
Дополнительные пинги только мешают, лучше выставить задержку больше чем
$interval, а после нее проверять
$status и уже в зависимости от этого принимать решение об отправке в Телеграм.
Скрипт, который идет в
up и
down можно сильно сократить и сделать одинаковым для обоих. А можно использовать
test-script. Это тот код, который будет выполняться через каждый
$interval.
Что касается глобальных переменных, то они действительно недоступны из
netwatch. Но есть обходной путь. Можно вместо кода прописать имя скрипта, который будет выполнен, и там уже они будут доступны.
Причем все локальные переменные из
netwatch будут доступны во внешнем скрипте, потому что он использует контекст скрипта
netwatch .
Чтобы убедиться в этом, создайте скрипт с именем
script1 и правами
read, write, test, reboot, пропишите в нем код, который выше. В поле
test для
netwatch пропишите имя
script1. Все переменные все-равно будут выведены в лог.