Webmin custom command menu parameter
Webmin предлагает удобный веб-интерфейс для управления linux сервером
Одной из возможностей является функциональность пользовательских команд
Webmin custom command
Для заведения команды вводятся ее параметры, что запустить в командной строке, под каким пользователем и с какими параметрами
В качестве параметров может использоваться поле для ввода текста, опции, бинарный выбор
Одной из возможностей является меню
В качестве параметра для меню указывается имя текстового файла, в котором указаны опции меню
В документации по webmin указано, что в файле одна опция — это одна строка в файле, при этом первая часть строки — это сам параметр, который передается в команду, потом запятая, затем текстовое описание этого параметра, которое видит пользователь, как пункт меню
В реальности (актуально для версии Webmin 2.303), парсер файла ищет связки параметр — описание в файле, разделенные пробелом
И если в параметре уже есть пробелы, то его нужно заключить в кавычки
Для строк можно использовать # в начале строки как комментарий
Вот файл, который получился для occ команд nextcloud:
"maintenance:repair --include-expensive" "Maintenance repair all"
"db:add-missing-columns" "Add missing columns"
"db:add-missing-indices" "Add missing indices"
"app:list" "List of installed applications"
"maintenance:mode --off" "Switch off maintenance mode"
"update" "Proceed with update"
Сам парсер находится в исходном файле webmin \custom\custom-lib.pl и выглядит следующим образом:
# read_opts_file(file)
# Read the file containing possible menu options for a command
sub read_opts_file
{
local @rv;
local $file = $_[0];
if ($file !~ /^\// && $file !~ /\|\s*$/) {
local @uinfo = getpwnam($remote_user);
if (@uinfo) {
$file = "$uinfo[7]/$file";
}
}
my $h;
$h = "<" if ($file =~ /^\// && $file !~ /\|\s*$/);
open(FILE, "$h".$file);
while(<FILE>) {
s/\r|\n//g;
next if (/^#/);
if (/^"([^"]*)"\s+"([^"]*)"$/) {
push(@rv, [ $1, $2 ]);
}
elsif (/^"([^"]*)"$/) {
push(@rv, [ $1, $1 ]);
}
elsif (/^(\S+)\s+(\S.*)/) {
push(@rv, [ $1, $2 ]);
}
else {
push(@rv, [ $_, $_ ]);
}
}
close(FILE);
return @rv;
}