Jump to content
iT4iT.CLUB
Sign in to follow this  
Kitsum

Необычный способ восстановления тоннеля между MikroTik и Cisco

Recommended Posts

Необычные проблемы требуют необычных решений.

Tunnel_bouwen_cartoon.thumb.jpg.190c8d38

Начнем с прелюдии

На определенном удалении друг от друга имеются две локальные домашние сети. Во главе одной стоит маршрутизатор на базе стационарного компьютера с RouterOS на борту, а сердцем второй является Cisco 800-ой серии (далее просто Кошка). В каждой из сетей имеются ресурсы представляющие интерес друг для друга. И вот настал прекрасный момент,  была приобретена статика, и начался процесс поднятия GRE тоннеля. Все завелось с первого раза, пакетики побежали между сетями. Данное событие было отмечено, как подобает Русскому представителю IT сообщества и все разошлись заниматься своими делами.

Но счастье было не долгим. Через пару дней, из-за не преодолимых обстоятельств, произошло отключение питания на стороне "Кошки" и MikroTik начал скучать и ждать своего боевого товарища. После проведения аварийно-восстановительных работ "Кошка" радостно заурчала, но пакетики не побежали. 

Вскрытие показало, что провайдер не поддерживает адекватную работу с DHCP семейства кошачьих и в панике выдавал первый свободный IP из пула, со всеми вытекающими последствиями. Несколько недель велись переговоры с провайдером, и раз эта статья была написана, значит, провайдер пока не добился положительного результата.

Решено разбираться самостоятельно и попробовать поднимать тоннель, основываясь только на одном статическом адресе. Ведь в цирке медведи ездят на одноколесных велосипедах? А чем мы хуже медведей?!

Реализация

Кошка будет гулять по всему пулу адресов провайдера, следовательно, приспосабливаться к этим загулам придется MiktoTik-у. Средствами RouterOS решить эту проблему сходу не получилось и решено вводить в бой тяжелую артиллерию, это сверх мощный и производительный сервер Raspberry Pi :$ А Вы, что подумали?) Эта игрушка с 512mb RAM, 800мГц CPU, Lunux-ом на борту и питанием от USB разъема самого MikroTik-а очень сильно расширяет функционал маршрутизатора, не повышая расходы на электроэнергию и общую стоимость проекта. 

Если быть серьезным, то MikroTik API + Raspberry Pi (далее просто Малина) позволяют реализовать практически любую Вашу фантазию.

Фото моего роутера

DSC_0382.thumb.jpg.9a01371273d962d6518e2DSC_0387.thumb.jpg.257a52ba00f7f089191e5

DSC_0385.thumb.jpg.6c1943f1d67cb1b3d1fb1

DSC_0381.thumb.jpg.74f0b91cfae38c892ab21

Поведение будет следующим:

  1. На MikroTik-е настраивается проброс 80 порта до Малины.
  2. Cisco каждые N минут будет обращаться по протоколу http на Raspberry Pi и методом GET передавать секретный ключ.
  3. На борту Малинки крутится Apache + PHP. Последний проверяет корректность ключа, реализуя идентификацию кошки по схеме "Свой\Чужой".
  4. Если идентификация пройдена успешно, то по средствам API маршрутизатора происходит перенастройка GRE тоннеля.

Хочу отметить, что таким способом можно производить конфигурацию всего маршрутизатора, а не только GRE.

Проброс портов на MikroTik-е

/ip firewall nat add action=netmap chain=dstnat disabled=no dst-port=80 in-interface=ether1 protocol=tcp to-addresses=192.168.1.100 to-ports=80
  1. in-interface - имя интерфейса смотрящего в интернет
  2. to-addresses - внутренний адрес малинки

Не забудьте активировать сервис API у маршрутизатора.

/ip service enable 5 

Настройка Cisco

cisco-test#configure terminal
cisco-test(config)#kron policy-list gre
cisco-test(config-kron-policy)#cli more http://64.64.64.64/?key=a7656fafe94dae72b1e1487670148412
cisco-test(config-kron-policy)#exit
cisco-test(config)#kron occurrence gre in 015 recurring
cisco-test(config-kron-occurrence)#policy-list gre
cisco-test(config-kron-occurrence)#^Z
cisco-test#write
cisco-test#more ?
  /ascii    Display binary files in ascii
  /binary   Force display to hex/text format
  /ebcdic   Display binary files in ebcdic
  archive:  File to display
  cns:      File to display
  flash:    File to display
  ftp:      File to display
  http:     File to display
  https:    File to display
  null:     File to display
  nvram:    File to display
  rcp:      File to display
  scp:      File to display
  system:   File to display
  tar:      File to display
  tftp:     File to display
  xmodem:   File to display
  ymodem:   File to display

