slinger

Сверхмалый web-сервер

Синтаксис:

slinger [-a администратор] [-c] [-d] [-e] [-i адрес] [-n] [-p номер_порта] [-s]

Опции:

-a администратор
Контактная информация администратора Slinger (например, -a my_ad.nosp@m.min@.nosp@m.somet.nosp@m.hing.nosp@m..com). Эта информация хранится в переменной среды SERVER_ADMIN. Значение по умолчанию – nobody.
-c
Отменить сохранение файлов HTML с SSI в кэше браузера. При необходимости отображения файла HTML с SSI браузер игнорирует версию файла, ранее загруженную в локальный кэш, и обращается к серверу. Если используется эта опция, браузер отображает последнюю версию динамических данных SSI.
-d
Записывать отладочную информацию в системный журнал. Для перехвата регистрируемых сообщений требуется запуск утилиты syslogd.
-e
Активировать команду SSI exec.
-i адрес
Интерфейс, прослушиваемый сервером slinger (например, 10.0.0.1). Значение по умолчанию – любой интерфейс.
-n
Не переводить в фоновый режим.
-p номер_порта
Задать номер порта.
-s
Активировать команды SSI.

Платформы:

ЗОСРВ «Нейтрино»

Целевые архитектуры:

aarch64, arm, armv7, e2k, mips, ppc, x86

Описание:

Утилита slinger представляет собой сервер HTTP, предназначенный для работы в средах с ограниченными ресурсами. Slinger соответствует стандартам CGI 1.1 и HTTP 1.1, поддерживает DHTML с использованием SSI (Server Side Includes – вставки на стороне сервера).

Запуск сервера Slinger

Для запуска сервера Slinger введите:

slinger &

Сервер slinger прослушивает порт TCP 80. Поскольку этот номер меньше 1024, сервер slinger следует запускать от имени пользователя root. После присоединения к порту HTTP идентификатор пользователя сервера понижается до -2 ( setuid( -2 )).

Принципы работы DHTML

Slinger поддерживает команды SSI (Server Side Include – вставка на стороне сервера) для применения динамического HTML. Например, Slinger использует переменные среды PATH и CMD_INT для передачи информации команде SSI exec. Клиенты, использующие DHTML, могут предоставлять на своих web-страницах интерактивные функции, действующие в режиме реального времени.

Клиенты создают код DHTML, добавляя маркеры SSI в код HTML на web-страницах. В маркере SSI содержится команда SSI, обрабатываемая сервером Slinger. При передаче кода HTML сервер Slinger заменяет маркер данными HTML в соответствии с тегом, включенным в маркер SSI.


Note: Slinger обрабатывает маркеры SSI только при условии, что файл HTML имеет расширение .shtml.

Синтаксис маркера SSI

Применяется следующий синтаксис маркера SSI:

<!--#тег [[набор_переменных[="значение"]] …] -->

где:

<!–
Начальный разделитель комментария SGML/HTML.
#
Указывает серверу Slinger, что в комментарии содержится команда.
тег
Команда SSI.
набор_переменных
Один или несколько аргументов команды SSI.
значение
Одно или несколько значений для набора переменных.
-->
Конечный разделитель комментария SGML/HTML.


Note: Конечному разделителю комментария должен предшествовать пробел.

Размер маркера не ограничен (применяются только ограничения, связанные с объемом памяти).

Команды SSI

Допустимые команды SSI:

break
Прекратить передачу документа HTML (в любой момент времени). В команде break аргументы отсутствуют, поэтому применяется следующий синтаксис:
<!--#break -->
config
Установить определенные опции вывода HTML. Синтаксис:
<!--#config набор_переменных="значение" -->

набор_переменных может содержать: cmdecho, cmdprefix, cmdpostfix, errmsg, onerr, timefmt. Для получения дополнительной информации см. раздел "Команды config".
echo
Вставить данные из поля формы HTML или из переменной среды на страницу HTML. В команде echo используется один аргумент – var. Синтаксис:
<!--#echo var="строка" -->

