Как добавить страничку к WWW интерфейсу

Исходники страниц не пишутся в том виде, в котором они помещаются на сервер. Это неудобно и сложно. Вместо написания .shtml страниц "в лоб" используется макропроцессор gm4 и макробиблиотека к нему.

Чтобы дописать свою страничку, раскройте исходники и моместите в нужный Вам каталог исходник с расширением .4tml. Потом добавьте имя страницы в Makefile в том каталоге, где разместили исходник, в список HTML. Имя страницы надо указывать без расширения. Так, если Вам нужна страница на сервере с именем _somepage.shtml, То надо создать исходник с именем _somepage.4tml, а в список внести имя _somepage. Тогда при трансляции Ваш файл автоматически попадет в index.shtml Вашего каталога с тем именем ссылки, которое Вы определили в hpage макрокоманде. Если же не нужно, что бы Ваша новая страница попала в индекс, то включите ее в список HTM. Не в каждом Makefile есть такой список. Если его еще не было, то в такой Makefile надо добавить строки:

        HTM	= _somepage

        .for I in ${HTM}
         DATA	+= ${I}.shtml
         MISC	+= ${I}.4tml
        .endfor
       
И отослать предложение мне. Зачем? ISPMS/ISPDB быстро развивается, и Вам захочется (или придется) ставить новые версии. Не очень удобно, если после установки каждой новой версии Вам придется править индексные файлы, что бы включить Вашу страничку в общую структуру. К тому же автору сопровождать множество страничек проще, чем каждому сисадмину (к тому же, возможно, плохо ориентирующемуся в структуре таблиц, функций и прав) сопровождать свое. Кстати, для того, что бы файлы из дистрибутива не затерли местное творчество, советую локально добавленные файлы именовать со знака _ (подчеркивание) в начале идентификатора.

Впрочем, допускаю, что идея с отсылкой мне дополнений не понравится. Нет проблем. Вместо включения локальных файлов в индекс во время трансляции можно воспользоваться механизмом virdir.


В примерах исходного текста ниже символы и обозначают открывющую и закрывающую кавычки gm4 соответственно, это символы <Control>U и <Control>V, как назначено в макробиблиотеке для трансляции исходников в .shtml. Страница в исходном тексте в общем виде выглядит так:
        hpage(ЗАГОЛОВОК СТРАНИЦЫ,dnl
        <!-- $Id$ -->
        Статическая часть страницы
        exec(dnl
        Ввод параметров из строки запроса
        Другие команды для /bin/sh
        sqlour(dnl
        Текст для исполнения psql
        )dnl
        Команды для /bin/sh
        )dnl
        Статическая часть страницы
        )
       
Не все части в этом примере необходимы. Вот пример статической страницы:
        hpage(ЗАГОЛОВОК СТРАНИЦЫ,dnl
        <!-- $Id$ -->
        Пример: HTML текст
        )
       
А вот пример страницы, где есть только вывод PostgreSQL:
        hpage(ЗАГОЛОВОК СТРАНИЦЫ,exec(sqlour(dnl
        -- $Id$
        SELECT now()
        )))
       
Описание ввода параметров вынесено в отдельный раздел, здесь же достаточно знать, что параметры из командной строки вводятся в переменные шелла.

Команда sqlour обеспечивает вывод информации из PostgreSQL "как есть", выводятся только поля записей, никак между собой не разделенные, и каждая запись кончается новой строкой.

Например, такой исходник

        hpage(Пример,exec(sqlour(dnl
        -- $Id$
        SELECT * FROM int_type
        )))
       
породит такую примерно страницу:

Пример

0freeСвободен 1intТолько для внутрисистемных нужд 2extВо внешний мир 3multiК интерфейсам разных клиентов 4monoК интерфейсам одного клиента 5midМежмаршрутизаторные интерфейсы 6nullТрафик на выброс 7noneИнтерфейс отсутствует
что скорее всего не соответствует ожиданиям. Как же правильно составить эту страницу? Надо явно указать все необходимое оформление:
        hpage(Пример,exec(sqlour(dnl
        -- $Id$
        \echo  '<table border=1>'
        \echo  ' <tr>'
        \echo  '  <th>Индекс типа интерфейса</th>'
        \echo  '  <th>Тип интерфейса</th>'
        \echo  '  <th>Описание</th>'
        \echo  ' </tr>'
        SELECT ' <tr>
        '    , '  <td>' || int_type || '</td>
        '    , '  <td>' || nint_type || '</td>
        '    , '  <td>' || comment || '</td>
        '    , ' </tr>'
         FROM int_type
        ;
        \echo  '</table>'
        )))
       
породит уже нечто более разумное:

Пример