В данном случае настраивается задание для планировщика KRON на выполнение команды more каждые 15 минут. Сама команда просто выводит на экран содержимое из различных источников. Естественно необходимо изменить IP адрес на актуальный для Вас.

Значение key необходимо изменить на Ваш ключ, указанный в PHP скрипте ниже и закодированный в md5!

Еще один важный момент. В GET запросе, символ вопроса "?" обозначает, что начинается передача параметров. В Cisco это спец символ показывающий справку по командам и чтобы его ввести, необходимо перед его написанием нажать Ctrl + V

PHP Script для Raspberry Pi

Нам понадобится PHP class для работы с RouterOS API https://github.com/BenMenking/routeros-api

<?PHP
/**
 * @copyright: iT4iT.CLUB (c) 2015
 * @author: https://it4it.club
 */

# Данные для подключения к API RouterOS
$host = '192.168.0.1';
$login = 'login';
$pass = 'password';

# Уникальный ключ для проверки "Свой\Чужой". Удаленный маршрутизатор обязан передавать его в md5
$key = 'secret key';

# Интерфейс, который необходимо переконфигурировать
$interfaceName = 'gre-tunnel1';

if(isset($_GET['key']) and $_GET['key'] == md5($key)) {
    require('./routeros_api.class.php');
    
    $API = new RouterosAPI();    
    if($API->connect($host, $login, $pass)) {
        $API->write('/interface/gre/print');
        foreach($API->read() as $id => $param) {
            if($param['name'] == $interfaceName and $param["remote-address"] != $_SERVER['REMOTE_ADDR']) {
                $API->comm("/interface/gre/set", array(
                    "numbers" => $id, 
                    "remote-address" => $_SERVER['REMOTE_ADDR'],
                ));
                break;
            }
        }        
        $API->disconnect();
    }
}
?>

В данном скрипте при совпадении ключей происходит поиск интерфейса gre-tunnel1 в ветке /interface/gre и в случае его обнаружения следует изменение параметра remote-address на IP клиента передавшего верный ключ в формате md5.

Более подробно почитать об API можно на официальном сайте http://wiki.mikrotik.com/wiki/Manual:API

PS: Данный вариант управления маршрутизатором довольно забавен и очень гибок, но будьте очень осторожны, "друзья" Эдварда не дремлют! Советую также использовать https, фильтр по IP (провайдера) в коде скрипта и в фаерволе MikroTik-а.

