Общие сведения о сценариях

Сценарии – это Lua-файлы, являющиеся дополнением к основным параметрам конфигурации Виртуальных Серверов. 

Сценарии предназначены для:

  • выбора Сервера Балансировки: распределения клиентских запросов по нескольким Серверам Балансировки на основе данных в запросе;
  • изменения содержимого запросов (HTTPS/HTTPS);
  • ответа на запрос (HTTP/HTTPS);
  • прерывания нежелательного соединения.

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

  • if;
  • elseif;
  • else;
  • end.

Условиями для логических выражений могут быть любые данные, полученные из запроса, а также комбинация эти данных, например:

  • выражение для сравнения имени хоста из запроса с именем abc.ru для выполнения какого-либо действия:
If client.http_req.host == "abc.ru” then
BASH
  • выражение для сравнения имени хоста из запроса с именем abc.ru и принадлежностью к определенному IP-адресу:
if (client.http_req.host == "abc.ru” and client.remote_p.ip == "192.0.2.1")
BASH

Для работы с полученными данными можно использовать возможности языка программирования Lua. Примеры выражений для обработки запроса вида qwe.123.ru/abczxc:

  • выражение сравнения. Результатом будет true:

If client.http_req.path == "/abcZxc"
BASH
  • выражение содержания определенного значения. Результатом будет true:
If (client.http_req.path:find(”zx"))
BASH
  •  выражение для получения определенной части строки. Результатом будет qwe:
(client.http_req.host:match(”(.*).123.ru")
BASH

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

Обработка правил сценария останавливается после выражения: client.action = “xxx”.

Описание полей структуры client

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

client.remote_p

Структура

Содержит поля удаленной точки подключения, где:

  • remote_p.ip (строка) – возвращает IP-адрес соединения;
  • remote_p.port (целое) – возвращает порт соединения;
  • remote_p:is_network(VAR) (метод) – осуществляет проверку, является ли IP-адрес частью сети, задаваемой в переменной VAR вида {IP}/{PREFIX}:
if client.remote_p:is_network("127.0.0.1/24") then
...
end
BASH

client.local_p

Структура

Содержит поля локальной точки подключения, аналогично remote_p

client.http_req

Структура или nil

В текущей версии Termidesk Connect значение nil для балансировки уровня L7 вернуться не может.

Содержит поля HTTP-запроса или возвращает значение nil (HTTP-запрос отсутствует). Описание полей приведено в таблице

client.bs

Строка

Определяет имя Сервера Балансировки.

Пример:

client.bs = "lb1"

client.respond.status

Целое

Возвращает код ответа

client.action

Строка

Определяет действие:

  • client.action = "bs" – возвращает Сервер Балансировки, определенный в client.bs;
  • client.action = "respond" – возвращает ответ клиенту, не передавая запрос на Реальный Сервер. Содержимое ответа описывается в client.respond.status;
  • client.action = "drop" – сбрасывает соединение
Описание полей структуры http_req

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

http_req.version

Целое

Возвращает версию протокола HTTP: целое число, в котором младший десяток соответствует значению после точки, старший десяток - перед точкой.

Поддерживаются версии: 1.0, 1.1.

Пример:

для HTTP/1.0 будет возвращен ответ: 10

http_req.method

Строка

Возвращает метод запроса (GET, POST, HEAD, DELETE, PATCH, PUT, OPTIONS, CONNECT, TRACE и др.).

В примере ниже: GET

http_req.path

Строка

Возвращает путь запроса.

В примере ниже: termideskconnect

http_req.query

Строка

Возвращает запрос.

В примере ниже: test=query

http_req.path_and_query

Строка

Возвращает полный путь запроса.

В примере ниже: termideskconnect?test=query

http_req.host

Строка

Возвращает значение заголовка Host

В примере ниже: connect.termidesk.ru

http_req.headers

Таблица (словарь)

Возвращает все заголовки со значениями. 

В примере ниже:

Host: connect.termidesk.ru
User-Agent: Mozilla Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Cookie: sessionid=100TC
BASH

http_req.body

Строка

Возвращает тело HTTP-запроса

Примеры из таблицы отражены в этом ответе на запрос к узлу termideskconnect по протоколу HTTP:

GET /termideskconnect?test=query HTTP/1.0
Host: connect.termidesk.ru
User-Agent: Mozilla Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Cookie: sessionid=100TC
BASH