Индекс типа интерфейса Тип интерфейса Описание
0 free Свободен
1 int Только для внутрисистемных нужд
2 ext Во внешний мир
3 multi К интерфейсам разных клиентов
4 mono К интерфейсам одного клиента
5 mid Межмаршрутизаторные интерфейсы
6 null Трафик на выброс
7 none Интерфейс отсутствует
Для упрощения разработки страниц и удобства поддержки единого стиля интерфейса имеются множество функций для отображения различных элементов выводимой информации. Например, для изображения ячеек таблицы можно использовать функции:
hd_l(text)
Ячейка таблицы, в которой text выравнивается по левому краю
hd_c(text)
Ячейка таблицы, в которой text центрируется
hd_r(text)
Ячейка таблицы, в которой text выравнивается по правому краю
ATTN(text)
Используется для выделения текста, применяется в текстовом контексте
Пример выше можно переписать с использованием этих функций:
        hpage(Пример,exec(sqlour(dnl
        -- $Id$
        \echo  '<table border=1>'
        \echo  ' <tr>'
        \echo  '  <th>Индекс типа интерфейса</th>'
        \echo  '  <th>Тип интерфейса</th>'
        \echo  '  <th>Описание</th>'
        \echo  ' </tr>'
        SELECT ' <tr>
        '    , hd_r(int_type)
             , hd_c('ATTN(' || nint_type || ')')
             , hd_l(comment)
             , ' </tr>'
         FROM int_type 
        ;
        \echo  '</table>'
        )))
       
Таким образом составленный исходник породит страницу примерно такого вида:

Пример

Индекс типа интерфейса Тип интерфейса Описание
0 free Свободен
1 int Только для внутрисистемных нужд
2 ext Во внешний мир
3 multi К интерфейсам разных клиентов
4 mono К интерфейсам одного клиента
5 mid Межмаршрутизаторные интерфейсы
6 null Трафик на выброс
7 none Интерфейс отсутствует
Макрокоманды gm4, которые можно (и нужно) использовать при оформлении страницы:
ATTN(text)
Пример применения уже приведен выше. Когда используется в SQL выражениях, то надо помнить, что порождает текстовые константы, поэтому надо использовать ее в текстовом контексте, как это сделано в примере выше.
esql(SQL)
В контексте скрипта для /bin/sh порождает выполнение SQL текста интерфейсом psql.
Можно использовать как для вывода в stdout непосредственно, так и для присвоения, как в этом примере:
          mac=`esql(SELECT mac FROM ispdb_riface WHERE nrouter = '${router}' AND niface = '${iface}')`
         
incv(URL)
Создает оператор include интерпретатора SSI
Используется в контексте .shtml
hpage(TITLE,BODY)
Примеры употребления описаны выше. Без четкого знания gm4 отступать от образца не рекомендую.
dditem(URL,TITLE)
Создает пункт в перечислении ссылок. Используется, например, для создания index.shtml файлов и в аналогичных случаях.
Используется в контексте .html
exec(OPERATOR)
Примеры употребления описаны выше. Без четкого знания gm4 отступать от образца не рекомендую.
cxec(OPERATOR)
Обеспечивает оператор OPERATOR средой выполнения, которая достаточно точно совпадает со средой выполнения в SSI.
Используется в CGI для того, что бы можно было использовать те же самые тексты, что изготовлены для exec(OPERATOR) и применяются в контексте SSI
use_id(ПЕРЕМЕННАЯ)
В контексте sh скрипта порождает буквально следующую конструкцию:
          "${ПЕРЕМЕННАЯ}"
         
