Для того чтобы не изобретать велосипеды, необходимо с генерировать шаблоны файлов плагина. Например при помощи этого сервиса. В моём случае плагин называется ssk_read, поэтому далее везде фигурирует в названиях файлов он.
Получится структура папок вида:
Необходимо поместить все файлы в папку /wp_content/plugins..и собственно на этом моменте плагин уже будет доступен в админке для ативации.
Далее попробуем нарисовать страницу настроек в панели администрирования. Для этого добавим в /admin/class-ssk_read-admin.php в функцию конструкта класса хук добавления пункта меню:
И далее в основном теле плагина skk_read.php добавим функцию register_my_config_page, которая непосредственно регистрирует этот пункт меню к выводу на экран:
На этом этапе пока появится только кнопка «сохранить изменения», потому как мы еще не указали ядру, какие именно настройки мы хотим хранить. Для этого добавим в /admin/class-ssk_read-admin.php в функцию конструкта класса хук инициализации настроек:
add_action( 'admin_init', 'ssk_read_fields');
И далее в основном классе ssk_read.php добавим функции регистрации полей и их вывода:
Grafana после некоторой настройки позволяет «расшаривать» дашборды и панели для просмотра для не авторизированных пользователей. Для этого в файле настройки /etc/grafana/grafana.ini необходимо найти секцию auth.anonymous и установить enabled=true:
К сожалению Grafana не хранит данные, и сама опрашивать ничего не умеет. Она может лишь красиво нарисовать картинку на основании данных из какого то источника. Посему сначала сделаем скрипт, который ложит данные о пинге в БД MySQL:
CREATE TABLE graf_ping (
id int(11) NOT NULL,
dt datetime NOT NULL DEFAULT current_timestamp(),
ip text COLLATE utf8_bin NOT NULL,
value int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Поместим выполнение этого скрипта например в крон, и далее настроим отображение на стороне Grafana:
Применимо в основном для управляемых свичей Dlink/Orion
Принципиальный код:
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