где строка является значением поля формы HTML или переменной среды. Пример.
<!--#echo var="Last name" -->
или
<!--#echo var="DATE_LOCAL" -->

В команде echo используются эти переменные SSI, а также переменные среды CGI (для получения дополнительной информации см. раздел "Переменные среды" на странице этой утилиты):
DATE_GMT
Текущие время и дата по Гринвичу.
DATE_LOCAL
Текущие местные время и дата.
DOCUMENT_NAME
Полный локальный путь к текущей web-странице.
DOCUMENT_URI
Локальный путь к текущей web-странице, указывающий базовый каталог web-пространства.
LAST_MODIFIED
Дата и время последнего изменения текущей web-страницы.
QUERY_STRING_UNESCAPED
Строка запроса с неэкранированными специальными символами, отправленная удаленным клиентом. Все специальные символы командного интерпретатора экранируются символом \.
exec
Запустить внешнюю программу и вывести выходные данные в том же месте на странице HTML, где находится маркер exec. Внешняя программа запускается с целью повышения производительности. В команде exec используются следующие аргументы:
if
Выполнить операции SSI по условию и вывести текст HTML по условию. Синтаксис команды if:
<!--#if "операнд1" оператор "операнд2" операция -->
где:
операнд1
Строка первого операнда в операторе логического сравнения.
операнд2
Строка второго операнда в операторе логического сравнения.
оператор
Один из следующих операторов: == != < > !< !> hasstring
операция
Действие, выполняемое при условии, что логическое сравнение привело к результату TRUE (истинно). Возможные действия: break, error, errorbreak, goto, print, и printbreak.


Оператор hasstring возвращает результат TRUE, если символьная строка операнд2 обнаружена в строке операнд1. Если оба операнда являются числами, они сравниваются как числа; в противном случае сравнение основывается на алфавитном порядке операндов. Если при логическом сравнении получен результат FALSE (ложно), действие не выполняется. Пример.
<!--#if "5" != "10" goto thislabel -->

Нулевой операнд (NULL) задается строкой "". Операнд NULL позволяет проверить наличие каких-либо данных в поле формы. Например, если существует форма с полем Last name (фамилия) и необходимо убедиться, что пользователь заполнил это поле, можно воспользоваться следующим маркером:
<!--#if "Last name" == "" printbreak "<P>The Last name field cannot be blank; please resubmit the form." -->

Если поле заполнено, действие не выполняется. Если поле оставлено пустым, выводится сообщение и обработка документа HTML завершается.
goto
Перейти к маркеру с меткой (пропускаемый текст не выводится и пропускаемые маркеры не применяются). Синтаксис команды goto:
<!--#goto ="имя_метки" -->
где имя_метки является именем, определенным в последующей команде label на странице HTML.

Note: Знаку равенства должен предшествовать пробел.

Пример совместного использования команд goto и label:
<!--#goto ="change_temp" --> <!--Пропустить эту часть страницы HTML. --> <!--#label ="change_temp" --> <!--Slinger продолжает сканировать --> <!--код HTML. -->
include
Вставить содержимое файла на страницу HTML. В команде include используются следующие аргументы: include является рекурсивной командой; каждый вставляемый файл также может содержать маркеры include.

Note: Вставленный файл не может являться CGI-сценарием, однако он может содержать ссылку на CGI-сценарий.

label
При обнаружением сервером Slinger команды goto перейти к маркеру label на странице HTML. Синтаксис команды label:
<!--#label ="имя_метки" -->

Note: Максимальная длина переменной имя_метки составляет 60 символов. Знаку равенства должен предшествовать пробел.

Пример.
<!--#label ="change_temp" -->
qnxvar
Получить данные от процесса сервера данных или изменить данные этого процесса. В команде qnxvar используются следующие аргументы:

