Как добавить страничку к 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)
-
Изображает бит, который является ссылкой на изменение этого бита.
Параметры:
oid
строки с этим битом
bool
значение этого бита
name
имя таблицы
name
имя колонки с этим битом
-
name
если операцию надо производить
над VIEW, специально созданном для этого, то параметр '_v'
,
иначе NULL
o_bit(oid, bool, name, name)
- Предыдущая функция с последним параметром
NULL
o_bit(bool,name)
-
Изображает бит со значением
bool
и именем name
o_rm(oid, name, name)
-
Изображает значок удаления и ссылку на нем для удаления
Параметры:
oid
строки к удалению
name
имя таблицы
-
name
если операцию надо производить
над VIEW, специально созданном для этого, то параметр '_v'
,
иначе NULL
o_rv(oid, name)
- Похожа на предыдущую функцию, но не умеет работать с
VIEW
.
o_up(text, oid, name)
-
Изображает значок редактирования и ссылку на нем для редактирования.
Устарела, не используется.
o_ed(oid,n ame)
-
Изображает значок редактирования и ссылку на нем для редактирования.
Параметры:
oid
строки к редактированию
name
имя таблицы
o_updt(oid, name, name)
-
Изображает значки редактирования и удаления и ссылки на них для этих действий.
Параметры:
oid
строки к редактированию
name
имя таблицы
-
name
если операцию надо производить
над VIEW, специально созданном для этого, то параметр '_v'
,
иначе NULL
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)
-
Изображает значок добавления и ссылку на нем для добавления.
Параметры:
name
имя таблицы
text
имя договора
hd_l(text,int)
-
Изображает ячейку таблицы с выравниванием по левому краю.
Если ячейка пуста, то все равно прорисовывается.
Параметры:
text
содержимое ячейки
int
параметр rowspan
ячейки
hd_l(text)
- Частный случай
hd_l(text, int)
без rowspan
hd_c(text,int)
-
Изображает ячейку таблицы с выравниванием по центру.
Если ячейка пуста, то все равно прорисовывается.
Параметры:
text
содержимое ячейки
int
параметр rowspan
ячейки
hd_c(text)
- Частный случай
hd_c(text, int)
без rowspan
hd_r(text, int)
-
Изображает ячейку таблицы с выравниванием по правому краю.
Если ячейка пуста, то все равно прорисовывается.
Параметры:
text
содержимое ячейки
int
параметр rowspan
ячейки
hd_r(text)
- Частный случай
hd_r(text, int)
без rowspan
he_l(text,int)
-
Изображает ячейку таблицы с выравниванием по левому краю.
Если ячейка пуста, то не прорисовывается.
Параметры:
text
содержимое ячейки
int
параметр rowspan
ячейки
he_l(text)
- Частный случай
he_l(text, int)
без rowspan
he_c(text, int)
-
Изображает ячейку таблицы с выравниванием по центру.
Если ячейка пуста, то не прорисовывается.
Параметры:
text
содержимое ячейки
int
параметр rowspan
ячейки
he_c(text)
- Частный случай
he_c(text, int)
без rowspan
he_r(text, int)
-
Изображает ячейку таблицы с выравниванием по правому краю.
Если ячейка пуста, то не прорисовывается.
Параметры:
text
содержимое ячейки
int
параметр rowspan
ячейки
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