routeros_cisco_rpi.zip

  • Like 1

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

  • Similar Content

    • By Maerhekil
      Вдруг захотелось с "ядра" просматривать трафик например программой Wireshark. Реализуется достаточно просто.
      Создаём сессию мониторинга для vlan
      monitor session 1 source vlan 1 И указываем на какой интерфейс зеркалировать
      monitor session 1 destination interface Gi1/0/1 Соединяем этот интерфейс с устройством на котором установлен Wireshark и получаем профит.
      Удачи!
    • By Kitsum
      Представьте ситуацию, что Вам необходимо получить доступ к закрытому ресурсу. Это может быть, как компьютер находящийся в частной локальной сети (например, на работе), так и сервер находящийся в интернете и доступ к нему закрыт в связи с разного рода санкциями и прочей чепухой не имеющей ничего общего со здравым смыслом. Некоторые пользователи скатываются настолько низко, что могут закрыть видео на YouTube для граждан той или иной страны. Ну да Бог с ними, сама реализация описанная ниже намного более интереснее чем закрытый видеоролик и, тем более имеет намного более широкие перспективы!

      Все эти проблемы решает VPN, заодно он является самым распространенным способом для организации удаленных рабочих мест разными работодателями. В подавляющем большинстве случаев при использовании VPN Ваш компьютер становится частью чужой локальной сети, следовательно, маршрутизация всего трафика уже идет по чужим правилам.
      В рабочей обстановке это может выражаться в виде отсутствия доступа в интернет через сеть работодателя или между Вами и остальным интернетом вдруг появляется чужой Firewall и блокирует доступ к: ICQ, IRC, Skype или другим законным ресурсам.  А вот если Вы используете в интернете бесплатные VPN сервера (да и платные тоже) для Ваших личных нужд, то стоит помнить о том, что весь трафик проходит где-то там и все, что Вы делаете становится известно всем заграничным друзьям. В список раскрытой информации также входят cookie используемые Вашим браузером, платежные реквизиты от электронной коммерции до банковских карт, различные ключи и много всего интересного. Кстати, отечественные сервера тоже не брезгуют воспользоваться этими данными. Самое логичное решение на мой взгляд - составить список ресурсов, с которыми необходимо работать через VPN и заворачивать их трафик в тоннель, а все остальное пускать классическим способом через местного провайдера. Сам VPN тоннель поднимать только в том случае, если появляется трафик для него. Это позволит не держать постоянно поднятый канал и сэкономит ресурсы.

      Приступим к реализации
      Первым делом нам необходимо создать список сетей, в которые мы хотим ходить через VPN. Условно назовем этот список "blackHole". Список подсетей работодателя можно узнать у самого работодателя или его IT специалистов. Но вот, что делать если необходимо получить доступ к закрытому иностранному ресурсу? Для наглядности эксперимента пусть его роль сыграет https://2ip.ru/ т.к это покажет наглядную работу системы.
      Давно не новость, что за DNS именем ресурса может находится несколько IP адресов, иногда даже десятки или сотни. Все их необходимо добавить. В этом случае очень хорошо, если у Вас под рукой имеется машина с UNIX подобной операционной системой с установленными утилитами Host и Whois. Если таковой нету, то утилиты нам заменят:
      Host:
      http://www.digwebinterface.com/ Whois:
      https://www.reg.ru/whois/ https://www.nic.ru/whois/ Узнаем список используемых IP адресов с помощью утилиты Host
      root@linuxPC:/# host 2ip.ru 2ip.ru has address 178.63.151.224 2ip.ru mail is handled by 10 aspmx3.googlemail.com. 2ip.ru mail is handled by 5 alt1.aspmx.l.google.com. 2ip.ru mail is handled by 5 alt2.aspmx.l.google.com. 2ip.ru mail is handled by 1 aspmx.l.google.com. 2ip.ru mail is handled by 10 aspmx2.googlemail.com. Узнаем список всех подсетей с помощью утилиты Whois. Если предыдущая операция показала наличие более одного IP адреса, то данную процедуру нужно провести для всего списка.
      root@linuxPC:/# whois 178.63.151.224 % This is the RIPE Database query service. % The objects are in RPSL format. % % The RIPE Database is subject to Terms and Conditions. ... route: 178.63.0.0/16 Будет очень много информации, но нас интересует только строка с параметром route. Именно эту подсеть с указанием маски мы и добавляем в список "blackHole" маршрутизатора.
      /ip firewall address-list add address=178.63.0.0/16 comment=2ip.ru disabled=no list=blackHole Или через WinBox в разделе IP -> Firewall -> Address List
      Теперь необходимо промаркировать пакеты, это позволит повлиять в дальнейшем на их маршрутизацию. Каждому пакету, который предназначается для подсети из списка "blackHole" мы дадим маркер с именем "bh".
      /ip firewall mangle add action=mark-routing chain=prerouting dst-address-list=blackHole log=no \ new-routing-mark=bh Или через WinBox в разделе IP -> Firewall -> Mangle
      Теперь нам необходимо создать подключение к VPN серверу. В сети большой выбор как бесплатных серверов с периодически меняющимися учетными данными для подключения, так и платных к которым тоже нет особого доверия. В идеале конечно лучше держать свой собственный сервер, но это требует некоторых затрат средств и выгодно только в том случае, если такой доступ необходим целой компании или организации.
      Настройка будет зависеть от Вашего выбора. Я нашел первый попавшийся PPTP сервер и подключился к нему.
      /interface pptp-client add comment="VPN blackHole" connect-to=serverName\ disabled=yes name=pptp-out1 password=password\ user=login dial-on-demand=yes keepalive-timeout=60 comment - комментарий к подключению connect-to - адрес VPN сервера disabled - устанавливаем yes пока не закончим настройку (сюрпризы не нужны) name - имя интерфейса password - пароль user - логин dial-on-demand - связь с сервером устанавливается только при необходимости keepalive-timeout - время удержания соединения в секунда до разрыва связи в случае не использования соединения Или через WinBox в разделе Interface
      Учитывайте, что для разных серверов одного типа настройки могут сильно отличаться.
      Добавляем запись Masquerade в NAT для нашего нового интерфейса.
      /ip firewall nat add action=masquerade chain=srcnat dst-address-list=blackHole out-interface=\ pptp-out1 Или через WinBox в разделе IP -> Firewall -> NAT
      Осталось дело за малым, добавить новую запись в лист маршрутизации и заворачивать пакеты с маркером "bh" на интерфейс pptp-out1
      /ip route add distance=1 gateway=pptp-out1 routing-mark=bh Или через WinBox в разделе IP -> Routes
      Поднимаем интерфейс (естественно, что у Вас его порядковый номер может отличаться)
      /interface pptp-client set numbers=0 disabled=no После всех манипуляций идем на любой адрес из списка "blackHole", в нашем случае это http://2ip.ru и сравниваем адрес с данными например на http://myip.ru 
      Теперь трафик перераспределяется нужным нам образом и можно приступить к поднятию необходимых тоннелей с серверами и маршрутизаторами на работе, в удаленных офисах и вообще с чем душе угодно.
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека Cron, реализует планировщик задач для периодического выполнения пользовательских функций.
      Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название.
      Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи.
      Данная библиотека предоставляет следующий функционал
      Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки
      #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду
      cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта
      cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами.
      Фундаментальные константы
      cron::second cron::minute cron::hour cron::day Самые распространенные значения
      cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы.
      cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д
      В функции loop должна находится команда вызова обработчика.
      void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору
      cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки.
      if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи
      uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи.
      Перезапуск таймера задачи производится следующим образом
      cron.update("Blink"); А так можно установить новый интервал вызова задачи
      cron.update("Blink", cron::time_10m); Остановка выполнения задачи
      cron.stop("Blink"); Проверка активности задачи
      bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров.
      Автор Kitsum Добавлен 09.12.2018 Категория Библиотеки  
    • By Kitsum
      Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название.
      Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи.
      Данная библиотека предоставляет следующий функционал
      Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки
      #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду
      cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта
      cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами.
      Фундаментальные константы
      cron::second cron::minute cron::hour cron::day Самые распространенные значения
      cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы.
      cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д
      В функции loop должна находится команда вызова обработчика.
      void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору
      cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки.
      if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи
      uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи.
      Перезапуск таймера задачи производится следующим образом
      cron.update("Blink"); А так можно установить новый интервал вызова задачи
      cron.update("Blink", cron::time_10m); Остановка выполнения задачи
      cron.stop("Blink"); Проверка активности задачи
      bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров.
    • By Kitsum
      Описанный ниже велосипед является продолжением одной из моих статей на другом, интересном мне, ресурсе. Продолжение и все последующие обновления будут происходить только на it4it.club
      Для начала, хочу процитировать самого себя и тем самым дать пояснения: почему, зачем и для кого это нужно.
      Данная тема получила большую популярность у коллег и не раз выручила Вашего покорного слугу, не дав разгореться стулу на котором он сидит.
      Но имеющегося функционала стало не хватать, требовалось не только слышать и иногда видеть, а еще получать удаленный доступ к оборудованию и лицезреть всю картину в целом.
      Задача поставлена, идем исполнять, но с начало забегу немного вперед и продемонстрирую текущий функционал.
      Общее окно программы переработано и теперь отображает список всех групп из Zabbix с их хостами. Список активных триггеров переехал в нижнюю часть окна и отображает дополнительную информацию об узлах с которыми не все гладко. Сам список можно увеличивать, если все совсем плохо, или уменьшать если выражение "Хьюстон у нас проблемы" Вы слышите только в фильмах. Также появились цветные маркеры важности триггера. По двойному клику по активному триггеру мы перемещаемся в соответствующую группу где находится проблемный узел.
      Не забыли и про то, ради чего вся начальная песня и писалась - трей с всплывающими оповещениями и звуковым сигналом. Основное окно сворачивается именно туда, чтобы не залеживаться на панели где ценится каждый свободный пиксель.
      Хосты в группах стали кликабельны, правда пока только ПКМ, и имеют всплывающее меню позволяющее выполнять банальные действия:
      Подключение к узлу:
      Telnet SSH RDP VNC Проверка соединения:
      Ping Traceroute Естественно его можно расширить, добавив всяких вкусностей по мере возрастания аппетита IT отдела.
      Программа по прежнему имеет серверную и клиентскую часть, что позволило организовать кэширование запросов и осуществлять оповещения в момент определения проблемы сервером, а не по таймеру обновления, как это организовано в dashboard zabbix. Раньше узнали о проблеме, раньше приступили к устранению. Естественно и устаревшие триггеры убираются также оперативно.
      Также это позволило избавить программу от информации о доступе к серверу, что мне кажется не приемлемым для оповещалки. Чем меньше дырок, тем крепче сон.
      Приступим к реализации.
      Ну и естественно, Ваш покорный слуга еще не научился писать на C++ ничего более сложного чем "Hello World", поэтому клиент и сервер будет написан на PHP. За исключением того момента, что клиентская часть (при помощи магии Гарри Поттера) станет бинарным файлом. Бог с ним, серверная часть не доступна обывателю, а это самое важное!!!
      Для начала, нужно придумать безопасный и понятный алгоритм не нагружающий сервер т.к клиентов может быть 100и или 1000и, всякое бывает. Все не безопасные команды обязаны выполняться на сервере без участия клиента. Дальнейшая работа клиента: обработка данных, выполнение действий с триггерами и т.п должно выполняться только у клиента, не затрагивая сервер.
      При обращении клиента к серверу по http происходит проверка его ip на наличие в списках разрешенных. В противном случае показываем фигу. Проверяем, наличие актуального кеша, и отдаём его. Если кеша нет, генерируем новый. Если запрос прилетел от zabbix: принудительно считаем кеш устаревшим, генерируем новый и после этого рассылаем всем клиентам оповещения по UDP протоколу. Это позволит свести расход ресурсов базы данных к нулю т.к все клиенты ринутся забирать новые данные, а все уже в кеше. Супер, все дешево и сердито.
      Серверная часть представляет из себя файл index.php где-то на Вашем web сервере. Актуально для Zabbix 2.4 (скорее всего будет актуальна и для последующих версий, будем проверять по мере возрастания аппетита).
      Для дополнительной безопасности рекомендую создать отдельную учетную запись в базе данных с правами только на чтение и только к базе zabbix. Это актуально в наши дни.
      Переходи в zabbix
      Первым делом переходим в Настройка -> Действия -> Источники события: Триггеры и создать новое действие. Назовем случайным образом, например Report problems to ZabbixTrigger.
      В условиях выставляем
      Значение триггера = ПРОБЛЕМА Значение триггера = OK Это все необходимо, чтобы проблемы в GUI появлялись и исчезали точно именно тогда, когда это происходит в Zabbix (не путать с dashboard).
      Вкладка "Операции" должна выглядеть следующим образом. Естественно что путь до php скрипта должен быть вашим.
      Вуаля! Если Вы все сделали правильно (без кардинальных изменений), то я рад приветствовать нового ездока моего велосипеда. Поедем тандемом!
      Сам клиент прикреплен в конце поста.
      Для тех, кто читает титры в кинотеатре
      При запуске будет создан файл config.ini в корне программы. При необходимости, измените его настройки, благо их не много.
      [server] url="http://zabbix/zabbix-gui" update="60" [client] showalarm="20" Параметр url отвечает за http путь до скрипта на сервере, update за интервал (в секундах) обновления данных с сервера, а showalarm вроде как должен влиять на время отображения всплывающей подсказки в трее.
      Теперь немного структуры.
      В каталоге sounds находится звук оповещения о новом триггере, формат ogg Каталог icons содержит маркеры триггеров. trigger00 - для нормального состояния, а все последующие соответствуют начальным настройкам zabbix во вкладке Администрирование -> Общие раздел Важность триггеров. Можете изменить на свои цвета, программа все подхватит при перезагрузки. Ну и на закуску каталог ext, это как говорится для меломанов, содержит фри программы для обработки внешних действий клиента. Вы можете заменить их на свои при условии, что стандартные имена параметров запуска и их последовательность совпадают. PS: На этом все, спасибо тем кого это заинтересовало. Предлагайте свои идеи или способы доработки велосипеда. А если найдется программист на C++ так милости просим. В любом случае, функционал будет в дальнейшем расширяться.
      zabbixTrigger.zip
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...