Note: Максимальная длина строковой переменной имя_переменной составляет 60 символов. За строковой переменной имя_переменной должен следовать пробел.

Команды config

cmdecho [ON | OFF]
Установить опцию вывода для последующих маркеров exec. Значение по умолчанию – OFF (выходные данные не подвергаются синтаксическому анализу и не выводятся). Команда cmdecho не применяется к выходным данным CGI-сценариев.
cmdprefix
Задать префикс для каждой строки, выводимой при обработке последующих маркеров exec. Синтаксис:
<!--# config cmdprefix="строка" -->
где строка является любой символьной строкой или тегом форматирования HTML. Если в команде cmdecho установлено значение ON, к выходным данным добавляется префикс строка. В противном случае выходные данные не подвергаются синтаксическому анализу и не выводятся.
cmdpostfix
Задать символьную строку, добавляемую в конец каждой строки, выводимой при обработке последующих маркеров exec. Синтаксис:
<!--# config cmdpostfix="строка" -->
где строка является любой символьной строкой или тегом форматирования HTML. Если в команде cmdecho установлено значение ON, к выходным данным добавляется строка. В противном случае выходные данные не подвергаются синтаксическому анализу и не выводятся. Например, для вывода выходных данных команды exec в отдельных строках введите следующее:
<!--# config cmdpostfix="<BR>" -->
errmsg
Создать сообщение об ошибке и вывести его при обнаружении сервером Slinger ошибки SSI (например, ошибки синтаксического анализа или отсутствие необходимых данных). Синтаксис:
<!--# config errmsg="строка" -->
где строка является любой символьной строкой или тегом форматирования HTML. Пример.
<!--# config errmsg="<CENTER>*ERROR*</CENTER>" -->

Сообщение об ошибке остается в силе, пока не будет указана другая команда errmsg.
onerr
Задать действие, выполняемое сервером Slinger при обнаружении ошибки. Синтаксис:
<!--#config onerr="действие" -->

Возможные значения переменной действие:
timefmt
Установить формат даты и времени. Синтаксис:
<!--#config timefmt ="строка" -->
где строка является переменной, совместимой с функцией библиотеки C ANSI strftime(). Строка по умолчанию – %a %b %d %T %Y. Пример.
<!--#config timefmt ="%A %B %d %Y" -->

Способы реализации DHTML

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

Существуют три способа реализации DHTML:

Сервер данных

Процесс сервера данных ( ds) сохраняет глобальные данные. Внешние приложения могут изменять или считывать глобальное состояние с помощью API сервера данных. Slinger может изменять или считывать глобальное состояние посредством команды SSI qnxvar.

На следующем рисунке представлена общая концепция управления и контроля, реализуемая внешним приложением и удаленным клиентом Slinger для некоторого устройства:

slinger.png
Рисунок 1. Использование сервера данных

Для использования динамического HTML:

  1. Используйте маркеры SSI для работы со страницей HTML.
  2. Используйте маркеры qnxvar для получения и обработки глобальных данных.
  3. Напишите приложение для управления глобальным состоянием (воспользуйтесь библиотечными функциями сервера данных). См. примеры для утилиты ds.

Выполнение CGI-сценариев

Если необходимо выполнить некоторый CGI-сценарий, его следует запросить по URL-адресу: http://имя_хоста/cgi-bin/файл_сценария, где:

имя_хоста
Имя или IP-адрес хоста, на котором запущен сервер Slinger.
cgi-bin
Выполнить заданный файл CGI-сценария.
файл_сценария
Имя выполняемого CGI-сценария. Для определения пути к файлу CGI-сценария сервер Slinger обращается к переменной среды HTTPD_SCRIPTALIAS.

