slinger

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

Синтаксис:

slinger [-a администратор] [-c] [-d] [-e]

[-i адрес] [-n] [-p номер_порта] [-s]

Поддерживаемые платформы:

Neutrino

Опции:

-a администратор

Контактная информация администратора Slinger (например, -a my_admin@something.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.

Описание:

Утилита 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.

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

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

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

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

где:

<!--

Начальный разделитель комментария SGML/HTML.

#

Указывает серверу Slinger, что в комментарии содержится команда.

тег

Команда SSI.

набор_переменных

Один или несколько аргументов команды SSI.

значение

Одно или несколько значений для набора переменных.

-->

Конечный разделитель комментария SGML/HTML.

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

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

Команды SSI

Допустимые команды SSI: break, config, echo, exec, if, goto, include, label и qnxvar.

 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 используются следующие аргументы:

cgi – путь и имя файла для CGI-сценария. Синтаксис:

<!--#exec cgi="исполняемый_файл[/путь]" -->

где:

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

Имя исполняемого файла CGI.

путь

Информация о пути, передаваемая в исполняемый_файл. (Информация о пути, предоставляемая CGI-сценариям, также может содержаться в переменной среды PATH.)

Например допустим, что существует CGI-сценарий othello.cgi и в переменной среды HTTPD_SCRIPTALIAS указан каталог /web/games/. Если на страницу HTML поместить следующий маркер, то сервер Slinger выполняет поиск сценария othello.cgi в каталоге /web/games/:

<!--#exec cgi="othello.cgi" -->

cmd – запустить командный интерпретатор и выполнить исполняемую команду командного интерпретатора. Синтаксис:

<!--#exec cmd="[путь/]исполняемый_файл [аргументы]" -->

где:

[путь/]исполняемый_файл

Имя исполняемой команды.
аргументы
Список аргументов командной строки.

Маркер cmd использует переменную среды CMD_INT для определения командного интерпретатора (программа_командного_интерпретатора) и затем запускает командный интерпретатор с помощью следующего кода:

программа_командного_интерпретатора -c "строка"

где строка имеет следующий формат: [путевое_имя/]исполняемый_файл [аргументы].

Если полный путь не предоставлен, Slinger использует путь, указанный в переменной среды PATH и позволяющий определить, где находятся программа_командного_интерпретатора и исполняемый_файл. Вывести выходные данные можно с помощью следующей команды:

<!--#config cmdecho="ON" -->

Пример.

<!--#config cmdecho="ON" -->

<!--#exec cmd="cd /home/smr; ls" -->


 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.

Примечание. Знаку равенства должен предшествовать пробел.

Пример совместного использования команд goto и label:

<!--#goto ="change_temp" -->

<!--Пропустить эту часть страницы HTML. -->

<!--#label ="change_temp" -->

<!--Slinger продолжает сканировать -->

<!--код HTML. -->

 include

Вставить содержимое файла на страницу HTML. В команде include используются следующие аргументы:

file – Синтаксис:

<!--#include file="путь" -->

где путь является путем и именем файла для файла HTML относительно каталога текущей web-страницы. Не следует использовать абсолютные пути и ../ в пути (поскольку невозможно включить путь, начинающийся с уровня выше текущего каталога).


Если необходимо включить файлы, которые находятся в том же каталоге, что и рабочий каталог, используется тег file. Например предположим, что существует каталог web/support/docs/, содержащий два файла (my_doc.html и docs.html) и используется URL-адрес www.something.com/support/docs/docs.html. Для вставки файла my_doc.html на страницу HTML, введите следующий маркер:

<!--#include file="my_doc.html" -->

Файл my_doc.html указан относительно каталога (web/support/docs) текущего документа (docs.html).

virtual – Синтаксис:

<!--#include virtual="путь" -->

где путь является путем и именем файла относительно корневого каталога на сервере Slinger (этот каталог указан в переменной среды HTTPD_ROOT_DIR).

Если введен тег virtual, Slinger начинает поиск файла с корневого каталога. Например предположим, что существует каталог web/support/docs/, содержащий файл my_doc.html и в переменной среды HTTPD_ROOT_DIR указан каталог web. Для вставки файла my_doc.html на страницу HTML с URL-адресом web/support/docs/my_doc.html введите следующий маркер:

<!--#include virtual="/support/docs/my_doc.html" -->

include является рекурсивной командой; каждый вставляемый файл также может содержать маркеры include.

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

 label

При обнаружением сервером Slinger команды goto перейти к маркеру label на странице HTML. Синтаксис команды label:

<!--#label ="имя_метки" -->


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

Пример.

<!--#label ="change_temp" -->

 qnxvar

Получить данные от процесса сервера данных или изменить данные этого процесса. В команде qnxvar используются следующие аргументы:

format – установить формат для последующего отображения (на странице HTML) данных, полученных от процесса сервера данных. Синтаксис:

<!--#qnxvar format="[текст] %s [текст] " -->


где:
%s
Метка-заполнитель для значения переменной.

текст

Текст, в котором могут содержаться теги HTML, например<P>.

Формат остается в силе до появления следующего оператора format. Пример.

<!--#qnxvar format="I work for %s." -->

Если необходимо вывести символ %, сопровождаемый переменной, введите \% %s. Для вывода %s введите \%s.

read – получить значение переменной от процесса сервера данных и отобразить результат в том же месте на странице HTML, где находится маркер qnxvar. Синтаксис:

<!--#qnxvar read="имя_переменной длина [имя_переменной длина]" -->

где длина – размер в байтах.

Данные выводятся до обнаружения нулевой строки (NULL) или достижения заданной длины данных. Формат результата определяется тегом format. Пример.

<!--#qnxvar read="company_name 20" -->

write – изменить переменную в процессе сервера данных. Синтаксис:

<!--#qnxvar write="имя_переменной "данные"" -->

где переменная данные является строкой. Пример.

<!--#qnxvar write="set.temperature "300"" -->


Примечание. Максимальная длина строковой переменной имя_переменной составляет 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="действие" -->

Возможные значения переменной действие:

goto – перейти к маркеру с меткой. Синтаксис:

<!--#config onerr="goto метка" -->

Пример.

<!--#config onerr="goto oven_temp" -->

Синтаксис:

<!--#config onerr="print " строка"" -->

где строка является любой символьной строкой или тегом HTML.

printbreak – вывести текст и прекратить передачу документа HTML клиенту. Синтаксис:

<!--#config onerr="printbreak " строка"" -->

где строка является любой символьной строкой или тегом HTML. Пример.

<!--#config onerr="printbreak "<P>printbreak

error encountered. Terminating transmission of HTML

text."" -->

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 для некоторого устройства:




Использование сервера данных

Для использования динамического 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.qnx.com

Status

Возврат кода состояния и пояснения клиенту. Если сценарий выполнен успешно, Slinger возвращает состояние 200 OK (если состояние не было изменено сценарием).

Status: 200 OK


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

Примечание. 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.

CMD_INT

Путь или имя программы командного интерпретатора, используемой для интерпретации строки, переданной команде SSI exec cmd (например, /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.qnx.com/cgi-bin/get_data.cgi/foo, то выполняется сценарий get_data.cgi, находящийся в каталоге /cgi/bin, и foo передается (в качестве информации о пути) в get_data.cgi. Каталог foo определен в переменной среды PATH_INFO (см. описание ниже).

Примечание. По соображениям безопасности системы не следует использовать /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 необходимо учитывать следующее:
Дополнительная мера предосторожности: храните документы и сценарии в разных местоположениях. Это предотвратит несанкционированное чтение или изменение сценариев другими пользователями.