Перейти к основному содержимому
Версия: 2.5

Парсеры и постпроцессоры

Парсер извлекает нужное значение из сырых данных, полученных фетчером. Постпроцессоры приводят результат парсера к нужному виду — они настраиваются в параметрах самого парсера и выполняются на его результате.

Парсер необязателен: если он не назначен, значение от фетчера сразу приводится к типу атрибута. Что происходит с результатом дальше — см. Обогащение атрибутов.

Парсеры предназначены для обработки значений атрибутов полученных фетчерами.

Парсеры​

Наследование параметров парсеров​

Наследование параметров парсеров выполняется аналогично фетчерам

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 секундами.
warning

Если скрипт пустой или не выполнил 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. Аргументы постпроцессора:

  • единица измерения - секунды или миллисекунды.

Постпроцессор подстановки значения​

Постпроцессор предназначен для замены полученного парсером результата, на значение из списка пар "ключ": "значение". Если результат парсера совпадает с ключом в списке, то возвращается соответствующее ключу значение, иначе результат возвращается без изменений. Аргументы постпроцессора:

  • ключ - ожидаемое значение;
  • значение - новое значение.