При выполнении сервером Slinger CGI-сценария выходные данные сценария анализируются с целью обнаружения директив заголовка HTTP. До передачи данных сценария сервер Slinger должен поместить директивы заголовка в буфер; передача директивы заголовка повлияет на формат директивы заголовка по умолчанию. В буфер может быть записано до 1 КБ информации заголовка. CGI-сценарии должны предоставлять действительный заголовок.

Пустая строка распознается сервером Slinger как конец заголовка; строки завершаются символом "<LF>" или символами "<CR><LF>". В обычной директиве заголовка HTTP указывается тип данных, предоставляемых CGI-сценарием. Тип содержимого (Content-Type) по умолчанию: "text/html". Пример:

Content-Type: text/html<LF> <LF> данные CGI-сценария...

Slinger поддерживает следующие директивы заголовка CGI:

Директива Описание Пример
Content-Type Тип данных, возвращаемых клиенту. Content-Type: text/html
Location Ссылка на файл по URL-адресу. Location: http://www.kpda.ru
Status Возврат кода состояния и пояснения клиенту. Если сценарий выполнен успешно, Slinger возвращает состояние 200 OK (если состояние не было изменено сценарием). Status: 200 OK

К заголовку HTTP могут добавляться любые другие директивы.


Note: Slinger не выполняет синтаксический анализ сценария, имеющего префикс имени файла nph- (например, nph-myscript.cgi), и передает только необработанные данные из такого сценария. Поскольку Slinger не добавляет какое-либо содержимое заголовка HTTP, то любой сценарий, который не подвергается синтаксическому анализу, должен предоставлять полный заголовок HTTP в своих выходных данных.

Меры обеспечения безопасности

При выборе каталога для файлов данных:

При конфигурировании сервера Slinger для поддержки CGI:

Не подвергайте систему неоправданному риску. Обеспечьте следующее:

Эти меры предосторожности предотвращают несанкционированную замену файла паролей или изменение web-страниц.

Примеры:

Правильный способ
Рекомендуется помещать документы и сценарии в разные каталоги. В следующем примере документы помещаются в каталог /usr/webdoc (основным документом является foo.html), а CGI-сценарии – в каталог /usr/web/cgi:
export HTTPD_ROOT_DIR=/usr/webdoc export HTTPD_ROOT_DOC=foo.html export HTTPD_SCRIPTALIAS=/usr/web/cgi slinger &
"Неправильный" способ
В этом примере любой сторонний пользователь может загружать сценарии, поскольку документы и сценарии находятся в одном каталоге:
export HTTPD_ROOT_DIR=/usr/web export HTTPD_ROOT_DOC=foo.html export HTTPD_SCRIPTALIAS=/usr/web slinger &

Файлы:

Для web-сервера slinger требуются стек TCP/IP (включенный в io-pkt-*) и разделяемые библиотеки libsocket.so.

Переменные окружения:

Конфигурация сервера Slinger
Slinger использует следующие переменные среды для установки собственной конфигурации:
PATH
Путь к интерпретатору команд и исполняемой команде интерпретатора, используемой в команде SSI exec. Для получения дополнительной информации см. exec.
CMD_INT
Путь или имя программы командного интерпретатора, используемой для интерпретации строки, переданной команде SSI exec (например, /bin/sh). Если путь не задан, Slinger осуществляет поиск пути в переменной среды PATH для программы командного интерпретатора.
HTTPD_ROOT_DIR
Имя каталога, в котором сервером Slinger осуществляется поиск файлов данных. Значение по умолчанию – /usr/local/httpd.
HTTPD_ROOT_DOC
Имя основного документа (например, index.html). Когда web-клиент запрашивает основной документ, HTTPD_ROOT_DOC присоединяется к HTTPD_ROOT_DIR, при этом формируется полный путь к основному документу. Имя по умолчанию – index.html.

Например, переменная среды HTTPD_ROOT_DOC определена как index.html, а переменная среды HTTPD_ROOT_DIR/usr/www. Slinger присоединяет index.html к /usr/www, в результате создается имя /usr/www/index.html.
HTTPD_SCRIPTALIAS
Каталог, в котором сервером Slinger выполняется поиск исполняемых файлов CGI.

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

