Парсеры и постпроцессоры
Парсер извлекает нужное значение из сырых данных, полученных фетчером. Постпроцессоры приводят результат парсера к нужному виду — они настраиваются в параметрах самого парсера и выполняются на его результате.
Парсер необязателен: если он не назначен, значение от фетчера сразу приводится к типу атрибута. Что происходит с результатом дальше — см. Обогащение атрибутов.
Парсеры предназначены для обработки значений атрибутов полученных фетчерами.
Парсеры
Наследование параметров парсеров
Наследование параметров парсеров выполняется аналогично фетчерам
JQ parser
Парсер предназначен для извлечения данных из JSON конфигурации, при помощи языка jq. Аргументы парсера - это список JQ выражений и методов. Парсер поочереди выполняет выражения, до первого совпадения. Аргументы парсера:
выражение- строка описывающая JQ выражение, поддерживает шаблонизатор jinja;метод поиска-текст,все совпаденияилипервое совпадение;постпроцессоры- список постпроцессоров.
Например, корневым элементом конфигурации является список:
[1, 2, 3]
В этом случае выражение [# jinja2 comment #] .[]+5 вернет:
6\n7\n8- результат методатекст;[6, 7, 8]- результат методавсе совпадения;6- результат методапервое совпадение.
JSON
Парсер предназначен для извлечения данных из JSON конфигурации, при помощи библиотеки python objectpath. Аргументы парсера:
выражение- строка описывающая Objectpath выражение;группировать по- поле по которому происходит группировка, например@.field. Группа представляет собой массив. Задается в виде фильтра для json path, который можно применить после выполнения выражения.постпроцессоры- список постпроцессоров.
Например, корневым элементом конфигурации является объект:
{
"str_val": "asc",
"int_val": 123,
"str_list_val": ["asc","desc"],
"dt_val": "2023-10-19 12:00:00",
"bool_val": true,
"jb_val": {"val": true, "list": ["asc",123,false]},
"obj_list": [{"key": "one", "val": "first"}, {"key": "two", "val": "second"}]
}
В этом случае выражения могут быть следующие:
$.bool_val- выбор элемента по ключу, вернет результатtrue;$.obj_list[0].val- выбор элемента списка по индексу, вернет результатfirst;$.obj_list[@.key is 'one'][0].val- выбор элемента списка по условию, вернет результатfirst.
Например, корневым элементом конфигурации является список:
[
{"key": "one", "val": "first"},
{"key": "two", "val": "second"}
]
В этом случае выражения могут быть следующие:
$*[0].val- выбор элемента списка по индексу, вернет результатfirst;$*[@.key is 'one'][0].val- выбор элемента списка по условию, вернет результатfirst.
Цепочка регулярных выражений
Парсер поочереди выполняет регулярные выражения, результаты помещенные в группы по одному передаются на вход следующего регулярного выражения. Аргументы парсера:
список регулярных выражений- список регулярных выражений, поддерживаемых python;постпроцессоры- список постпроцессоров.
Регулярное выражение с именованными группами
Парсер поочереди выполняет регулярные выражения. В регулярных выражениях можно задать имена групп, результаты разбора вернутся в виде списка словарей, ключами которых будут заданные имена групп. Если имена групп не заданы, вернется список строк. Аргументы парсера:
список регулярных выражений- список регулярных выражений с именованными группами, поддерживаемых python.
Например, для конфигурации списка правил доступа:
ip access-list no-web
deny tcp dport www
deny tcp sport www
permit icmp
Список регулярных выражений может быть таким:
^ (?P<rule>\S+) (?P<proto>\S+) (?P<dest>\S+) (?P<port>\S+)$- выбираем правила из 4 слов;^ (?P<rule>\S+) (?P<proto>\S+)$- выбираем правила из 2 слов.
Регулярное выражение
Парсер находит вхождения для регулярного выражения. Аргументы парсера:
регулярное выражение- регулярное выражение, поддерживаемое python;метод поиска-все совпадения (с номерами строк),все совпаденияилипервое совпадение;тип разделителя после номера строки-пробелилилитеральное значение;разделитель номера строки- строка;постпроцессоры- список постпроцессоров.
Exec python parser
Парсер предназначен для обработки значения произвольным скриптом на языке python. Скрипт выполняется в изолированной WASM-песочнице: у него нет доступа к сети, файловой системе и данным сервера Pamir. Аргументы парсера:
Python скрипт- скрипт на языке python, обрабатывающий входное значение;постпроцессоры- список постпроцессоров.
Правила написания скрипта:
- входное значение доступно в переменной
INPUT_VALUE. Строка, список и словарь передаются без изменений, значения других типов преобразуются в строку; - скрипт выполняется как тело функции, поэтому результат необходимо вернуть оператором
return; - модули
jsonиreимпортированы заранее, их можно использовать безimport. Доступно только подмножество стандартной библиотеки python, часть модулей (например,datetime,base64,hashlib,random) отсутствует; - результат должен быть сериализуем в JSON. Результат другого типа (например,
set) будет заменен наNone; - время выполнения скрипта ограничено 5 секундами.
Если скрипт пустой или не выполнил return, парсер вернет None и значение атрибута будет удалено.
Например, входным значением является список интерфейсов:
[
{"name": "eth0", "admin_state": "up", "speed": 1000},
{"name": "eth1", "admin_state": "down", "speed": 1000}
]
Скрипт, отбирающий имена включенных интерфейсов:
return [i["name"] for i in INPUT_VALUE if i["admin_state"] == "up"]
Парсер вернет результат ["eth0"].
Например, входным значением является объект со списком дисков:
{
"disks": [
{"name": "sda", "size": 512110190592},
{"name": "sdb", "size": 1024209543168}
]
}
Скрипт, вычисляющий суммарный объем дисков в гигабайтах:
total = sum(d["size"] for d in INPUT_VALUE["disks"])
return round(total / 1024 ** 3, 1)
Парсер вернет результат 1430.8.
Например, входным значением является многострочный вывод команды, полученный с объекта контроля:
Cisco IOS Software, C2960X Software, Version 15.2(4)E7
Model number : WS-C2960X-24TS-L
System serial number : FOC1234X56Y
Скрипт, собирающий из вывода версию ПО и серийный номер:
version = re.search(r"Version (\S+)", INPUT_VALUE)
serial = re.search(r"System serial number\s+:\s+(\S+)", INPUT_VALUE)
return {
"version": version.group(1) if version else None,
"serial": serial.group(1) if serial else None,
}
Парсер вернет результат {"version": "15.2(4)E7", "serial": "FOC1234X56Y"}.
Постпроцессоры
Постпроцессоры предназначены для обработки значений атрибутов полученных парсерами.
True постпроцессор
Постпроцессор предназначен для сравнения полученного парсером результата с ожидаемым значением.
Если результат парсера совпадает с ожидаемым значением, то возвращается True (истина), иначе результат возвращается без изменений.
Аргументы постпроцессора:
ожидаемое значение- строка.
False постпроцессор
Постпроцессор предназначен для сравнения полученного парсером результата с ожидаемым значением.
Если результат парсера совпадает с ожидаемым значением, то возвращается False (ложь), иначе результат возвращается без изменений.
Аргументы постпроцессора:
ожидаемое значение- строка.
Постпроцессор строки времени
Постпроцессор предназначен для преобразования строки времени в строку времени в соответствии с аргументами. Аргументы постпроцессора:
шаблон- возвращаемый формат, поддерживаемый python, например%Y-%m-%d %H:%M:%S;временная зона- временная зона заданная строкой форматаHH:MM:00, где HH - часы, а ММ - минуты;временной сдвиг-плюсилиминус. Особенности работы: Аргументвременная зоназаполнять не обязательно. В этом случае применяется временная зона сервера Памир и аргументвременной сдвигне обрабатывается. Например:- обрабатываемая строка:
2025-05-09 11:00:00 - шаблон:
%Y-%m-%d %H:%M:%S - временная зона: незаполнено
- результат:
2025-05-09T11:00:00+03:00Если в шаблоне используются параметры временной зоны%Zили%z, и заполнен аргументвременная зона, то в обработке будет использоваться значение аргументавременная зона. Например: - обрабатываемая строка:
2025-05-09 11:00:00 UTC +0500 - шаблон:
%Y-%m-%d %H:%M:%S %Z %z - временная зона:
03:00:00 - временной сдвиг:
плюс - результат:
2025-05-09T11:00:00+03:00
Постпроцессор метки времени
Постпроцессор предназначен для преобразования времени из секунд или миллисекунд прошедших с 01.01.1970 в строку формата YYYY-MM-DD HH:MM:SS+HH:MM.
Аргументы постпроцессора:
единица измерения-секундыилимиллисекунды.
Постпроцессор подстановки значения
Постпроцессор предназначен для замены полученного парсером результата, на значение из списка пар "ключ": "значение".
Если результат парсера совпадает с ключом в списке, то возвращается соответствующее ключу значение, иначе результат возвращается без изменений.
Аргументы постпроцессора:
ключ- ожидаемое значение;значение- новое значение.