Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
Рис. 29.14. Обработка завершена, вывод результатов
29.5.3. Заполнение списка
Если HTML–страницы являются действительно динамическими, следует предусмотреть возможность заполнения списков или таблицы текущими данными, выбранными из существующего файла, вместо того, чтобы жестко кодировать эти данные в сценариях cgi.
Следующий сценарий реализует заполнение раскрывающегося списка данными, содержащимися в текстовом файле list Этот файл находится во временном каталоге, но не в корневом каталоге web–сервера. Цикл while используется для считывания содержимого (построчно( из файла. Для заполнения списка используется следующий кода:
echo "<OPTION>$LINE"
Выбранный элемент присваивается переменной menu_selection. Ниже приводится сценарий, заполняющий элементы меню; действие формы не указывается.
$ pg populat.cgi
#!/bin/sh
#сценарий populat.cgi
#заполнение раскрывающегося списка значениями из текстового файла
echo "Content-type: text/html"
echo ""
echo "<HTML>"
echo "<BODY>"
echo "<H4> CGI FORM….populat.cgi..populate pull-down list from a text
file</H4>"
echo "<SELECT NAME=menu_selecflon>"
echo "<OPTION>— PICK AN OPTION —"
# считывание значений из файла для заполнения опций списка
while read LINE
do
echo "<OPTION>$LINE" done < ../temp/list
echo "</SELECT>"
echo "</FORM>"
echo "</BODY>"
echo "</HTML>"
29.5.4. Автоматическое обновление Web–страницы
При использовании cgi для программирования заданий, выполняющих функции мониторинга либо контроля, часто бывает удобно выполнять обновление страниц в непрерывном режиме. Для этого вызывается пользовательский сценарий или страница. Ниже приводится тег, вызывающий выполнение сценария dfspace.cgi каждые 60 секунд.
<meta http-equiv="Refresh" content="60;URL=http:/linux.pc/cgi-bin/dfspace.cgi">"
Здесь ключевым словом является слово Refresh. Благодаря его использованию Web–сервер получает сведения о загрузке данной страницы, а строка "content=60" задает время (в секундах( между повторными загрузками. Для обновления сценария просто добавьте имя сценария в качестве части адреса URL.
В распоряжении автора имеются несколько контролирующих сценариев, выполняющих опрос всех основных хостов в сети. Благодаря их применению можно сразу же определить, какие хосты выполняются, а какие -oтключены. Более симпатичный вид сценарию придает использование в тексте вместо опций on и off зеленых и красных шариков.
Ниже приводится сценарий, использующий часть вывода df и отображающий файловую систему и количество полей в таблице.
Следующий сегмент кода реализует заголовок таблицы, в который помещаются наименования колонок. При использовании таблиц с неотформатированным выводом может происходить потеря данных.
echo "<TABLE align="center" cellspacing="20" border=9 width="40%"
cols="2">"
echo "<TH align="center">- Capacity % -</TH>"
echo "<TH align="center">- File System -</TH>"
Параметр cellspacing устанавливает расстояние между внутренними и внешними границами таблицы. Параметр border хранит число, определяющее толщину табличной рамки. Параметр col s определяет количество столбцов в таблице. Ниже приведена основная часть описываемого сценария.
df | sed 1d | awk '(print $5"\t"$6>' | while read percent mount
do
echo "<TR><TD align="center"><B>$percent</B></TD><TD align="center">$mount</TD></TR>"
done
С помощью команды df выполняется перенаправление посредством редактора sed для удаления заголовка, затем выполняется перенаправление к awk и считывание в пятом и шестом столбцах. Результаты присваиваются переменным percent и mount.
Аббревиатура TR обозначает строку таблицы, а TD — табличные данные. Тем самым определяется место, куда направляется информация.
Ниже приведен текст соответствующего сценария. Конечно, 60 секунд — это слишком много при мониторинге небольших файловых систем, но при перемещении большого количества файлов в файловых системах полезно отображать информацию об этом на протяжении целой минуты!
$ pg dfspace.cgi
#!/bin/sh
# сценарий dfspace.cgi
echo "Content-type: text/html"
echo ""
# автоматическое обновление каждые 60 секунд
echo "<meta http-equiv="Refresh" content="60;URL=http:/"linux.pc/cgi-bin/dfspace.cgi">"
echo "<HTML>"
echo "<HR>"
echo "<A NAME="LINUX. PC Filesystems">LINUX. PC Filesystems</A>"
echo "<TABLE align="center" cellspacing="20" border=9 width="40%"
cols="2">"
echo "<TH align="center">- Capacity % -</TH>"
echo "<TH align="center">- File System -</TH>"
# получение вывода из df, но сначала фильтруется нужная информация!
df | sed 1d | awk '{print $5"\t"$6}' | while read percent mount
do
echo "<TR><TD align="center"><B>$percent</B></TDXTD align="center">$mount</TD>
</TR>"
done
echo "</TABLE>"
echo "</HTML>"
При вводе URL
http://<имя_сервера>/cgi-bin/dfspace.cgi
в окне броузера отображается вывод, показанный на рис. 29.15. В вашем случае могут наблюдаться отличия.
Рис. 29.15. Использование вывода команды df для генерирования таблиц
29.6. Заключение
Сценарии cgi обеспечивают создание весьма привлекательного пользовательского интерфейса. Страницы HTML могут использоваться в качестве интерфейса для всех распространенных задач, выполняющих обработку информации.
Создаваемые сценарии могут применяться для мониторинга, создания интерфейса, запросов к базам данных и решения других задач. Язык HTML является стандартным форматом для создания документации, поставляемой вместе с программным обеспечением.