Вы здесь

Долгушин Д. Администрирование через web-интерфейс. Программа WEBMIN.

Webmin — это набор скриптов, позволяющий администрировать операционную систему через веб-интерфейс, в большинстве случаев, позволяя обойтись без использования командной строки и запоминания системных команд и их параметров. Используя любой браузер, администратор может создавать новые учётные записи пользователей, почтовые ящики, изменять настройки служб и сервисов, например: веб-сервера Apache, DNS и других.

Webmin состоит из простого веб-сервера и большого количества скриптов, которые собственно и осуществляют связь между командами администратора через веб-интерфейс и их исполнением на уровне операционной системы и прикладных программ. Webmin написан полностью на языке Perl и не использует никаких дополнительных нестандартных модулей.

Webmin позволяет легко добавлять свои модули, не изменяя при этом кода системы. Рассмотрим подробнее как добавить свой модуль в систему.

Каждый модуль имеет свой собственный подкаталог в корневом каталоге системы Webmin, в котором расположены все cgi файлы и файлы конфигурации. Узнать расположение корневого каталога Webmin можно в конфигурационном файле /ets/webmin/miniserv.conf.

Каждый модуль должен содержать следующие файлы:
- module.info содержит информацию о модуле;
- image/icon.gif иконка модуля, для отображения в главном меню Webmin;
- lang/en файлы языковых версий;
- index.cgi главный файл модуля;

После того как мы создали каталог модуля и все выше названные файлы, мы должны сделать следующее:

1. удалить файл кэша загруженных модулей /etc/webmin/module.infos.cache
2. добавить права на созданный модуль в файле /etc/webmin/webmin.acl

Файл module.info содержит информацию о модуле, такую как название, категория и поддерживаемые операционные системы.

desc = Тested module
os_support = *-linux

Если мы хотим сделать модуль доступным в конкретной операционной системы, мы можем написать:

os_support = arch-linux

Также мы можем выбрать категорию модуля, в которой он будет отображаться в главном меню Webmin. На выбор нам доступны 4 категории: servers, system, net и hardware.

category = system

Web-сервер, входящий в Webmin, использует файлы с расширением cgi как cgi-программы, как и большинство других web-серверов. Все меню, формы и другие страницы каждого модуля генерируются такими cgi-программами, поэтому для написания модуля необходимо знание
основных понятий cgi-программирования и html-верстки. Все cgi программы запускаются с привилегиями пользователя root, для того чтобы обеспечить возможность редактировать конфигурационные файлы.

При разработке нового модуля мы можем добавить в категорию модуля файл, который называется название_дирректории-lib.pl. В этом файле будут находиться общие функции нашего модуля. Рассмотрим пример такой библиотеки. Пусть каталог нашего модуля называется
test_module и в нем уже есть все необходимые файлы, такие как module.info, index.cgi и другие.
Создадим файл test_module-lib.pl следующего содержания

BEGIN { push(@INC, ".."); };
use WebminCore;
init_config();

//далее идут функции нашего модуля

sub get_test_module_config
{
my $lref = &read_file_lines($config{'test_module_conf'});
my @rv;
my $lnum = 0;
foreach my $line (@$lref) {
my ($n, $v) = split(/\s+/, $line, 2);
if ($n) {
push(@rv, { 'name' => $n, 'value' => $v, 'line' => $lnum });
}
$lnum++;
}
return @rv;
}

Рассмотрим подробнее наш файл test_module-lib.cgi. Начнем с первых 2 строк.

BEGIN { push(@INC, ".."); };
use WebminCore;

Эти строки позволяют нам подключить файлы Webmin API и использовать их функции,
что значительно упрощает разработку модуля.

Webmin API главным образом сосредоточено в файлах
1. web-lib-funcs.pl основные функции Webmin, такие как контроль пользователей, анализ конфигурационных файлов многие другие

2. ui-lib.pl функции для построения пользовательского интерфейса

Webmin API имеет достаточно много функций, поэтому мы коснемся только нескольких в нашем примере. Строка init_config(); вызывает соответствующую функцию из Webmin API, которая инициализирует окружение модуля. На данном этапе устанавливается значение нескольких переменных нашего модуля, например хеш %config, в котором содержится
текущая конфигурация модуля. Так же проверяется, имеет ли текущий пользователь права доступа к модулю (файл /etc/webmin/webmin.acl).

Далее следует пример функции, которая считывает конфигурацию из файла и возвращает в массив.

Теперь рассмотрим основной файл нашего модуля index.cgi. Поместим в него следующие строки:

#!/usr/bin/perl

require 'test_module-lib.pl';
ui_print_header(undef, $text{'index_title'}, "", undef, 1, 1);

$conf = get_test_module_config();
$test = find($conf, "test");
print &text('index_test', $test),"

\n";

ui_print_footer("/", $text{'index'});

Рассмотрим подробнее наш index.cgi
Строка require 'test_module-lib.pl'; подключает нашу библиотеку функций и вызывает функцию init_config(). Функции ui_print_header и ui_print_footer генерируют html-header и html-footer соответственно. Обе этих функции находятся в файле ui-lib.pl и являются функциями Webmin API.

Хэш %text содержит в себе информацию, загруженную из файла интернационализации lang/en, структуру которого мы рассмотрим его позднее. Далее демонстрируется использование функции из нашей библиотеки get_test_module_config(), после чего ищем в файле конфигурации поле test и выводим его значение на экран.

Теперь рассмотрим файл интернационализации lang/en. Добавим в него следующее содержимое.

index_title = Foobar Web Server
index_test = Test value is $1.

После того как вызывается функция init_config(), текущий файл считывается в хэш %text и становиться доступным в нашем модуле. Как видно в поле index_test использутся плейсхолдер $1. Функцией &text('index_test', "value") он заменится на "value".

Каждый модуль может иметь свой конфигурационный файл, который располагается в дирректории /etc/webmin/название модуля/config. После вызова функции init_config(), текущий файл считывается в хэш %config и становиться доступным в нашем модуле. Файл config имеет формат, аналогичный файлу интернационализации

ключ = значение

Теперь можно зайти через браузер и проверить, что наш модуль работает.

Яндекс.Метрика