# Служебные методы и классы Lua

# Класс Scheduler

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

Экземпляр создается автоматически при вызове скрипта и доступен через переменную scheduler.

# curl Метод

Принимает таблицу (коллекцию «ключ-значение») аргументов.

# Параметры

Параметр Пример Значение по умолчанию Описание
uri "http://smon.monq.ru" Отсутствует Допустимый (согласно RFC 2396 (opens new window)) URI ресурса.
method "POST" "GET" Допустимый (согласно 4.3 RFC 7231 (opens new window)) HTTP 1.1-метод, используемый для вызова.
body "[{ "key": "value" }]" Отсутствует Тело запроса. Произвольная строка.
mediaType "application/json" "text/plain" MIME-типы – типы данных, которые могут быть переданы посредством сети Интернет с применением стандарта MIME.
headers { ["accept-encoding"] = "gzip, deflate" } Отсутствует Таблица (коллекция «ключ-значение») ключей заголовков и их значений.
proxy { address = "http://1.1.1.1:8080", bypassList = { "http://url1", "http://url2" }, credentials = { username = "guest", password = "guest" } } Отсутствует Настройки проксирования запроса.
address – допустимый (согласно RFC 2396 (opens new window)) URI ресурса.
bypassList – массив адресов или регулярных выражений, описывающих адресы, при запросах к которымне будет использоваться прокси.
credentials – учётные данные для аутентификации на прокси-сервере.
username – имя пользователя.
password – пароль.
basicAuth { login = "guest", password = "guest" } Отсутствует Настройки базовой авторизации для запроса.
login – имя пользователя.
password – пароль.
insecure true / false false Выполнить запрос без проверки подлинности сертификатов.

# Модель ответа

Если возникла ошибка, то data = nil, err ~= nil. Если ответ нормальный, то data ~= nil, err = nil.

{
    data = {
        statusCode = 200,
        headers = {
            ["Server"] = "nginx/1.10.3",
            ["Date"] = "Wed, 16 Oct 2019 07:00:09 GMT"
        },
        content = "content string",
        isSuccessStatusCode = true
    },
    err = {
        message = "Ошибка"
    }
}

# Пример

Basic-авторизация через открытый прокси:

local args =
{
  uri = "https://jigsaw.w3.org/HTTP/Basic/",
  proxy = {
    address = "http://212.220.216.70:8080"
  },
  basicAuth = {
    login = "guest",
    password = "guest"
  }
}
local response = curl(args)
if (response.err ~= nil) then
  print(response.err)
  return -- Ранний выход из скрипта, если возникла ошибка.
end
  
if (response.data.isSuccessStatusCode) == true then
  print(response.data.content)
else
  print(":( status code " .. response.data.statusCode)
end

# ssh Метод

Принимает таблицу (коллекцию «ключ-значение») аргументов.

# Параметры

Параметр Тип Пример Значение по умолчанию
host string "http://sample.ssh.com/" Отсутствует
port number 23 22
username string "demo-user" Отсутствует
password string "demo-password" Отсутствует
privateKey string "0KHQtdC60YDQtdGC0L3QvtC1INC/0L7RgdC70LDQvdC40LUgO15Q" Отсутствует
command string echo "I have a bad feeling about this." Отсутствует

# Пример

local args =
{
  host = "sample.ssh.com",
  command = "ls /tmp/doc"
}
local response = ssh(args)
if response.data.exitStatus == 0 then
  print(response.data.result)
else
  print(":( error " .. response.data.error)
end

# snmp Метод

Управление сетевыми устройствами

# Параметры

Параметр Пример Значение по умолчанию
ip "64.233.163.94" Отсутствует
community "public" "public"
version "2c" "1"
level "authnopriv" "noauthnopriv"
method "walk" "get"
timeout 10000 1000
maxrepetitions 1 10
mode "subtree" "all"
data "s Shanghai" Отсутствует
oid "1.3.6.1.2.1.1.6.0" Отсутствует
user "privacy" ""
contextname "" ""
authentication "md5" ""
authphrase "authentication" ""
privphrase "privacyphrase" ""

# Пример

Сложный snmpget 3 версии:

local args =
{
  ip = "192.168.10.1",
  oid = "1.3.6.1.2.1.1.1.0",
  version = 3,
  level = "authPriv",
  authentication = "authentication",
  privphrace = "privacyphrase",
  user = "privacy"
}
local response = snmp(args)
print(response.data)