Использовалось раньше для того, что бы не считать уровень вложения кавычек и способ их экранирования. Сейчас, скорее всего, уже не нужно.
GETPARM
GETnPARM
get_name
get_named
get_numed
NAMED
NUMER
Обеспечивают ввод переменных из строки запроса. Подробнее описаны в главе, посвященной вводу параметров
sqlout(SQL)
Устаревшая форма, похожа на sqlour(SQL), но перед выполнением предопределяется формат вывода HTML, как это определено в интерфейсе psql
Текстовые константы - заголовки колонок для таблиц:
HMARKERЧеловек?
RMARKERОформлен?
YMARKERРазрешен?
AMARKERСостояние счета (автоматическое отключение)
SMARKER?
PMARKER?
XMARKERДоговор не расторгнут?
TMARKERВнутренние переменные тарифной программы
hdoc(TITLE,BODY)
Отличается от hpage(TITLE,BODY) тем, что не порождает заголовка <h1>TITLE</h1>.
Для экзотических применений, поскольку обычно заголовок в <title> совпадает с заголовком в <h1>
hpage2(TITLE,BODY)
hdoc2(TITLE,BODY)
Отличаются от hpage(TITLE,BODY) и hdoc(TITLE,BODY) тем, что включают header другого стиля. При разработке интерфейса предполагается, что в этом стиле обеспечен регулярный перезапрос страницы, для мониторинга, например.
Функции PostgreSQL, облегчающие разработку страниц:
o_id(name)
Порождает имя договора, которое является одновременно ссылкой на учетную страницу договора.
o_inet(inet, text)
Порождает запись IP адреса или сети, которая одновременно явлается ссылкой на text с параметром inet
o_email(text)
text - email адрес, порождает запись этого адреса, которая одновременно является ссылкой на этот адрес.
o_email(text, name)
text - login, name - код POP3 сервера. Порождает запись адреса в зоне, которую обслуживает заданный сервер, и эта запись является ссылкой на порожденный адрес. Если сервер обслуживает несколько зон, то адрес создается только один, с самой приоритетной зоной.
o_faddr(name, name)
Параметры - улица и номер дома. Порождает запись адреса дома, которая является ссылкой на таблицу с параметром адрес. В этой таблице представлены все договары в этом доме.
o_htmlbar(text,int4,int4)
Порождает цветной прямоугольник заданных размеров. Задумана для того, что бы строить графики. Первый параметр - URL картинки с цветной точкой, второй - высота прямоугольника, третий - его ширина.
o_common(bool)
Создает изображение бита (двоичной величины). вид определяется стилем, строки common в таблице const_out
o_sel(text, text, text, text)
o_sel(text, text, text)
o_opt_user(name)
o_opt_iface(name)
o_opt_router(name)
o_opt_eserver(name)
o_opt_contract(name)
o_opt_tarif_ip(name)
o_opt_tarifcompl(name)
o_opt_op(name)
o_form_bool(name, text, bool)
o_form_text(name, text, text)
o_form_chuse(name, text, text)
h_form_bool(name, bool)
h_form_parm(name, text)
h_form_area(name, text)
h_form_text(name, text)
h_form_chus(name, text)
h_form_chuse(name, text)
loud_tiket(oid, oid, text, text)
loud_tiket(oid, oid, text)
Предназначены для редактирования, пока не описаны
text(bool)
Преобразует bool в текст TRUE или FALSE
o_bit(oid, bool, name, name, name)
Изображает бит, который является ссылкой на изменение этого бита. Параметры:
o_bit(oid, bool, name, name)
Предыдущая функция с последним параметром NULL
o_bit(bool,name)
Изображает бит со значением bool и именем name
o_rm(oid, name, name)
Изображает значок удаления и ссылку на нем для удаления Параметры:
o_rv(oid, name)
Похожа на предыдущую функцию, но не умеет работать с VIEW.
o_up(text, oid, name)
Изображает значок редактирования и ссылку на нем для редактирования. Устарела, не используется.
o_ed(oid,n ame)
Изображает значок редактирования и ссылку на нем для редактирования. Параметры:
o_updt(oid, name, name)
Изображает значки редактирования и удаления и ссылки на них для этих действий. Параметры:
o_updt(oid, name)
Предыдущая функция с последним параметром NULL
o_vpdt(oid, name)
Похожа на предыдущую функцию, но не умеет работать с VIEW.
o_in(text, name, text)
Изображает значок добавления и ссылку на нем для добавления. Устарела, не используется.
o_inn(text, name, name)
Вариант o_in(text, name, text) Устарела, не используется.
o_add(name, name, text)
Изображает значок добавления и ссылку на нем для добавления. Похоже, уже устарела.
o_add(name, name)
Изображает значок добавления и ссылку на нем для добавления. Параметры:
hd_l(text,int)
Изображает ячейку таблицы с выравниванием по левому краю. Если ячейка пуста, то все равно прорисовывается. Параметры:
hd_l(text)
Частный случай hd_l(text, int) без rowspan
hd_c(text,int)
Изображает ячейку таблицы с выравниванием по центру. Если ячейка пуста, то все равно прорисовывается. Параметры:
hd_c(text)
Частный случай hd_c(text, int) без rowspan
hd_r(text, int)
Изображает ячейку таблицы с выравниванием по правому краю. Если ячейка пуста, то все равно прорисовывается. Параметры:
hd_r(text)
Частный случай hd_r(text, int) без rowspan
he_l(text,int)
Изображает ячейку таблицы с выравниванием по левому краю. Если ячейка пуста, то не прорисовывается. Параметры:
he_l(text)
Частный случай he_l(text, int) без rowspan
he_c(text, int)
Изображает ячейку таблицы с выравниванием по центру. Если ячейка пуста, то не прорисовывается. Параметры:
he_c(text)
Частный случай he_c(text, int) без rowspan
he_r(text, int)
Изображает ячейку таблицы с выравниванием по правому краю. Если ячейка пуста, то не прорисовывается. Параметры:
he_r(text)
Частный случай he_r(text, int) без rowspan
o_tripl(text)
o_tripl(text, text, text)
o_tripl(text, int, text, int, text)
Используются в формах для упрощения транслятора форм. Скорее всего вручную применять смысла нет.
Это описание никак не заменяет необходимость изучить SQL в общем и PostgreSQL в частности. Также полезно изучить gm4 (GNU m4) для разработок чуть сложнее тривиальной.

А.А.Бабайлов (C)2003..2022