Выполнение скриптов при создании и удалении объектов

При создании или удалении объектов того или иного класса система способна выполнять скрипты и передавать им аргументы, настраиваемые через web-интерфейс.

Каждый такой скрипт состоит из двух файлов:

  • исполняемый файл;

  • файл конфигурации, описывающий web-интерфейс вкладки Триггеры для передачи аргументов исполняемому файлу.

Файл конфигурации должен:

  • находиться в одной папке с исполняемым файлом;

  • иметь название исполняемого файла с дополнительным расширением .conf:

/opt/saymon-extensions/entity-triggers-path/myscript.sh
/opt/saymon-extensions/entity-triggers-path/myscript.sh.conf

Исполняемые файлы скриптов можно группировать в подкаталогах с любым уровнем вложенности:

/opt/saymon-extensions/entity-triggers-path/for_host/script_1.sh
/opt/saymon-extensions/entity-triggers-path/for_host/script_1.sh.conf
/opt/saymon-extensions/entity-triggers-path/for_memory/script_1.sh
/opt/saymon-extensions/entity-triggers-path/for_memory/script_1.sh.conf
/opt/saymon-extensions/entity-triggers-path/for_router/script_1.sh
/opt/saymon-extensions/entity-triggers-path/for_router/script_1.sh.conf

При добавлении или модификации скриптов все изменения применяются автоматически - достаточно обновить страницу в браузере.

Каталог для скриптов

Каталог скриптов задается в конфигурационном файле сервера /etc/saymon/saymon-server.conf.

Необходимо:

  1. Добавить в файл секцию custom_scripts.

  2. В параметре entity_triggers_path задать полный путь до папки со скриптами.

    ...
    "custom_scripts": {
        "entity_triggers_path": "/opt/saymon-extensions/entity-triggers-path"
    },
    ...
  3. Перезапустить сервер:

    $sudo service saymon-server restart

Параметры скриптов

Параметры скрипта задаются в JSON-файле, именуемом как имя_исполняемого_файла.conf. Например, для скрипта myScript.sh файл настроек параметров должен называться myScript.sh.conf.

Конфигурационный файл должен располагаться в одном каталоге с исполняемым файлом.

Скрипты без конфигурационного файла игнорируются.

Файл настроек параметров может содержать следующий набор полей:

Поле Описание

title

Имя скрипта, отображаемое в web-интерфейсе в списках скриптов.

Опциональное поле.

По умолчанию в качестве имени отображается идентификатор скрипта, генерируемый сервером из пути и имени скрипта:

  • путь к файлу: <путь до папки со скриптами>/cpu/script_1.sh

  • отображаемое имя: cpu - script_1

args

Настройки аргументов, которые задаются пользователем через web-интерфейс и передаются исполняемому файлу.

args.id

Имя аргумента, передаваемое исполняемому файлу.

Опциональное поле.

args.default

Значение аргумента по умолчанию, подставляемое в соответствующее поле.

Опциональное поле.

args.description

Описание аргумента, отображаемое в web-интерфейсе.

Опциональное поле.

args.name

Название аргумента, отображаемое в web-интерфейсе.

args.options

Применимо только для типа select ([args.type.select]).

Определяет набор значений, отображаемых в выпадающем списке.

По умолчанию при создании проверки выбирается первая опция. Чтобы установить иную опцию значением по умолчанию, необходимо указать значение поля [args.options.value] в поле [args.default].

Исполняемому файлу передаются:

Если [args.id] не задано, то исполняемому файлу передаётся только значение выбранного аргумента ([args.options.value]).

Если значение аргумента не задано ([args.options.value]), то исполняемому файлу также не передаётся имя аргумента ([args.id]).

Данную логику можно использовать для реализации пункта "Не выбрано" и разделителей в выпадающем списке.

args.options.description

Описание значения аргумента, отображаемое в выпадающем списке.

Опциональное поле.

По умолчанию отображается значение аргумента ([args.options.value]).

args.options.value

Значение аргумента.