Например допустим, что в переменной среды HTTPD_SCRIPTALIAS указано имя каталога /cgi/bin. Если сервер Slinger получает запрос на ресурс www.kpda.ru/cgi-bin/get_data.cgi/foo, то выполняется сценарий get_data.cgi, находящийся в каталоге /cgi/bin, и foo передается (в качестве информации о пути) в get_data.cgi. Каталог foo определен в переменной среды PATH_INFO (см. описание ниже).

Note: По соображениям безопасности системы не следует использовать /bin или /usr/bin в качестве каталога CGI-сценариев.

Доступно для CGI-сценариев
Slinger устанавливает следующие переменные среды для использования в CGI-сценариях:
ACCEPT_LANGUAGE
Языки, воспринимаемые удаленным клиентом.
CONTENT_LENGTH
Длина прикрепленной информации для метода POST.
CONTENT_TYPE
Тип прикрепленной информации для метода POST.
DOCUMENT_ROOT
Местоположение файлов данных. (То же, что HTTP_ROOT_DIR)
FORWARDED
Имя прокси-сервера, через который обрабатывается web-страница.
FROM
Имя удаленного клиента.
GATEWAY_INTERFACE
Имя и версия интерфейса CGI, предоставляемого сервером Slinger.
HTTP_ACCEPT
Принимаемые клиентом MIME-типы, полученные из заголовков HTTP.
HTTP_USER_AGENT
Браузер, используемый клиентом для отправки запросов.
PATH
Путь к интерпретатору команд и исполняемой команде интерпретатора, используемой в команде SSI exec.
PATH_INFO
Дополнительные передаваемые данные о пути.
PATH_TRANSLATED
Путь из переменной среды PATH_INFO, присоединенный к пути из переменной среды HTTPD_ROOT_DIR.
QUERY_STRING
Необработанная строка запроса, переданная удаленным клиентом.
REFERER
URL-адрес страницы HTML, с которой на удаленном клиенте был выполнен переход на текущую страницу.
REMOTE_ADDR
IP-адрес удаленного клиента.
REMOTE_HOST
Имя хоста удаленного клиента.
REMOTE_IDENT
Имя удаленного пользователя, если поддерживается идентификация в соответствии с RFC 931.
REMOTE_PORT
Порт удаленного клиента.
REMOTE_USER
Имя пользователя, используемое для проверки аутентификации удаленного клиента.
REQUEST_METHOD
Метод, которым была запрошена текущая web-страница (GET или POST).
SCRIPT_NAME
Имя выполняемого сценария.
SERVER_ADMIN
Контактная информация администратора сервера Slinger, указанная в опции Slinger -a.
SERVER_NAME
Имя компьютера, на котором выполняется сервер Slinger.
SERVER_PORT
Порт IP, прослушиваемый сервером Slinger.
SERVER_PROTOCOL
Имя и версия протокола HTTP, предоставляемого сервером Slinger.
SERVER_SOFTWARE
Имя программного обеспечения Slinger.
SERVER_ROOT
Текущий рабочий каталог сервера Slinger.
TZ
Часовой пояс.

Предостережения:

Связь с web-сервером slinger осуществляется с использованием сокетов TCP, поэтому требуется поддержка среды выполнения для сокетов. Это означает, что должен работать стек TCP/IP.

При конфигурировании утилиты slinger примите меры по устранению неоправданного риска для системы:

Эти меры предосторожности предотвращают несанкционированные замену файла паролей или изменение web-страниц.

При конфигурировании утилиты slinger для поддержки CGI необходимо учитывать следующее:

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

Классификация:

Базовые подсистемы ЗОСРВ «Нейтрино»

Тематические ссылки:

ds, io-pkt-*

Основано на RFC 2068




Предыдущий раздел: Сервисы