Простой snmpwalk 1 версии:

local args =
{
  ip = "192.168.10.1",
  community = "public",
  oid = "1.3.6.1.2.1.1.1.0",
  method = "walk",
  mode = "subtree",
  maxrepetitions = 5
}
local response = snmp(args)
print(response.data)

# smtp Метод

Отправляет сообщения на сервер электронной почты.

# Параметры

Параметр Пример Описание
host Адрес сервера-отправителя (IP-адрес, либо DNS-имя)
port 25 Номер порта на сервере
secureMode "None" / "Auto" / "SslOnConnect" / "StartTls" / "StartTlsWhenAvailable" Принудительно задает режим шифрования.
username Логин пользователя-отправителя (опционально, при наличии проводится аутентификация на сервере).
password Пароль пользователя-отправителя (опционально)
subject Тема письма
body Текст письма
mailType Тип отображения сообщения (plain, html)
from { title = "Отдел оповещения", address = "sender@server.net" } Адрес отправителя (должен соответствовать формату адреса электронной почты, при несоответствии скрипт будет завершен с ошибкой)
recipients { "overwatchers@gmail.com", "overwatchers@ya.ru", "tester@gmail.com" } Список адресов получателей (адреса, которые не соответствуют формату адреса электронной почты, будут исключены из рассылки)

# Модель ответа

При успешном завершении data = true При возникновении ошибки data = false, err – объект-исключение с сообщением об ошибке error.Message

# Пример

Отправка сообщения одному получателю:

local = smtp({
  host = "server.mail.ru",
  port = 25,
  useSsl = true,
  username = "user",
  password = "pass",
  subject = "Оповещение о событии",
  body = "Уважаемые участники, ...",
  mailType = "plain",
  from = "sender@server.net",
  recipients = "overwatchers@server.com"
})
if (response.data) == false then print(response.err) end

# regexIsMatch(string input, string pattern) Метод

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

# Параметры

  • input – входная строка
  • pattern – регулярное выражение (PCRE-диалект)

# Модель ответа

  • true – если соответствует
  • false – если не соответствует

# Пример

regexIsMatch("user@mailbox.net", "(\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,6})")

# regexMatch(string input, string pattern) Метод

Ищет в указанной входной строке первое вхождение заданного регулярного выражения.

# Параметры

  • input – входная строка
  • pattern – регулярное выражение (PCRE-диалект)

# Модель ответа

# Пример

Выводит все электронные адреса, содержащиеся в строке, в консоль:

local result = regexMatch([[test1@test.com test2 test3@test.com test4@test4com]], [[(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})]])
while result.Success == true do
  print (result.Value)
  result=result:NextMatch()
end

# regexReplace(string input, string pattern, string replacement) Метод

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

# Параметры

  • input – входная строка
  • pattern – регулярное выражение (PCRE-диалект)
  • replacement – строка замены

# Модель ответа

  • string – строка с замененной подстрокой

# Пример

Заменяет все найденные электронные адреса на строку email:

local result = regexReplace([[test1@test.com test2 test3@test.com test4@test4com]], [[(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})]], [[email]])
print (result)

# regexSplit(string input, string pattern) Метод

Разделяет входную строку в массив подстрок в позициях, определенных шаблоном регулярного выражения.

# Параметры

  • input – входная строка
  • pattern – регулярное выражение (PCRE-диалект)
  • replacement – строка замены

# Модель ответа

  • string[] – массив подстрок

# Пример

Разделяет входную строку в массив подстрок по строке email:

local result = regexSplit([[test1@test.com test2 test3@test.com test4@test4com]], [[(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})]])
for i = 0, result.Length-1 do
   print (result:GetValue(i))
end

# scheduleAfter Метод

Запланировать вызов скрипта через <seconds> секунд, начиная с момента вызова метода.

# Параметры

  • seconds – количество секунд, через которое будет запущен скрипт, начиная с момента вызова метода

# Модель ответа

  • LuaResult<boolean> – результат выполнения метода
  • True – скрипт запланирован
  • False – возникли проблемы с постановкой скрипта в планировщик
  • result.err – детали ошибки

# Пример

GET-запрос на получение JSON-ресурса по заданному пути:

if (isScheduled == true) then
  print("Скрипт был запущен планировщиком.")
else
  scheduler:executeAfter(60) -- Запланировать выполнение скрипта через 60 сек после вызова данного метода
  print("Скрипт был запланирован.")
end