Опциональное поле.

При отсутствии значения исполняемому файлу также не передаётся имя аргумента. Такие опции можно использовать для реализации пункта "Не выбрано" и разделителей в выпадающем списке.

args.required

Признак обязательности заполнения значения аргумента.

  • true - значение обязательно,

  • false - значение опционально.Опциональное поле.

По умолчанию - false.

args.type

Тип значения аргумента.

Опциональное поле.

По умолчанию - text.

args.type.checkbox

Переключатель.

По умолчанию выключен.

При включении исполняемому файлу передаётся значение, указанное в поле [args.id] (имя аргумента). Если это поле отсутствует, то исполняемому файлу передаётся порядковый номер аргумента (отсчёт начинается с 0).

args.type.password

Отображает текстовое поле для ввода значения аргумента с маскировкой введённых символов.

args.type.select

Отображает выпадающий список с предопределёнными значениями аргумента.

Список значений задается в поле [args.options].

Для данного типа не отображается описание аргумента (поле [args.description]). Вместо этого необходимо использовать соответствующее поле для каждого значения аргумента ([args.options.description]).

args.type.text

Отображает текстовое поле для ввода значения аргумента.

args.type.textarea

Отображает текстовое поле для ввода значения аргумента.

Позволяет вводить многострочный текст.

Пример скрипта

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

  1. Разместите их в каталоге скриптов.

  2. Настройте выполнение скрипта "Custom script example" при создании или удалении объекта любого класса во вкладке Триггеры.

  3. Задайте значения аргументов.

  4. Создайте или удалите объект выбранного класса.

Исполняемый файл скрипта записывает все переданные в него аргументы в файл output:

hello_world.sh
#!/bin/bash
#
# Use this script as the custom one
# to check or test arguments configuration file.

i=0
echo "Script got the following args:"
for arg in $*
do
  i=$((i + 1))
  echo -ne $arg >> /opt/saymon-extensions/entity-triggers-path/myselect/output; echo -ne " " >> /opt/saymon-extensions/entity-triggers-path/myselect/output
done

if [ $i = 0 ]
then
  echo "(no args)" >> /opt/saymon-extensions/entity-triggers-path/myselect/output
  exit 2
fi

В этом конфигурационном файле приведены примеры для всех типов аргументов:

hello_world.sh.conf
{
    "title": "Custom script example",
    "args": [
        {
            "name": "Unnamed (positional) arg"
        },
        {
            "name": "Named arg",
            "id": "--name"
        },
        {
            "name": "Behold the description on the right",
            "description": "Here I am!",
            "id": "--description"
        },
        {
            "name": "Arg with defaul value",
            "description": "and description",
            "id": "--defval",
            "default": "default_value"
        },
        {
            "name": "Required arg",
            "description": "This field is required to fill in",
            "id": "--required",
            "required": true
        },
        {
            "name": "Type - Text",
            "description": "This and all above fields have got text type",
            "id": "--text",
            "type": "text"
        },
        {
            "name": "Type - Text Area",
            "description": "This field is text area. \nIt is resizable in most browsers. \nAnd allows to enter multiline texts.",
            "id": "--textarea",
            "type": "textarea"
        },
        {
            "name": "Type - Checkbox",
            "description": "This is the checkbox type",
            "id": "--checkbox",
            "type": "checkbox"
        },
        {
            "name": "Type - Password",
            "description": "This is the password field",
            "id": "--pass",
            "default": "qwerty",
            "type": "password"
        },
        {
            "name": "Type - Select",
            "description": "This is the select type. This description is not displayed in the web interface. Use description for each option instead.",
            "id": "--select",
            "default": "option2",
            "type": "select",
            "options": [
                {
                    "description": "== Not selected =="
                },
                {
                    "value": "option1", "description": "OK"
                },
                {
                    "description": "== Divider =="
                },
                {
                    "value": "option2", "description": "Warning"
                },
                {
                    "value": "option3", "description": "Error"
                }
            ]
        }
    ]
}