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 имеет формат, аналогичный файлу интернационализации
ключ = значение
Теперь можно зайти через браузер и проверить, что наш модуль работает.