Microtik: включение API и вывод уровня сигнала wifi соеднинений
Вывести уровни сигнала соединений:
1 |
/interface wireless registration-table> print |
Включить сервис API:
1 |
/ip service> enable 5 |
Жизнь замечательных грибов
Наработки и статьи по работе с Linux
Вывести уровни сигнала соединений:
1 |
/interface wireless registration-table> print |
Включить сервис API:
1 |
/ip service> enable 5 |
Grafana после некоторой настройки позволяет «расшаривать» дашборды и панели для просмотра для не авторизированных пользователей. Для этого в файле настройки /etc/grafana/grafana.ini необходимо найти секцию auth.anonymous и установить enabled=true:
1 2 3 |
[auth.anonymous] # enable anonymous access enabled = true |
После чего необходимо перезапустить сервер:
1 |
service grafana-server restart |
К сожалению Grafana не хранит данные, и сама опрашивать ничего не умеет. Она может лишь красиво нарисовать картинку на основании данных из какого то источника. Посему сначала сделаем скрипт, который ложит данные о пинге в БД MySQL:
1 2 3 4 |
#!/bin/sh time=`ping 192.168.10.100 -c 1 | grep time= | awk '{print $7}' | awk -F '=' '{print $2}'` mysql -ulogin -pparol -e "use m_data;insert into graf_ping (ip,value) values ('192.168.10.100',$time)" |
Структура таблицы БД:
1 2 3 4 5 6 |
CREATE TABLE <code>graf_ping</code> ( id</code> int(11) NOT NULL, dt</code> datetime NOT NULL DEFAULT current_timestamp(), ip</code> text COLLATE utf8_bin NOT NULL, value</code> int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; |
Поместим выполнение этого скрипта например в крон, и далее настроим отображение на стороне Grafana:
Добавим «отсечку» 200мл, «красная линия»:
И чуть сгладим линии:
В результате можно получить нечто такое:
Применимо в основном для управляемых свичей Dlink/Orion
Принципиальный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
def get_cable_port_status(host: str, user_port: int, snmp_ro_comm: str = 'X-Files') -> List: """ Метод проверки статуса порта, витой пары и длины пар возвращает список словарей типа {'command_name': 'CABLE_STATUS', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.4.4', 'result': 8} """ SET_COMMAND = f'1.3.6.1.4.1.171.12.58.1.1.1.12.{user_port}' # команда для получения статуса порта CABLE_STATUS_COMMAND = f'1.3.6.1.4.1.171.12.58.1.1.1.12.{user_port}' # получение статуса кабеля status_dict = [{"command_name": "CABLE_STATUS", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.4.{user_port}'}, # статус кабеля 8 кабель не воткнут, 1 с одной стороны в воздухе {"command_name": "LINK_STATUS", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.3.{user_port}'}, # статус порта 1 - ок, иначе нет {"command_name": "PAIR_1", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.8.{user_port}'}, # длина 1 пары {"command_name": "PAIR_2", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.9.{user_port}'}, # длина 2 пары {"command_name": "PAIR_3", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.10.{user_port}'}, # длина 3 пары {"command_name": "PAIR_4", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.11.{user_port}'}, # длина 4 пары {"command_name": "PAIR_1_STATUS", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.4.{user_port}'}, # статус 1 пары {"command_name": "PAIR_2_STATUS", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.5.{user_port}'}, # статус 2 пары {"command_name": "PAIR_3_STATUS", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.6.{user_port}'}, # статус 3 пары {"command_name": "PAIR_4_STATUS", "oid": f'1.3.6.1.4.1.171.12.58.1.1.1.7.{user_port}'}, # статус 4 пары ] new_value = Integer(1) type = ObjectType(ObjectIdentity(SET_COMMAND), new_value) g = setCmd(SnmpEngine(), CommunityData(snmp_ro_comm), UdpTransportTarget((host, 161)), ContextData(), type, lookupMib=False) next(g) auth = cmdgen.CommunityData(snmp_ro_comm) cmdGen = cmdgen.CommandGenerator() errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd( auth, cmdgen.UdpTransportTarget((host, 161)), *[cmdgen.MibVariable(oid) for oid in [oid["oid"] for oid in status_dict]], lookupMib=False, ) if errorIndication: return False for oid, val in varBinds: for result in status_dict: if str(result["oid"]) == str(oid): result["result"] = int(val) return status_dict |
Вывод в консоли будет вида:
1 |
[{'command_name': 'CABLE_STATUS', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.4.4', 'result': 8}, {'command_name': 'LINK_STATUS', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.3.4', 'result': 1}, {'command_name': 'PAIR_1', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.8.4', 'result': 0}, {'command_name': 'PAIR_2', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.9.4', 'result': 46}, {'command_name': 'PAIR_3', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.10.4', 'result': 46}, {'command_name': 'PAIR_4', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.11.4', 'result': 0}, {'command_name': 'PAIR_1_STATUS', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.4.4', 'result': 8}, {'command_name': 'PAIR_2_STATUS', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.5.4', 'result': 0}, {'command_name': 'PAIR_3_STATUS', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.6.4', 'result': 0}, {'command_name': 'PAIR_4_STATUS', 'oid': '1.3.6.1.4.1.171.12.58.1.1.1.7.4', 'result': 8}] |
Код не мой, предоставлен postcoder для «истории» 😉
Задача: выбрать последние по дате значения в таблице для каждого значения в колонке source
Решение: запрос получается с соединением. Т.е. в соединении мы делаем запрос максимальных дат с группировкой по source, а затем соединяем по дате и значению source
1 2 3 4 5 6 7 8 |
SELECT m_data.* from m_data inner JOIN ( SELECT MAX(m_data.dt) as dt,m_data.source from m_data where m_data.source in (SELECT id FROM sources where device IN (1,2)) GROUP by m_data.source ) as maximum on (maximum.source=m_data.source and maximum.dt=m_data.dt) |