Съем данных с помощью скриптов
Общая идея и мотивация
Съем данных иногда может быть сложной процедурой, совмещающей несколько источников, протоколов, сложные логические и математические операции. Реализация сложной логики в препроцессинге или вычисляемых айтемах иногда не может быть реализована или может быть нетривиальна.
Поэтому существуют скрипты, позволяющие реализовать специфичную логику. Существует принципиально два разных типа скриптов - скрипты на языке JavaScript, которые выполняются в "виртуальной машине" в библиотеке duktape и скрипты, которые выполняются в системе на уровне интерпретатора sh. В последнем случае существует возможность указать стандартным способом (shebang line) имя интерпретатора в формате
#!/usr/sbin/perl
Что позволяет выполнять типовые интерпретируемые скрипты. По функционалу интрепретируемые скрипты аналогичны внешним скриптам ( ExternalScrips ), но существенным отличием является то, что скрипты хранятся в конфигурации и автоматически переедаются и синхронизируются на диск как на сервере так и на прокси серверах.
Скрипты на Perl/Shell/Python/PHP...
При вводе стандартного маркера интерпретатора (shebang line) в первой строке скрипта
#!
Перед выполнением скрипт записывается ни диск.
В случае, если в первой строке существует символ перевода каретки
\r
- то он заменяется на символ переноса строки \n
, это позволяет избежать ошибки при поиске интерпретатора, когда символ перевода каретки участвует в имени.
Существуют две опции конфигурации, которые необходимо настроить для работы скриптов:
-
ShellScriptsDir
: каталог, в который будут записываться временные файлы скриптов. Каталог должен быть обязательно указан и не должен содержать никаких файлов, каталог периодически отчищается сервером -
ShellScriptMaxSize
: максимальный размер скрипта, разрешенный к записи и выполнению. По умолчанию равно 0, что блокирует возможность работы скриптов. Может быть установлен в любой размер от 0 до 65536. Управление размером необходимо для ограничения пользователей системы от создания излишне больших скриптов. В случае, если такая потребность есть, то предполагается, что нужно использовать внешние скрипты (ExternalScripts)
Время выполнения
Время выполнения может быть выставлено индивидуально для скрипта, при указании 0 используется время выполнения в системе по умолчанию, задаваемое опцией Timeout в конфигурационном файле.
Парамерты скрипта
Параметры, указанные в настройках скрипта, передаются в формате
'параметр=значение'
параметр
Создание и удаление файлов со скриптами
Файл со скриптом создается непосредственно перед его поллингом. Файл имеет имя, равно md5
чек-сумме текста скрипта. Чек сумма вычисляется до замены символа возврата каретки в первой строке
Файлы со скриптами удаляются каждый запуск HouseKeeper в сервере и каждые 4 часа на прокси.
При изменении текста скрипта его чек-сумма меняется и создается новый файл. Если есть айтемы, использующие один и тот-же скрипт, то файл будет создан один.
Безопасность
Скрипты, выполняемые на сервере или прокси имеют доступ к системе, файловой системе, сети и памяти в рамках прав, под которыми работает сервер или прокси сервер. Стоит также учитывать, что помимо скриптов существует множество иных возможностей по выполнению произвольных команд, включая возможности Агентов, выполнения удаленных команд, создания произвольных скриптов - действий для различных объектов.
По умолчанию скрипты отключены. Чтобы включить, необходимо задать конфигурационной опцией ShellScriptMaxSize
максимально допустимый размер текста скрипта. Если не требуется ограничений, можно указать 65536 - это максимально разрешенный на уровне конфигурации размер.
Скрипты на языке JavaScript
Скрипты выполняются в интерпретаторе JavaScript на базе встроенной в сервер библиотеки duktape.
Возможность такого выполнения безопаснее, чем выполнение скриптов в системе и обратно совместима с Zabbix. Язык JavaScript в реализации от duktape
имеет некоторые особенности и ограничения.
Скрипты не имеют доступа к файловой системе, но могут осуществлять сетевые вызовы. Поэтому они более безопасны, чем скрипты в целом.
При необходимости, JavaScript скрипты могут выполняться в иных интерпретаторах путем указания вначале нужного интерпретатора в shebang
строке:
#!/usr/bin/env node