YaST/Tutorials/Simple YaST Module/Cleaning Up Skeleton for the SSHD Configuration
Содержание
Подготовка основы SSHD конфигуратора
В этой главе проект будет освобождён от ненужных файлов и функций, а так же будет описано поведение конфигуратора SSHD и создан пользовательский интерфейс. Содержимое исходных файлов модуля YaST рассматривалось ранее в этом руководстве.
Модификация исходных файлов
При генерации модуля YaST утилитой y2tool, были созданы файлы и функции, часть которых надо удалить.
Изменения в каталоге scr/:
Измененные исходные файлы можно скачать здесь, либо можно по ходу изучения главы скачивать файлы по одному.
Файлы Sshd2.pm и Makefile.am
Файл Sshd2.pm полностью был удален из проекта, а так же должна быть изменена соответствующая запись в файле Makefile.am поскольку при попытке инсталляции с некорректным файлом Makefile.am возникнет ошибка.
Оригинальная версия:
module_DATA = \
Sshd.ycp \
Sshd2.pm
Новая версия:
module_DATA = \
Sshd.ycp
Файл Sshd.ycp
ПРИМЕЧАНИЕ:
Конфигурация данного модуля обеспечивает только базовый функциональный интерфейс без использования глобальных переменных.
Основная причина создания именно такой конфигурации модуля – это более легкий контроль над данными. Глобальные переменные могут быть некорректно изменены другим модулям.
Ниже описаны изменения в файле Sshd.ycp, а уже измененный файл можно взять Sshd.ycp здесь
Очистка исходного кода от ненужных функций:
- Удалить функцию
Modified()(bа также определение global boolean Modified...). - Удалить функцию
AbortFunction(). - Удалить функцию
Abort(). - Удалить функцию
Export(). - Удалить функцию
Summary(). - Удалить функцию
Overview(). - Удалить функцию
AutoPackages(). - Удалить функцию
Import().
Изменения и добавление нового функционала:
- Удалить дескриптор global из всех определений переменных, для того чтобы изменить внутренние данные, возможно было бы только используя функции.
Оригинал:
global boolean modified = false;
Изменение:
boolean modified = false;
- Добавить строки:
import "Service"; import "Popup";
после аналогичных записей. Эти модули будут использованы позже.
- Добавить новое определение переменной:
integer sl = 1000;
после определения boolean modified.… Эта переменная используется для определения длины пауз между шагами строки прогресса при выполнении операций чтения и записи.
- Добавить определение новой функции
GetModified(), сразу после строкиinteger sl = 1000;:
/**
* Функция возвращает true если была изменены настройки, иначе возвращает false.
*/
global boolean GetModified() {
return modified;
}
- После функции
SetModified(), добавить новую функциюGetModified():
/**
* Сообщает, что конфигурация была изменена.
*/
global void SetModified() {
modified = true;
}
- Изменить функцию
Abort():
/**
* Возвращает всплывающий диалог, в котором пользователь должен подтвердить отмену.
*/
global boolean Abort() {
return Popup::ReallyAbort(GetModified());
}
- Добавить функцию
PollAbort()после функцииAbort():
/**
* Проверяет нажатие кнопки «Отмена» (Abort)
* И при нажатии вызывает функцию Abort
*
* В случае подтверждения отмены возвращает true
*/
global boolean PollAbort() {
if (UI::PollInput() == `abort)
return Abort();
return false;
}
- Изменить функцию
Read():
Два ненужных состояния прогресса были удалены. Изменена часть текста, например «Sshd» заменен на «SSHD».
/**
* Чтение всех настроек SSHD
* возвращает true в случае успеха
*/
global boolean Read() {
/* Заголовок окна диалога чтения SSHD */
string caption = _("Initializing SSHD Configuration");
integer steps = 2;
Progress::New( caption, " ", steps, [
/* Шаг прогресса 1/2 */
_("Read current SSHD configuration"),
/* Шаг прогресса 2/2 */
_("Read current SSHD state")
], [
/* Шаг прогресса 1/2 */
_("Reading current SSHD configuration..."),
/* Шаг прогресса 2/2 */
_("Reading current SSHD state..."),
/* Прогресс завершен */
Message::Finished()
],
""
);
sleep(sl);
if(PollAbort()) return false;
Progress::NextStage();
/* Сообщение об ошибке */
if(false) Report::Error(Message::CannotReadCurrentSettings());
sleep(sl);
if(PollAbort()) return false;
Progress::NextStep();
/* Сообщение об ошибке */
if(false) Report::Error(_("Cannot read current SSHD state."));
sleep(sl);
if(PollAbort()) return false;
Progress::NextStage ();
sleep(sl);
modified = false;
return true;
}
- Изменить функцию
Write():
Часть текста была изменена, например Sshd на SSHD. Message::SuSEConfigFailed() заменена на Message::CannotAdjustService("sshd").
/**
* Запись всех настроек SSHD
* возвращает true в случае успеха
*/
global boolean Write() {
/* Заголовок окна диалога записи SSHD */
string caption = _("Saving SSHD Configuration");
integer steps = 2;
Progress::New(caption, " ", steps, [
/* Шаг прогресса 1/2 */
_("Write the SSHD settings"),
/* Шаг прогресса 2/2 */
_("Adjust the SSHD service")
], [
/* Шаг прогресса 1/2 */
_("Writing the SSHD settings..."),
/* Шаг прогресса 2/2 */
_("Adjusting the SSHD service..."),
Message::Finished()
],
""
);
sleep(sl);
if(PollAbort()) return false;
Progress::NextStage();
/* Сообщение об ошибке */
if(false) Report::Error (_("Cannot write SSHD settings."));
sleep(sl);
if(PollAbort()) return false;
Progress::NextStage ();
/* Сообщение об ошибке */
if(false) Report::Error (Message::CannotAdjustService("sshd"));
sleep(sl);
Progress::NextStage ();
sleep(sl);
return true;
}
Файл complex.ycp
Измененный файл complex.ycp можно скачать здесь.
Из изменений в файле, только удаление ненужных функций:
- Удалить функцию
Modified(). - Удалить функцию
ReallyAbort(). - Удалить функцию
PollAbort(). - Удалить функцию
SummaryDialog(). - Удалить функцию
OverviewDialog().
Файл dialogs.ycp
Измененный файл dialogs.ycp можно скачать здесь.
Ниже приведены изменения в файле:
Удалены ненужные функции:
- Удалить функцию
Configure1Dialog(). - Удалить функцию
Configure2Dialog().
Добавить новые функции:
- Добавит новую функцию
ServerConfigurationDialog().
Эта функция создает диалог с использованием модуля Wizard, а затем обрабатывает ввод пользователя в бесконечном цикле. После нажатия кнопок «Отмена» (Abort) или «Далее» (Nex), обработчик выходит из цикла и возвращает идентификатор нажатой кнопки, как результат функции.
/**
* Диалог конфигурации сервера
*
* возвращает результат работы диалогового окна
*/
any ServerConfigurationDialog() {
/* Заголовок диалога */
string caption = _("SSHD Server Configuration");
term contents = `VBox (
`Left(`Label(_("SSHD TCP Ports"))),
`Left(
`VBox (
`MinSize( 40, 5,
/* Шапка таблицы */
`Table(`id("Port"), `header("Port"), [])
),
`HBox (
/* нажатие кнопки */
`PushButton(`id("add_port"), _("&Add...")),
/* нажатие кнопки */
`PushButton(`id("edit_port"), _("&Edit...")),
/* нажатие кнопки */
`PushButton(`id("delete_port"), _("&Delete"))
),
`VSpacing(1),
`Frame (
/* заголовок диалоговой области */
_("Server Features"),
`VBox (
/* флажок */
`Left(`CheckBox(`id("AllowTcpForwarding"), _("Allow &TCP Forwarding"))),
/* флажок */
`Left(`CheckBox(`id("X11Forwarding"), _("Allow &X11 Forwarding"))),
/* флажок */
`Left(`CheckBox(`id("Compression"), _("Allow &Compression")))
)
),
`VStretch()
)
)
);
Wizard::SetContentsButtons(caption, contents, HELPS["server_configuration"]:"",
Label::BackButton(), Label::NextButton());
Wizard::DisableBackButton();
any ret = nil;
while(true) {
ret = UI::UserInput();
/* отмена? */
if(ret == `abort) {
if(Sshd::Abort()) break;
else continue;
/* далее */
} else if(ret == `next) {
break;
/* неизвестная ситуация */
} else {
y2error("unexpected retcode: %1", ret);
continue;
}
}
Wizard::RestoreBackButton();
return ret;
}
В модуле определена таблица портов TCP, связанная с кнопками Add..., Edit... и Delete. В надписях на кнопках Add... и Edit... добавлено многоточие потому что они открывают новое диалоговое окно поверх текущего. Опции Server Features расположены на виджете Frame.
- Добавить новую функцию
LoginSettingsDialog().
Эта функция создает диалог с использованием модуля Wizard, а затем обрабатывает ввод пользователя в бесконечном цикле. После нажатия кнопок Abort, Next или Back, обработчик выходит из цикла и возвращает идентификатор (ID) нажатой кнопки, как результат функции.
/**
* Диалог настройки аутентификации
*
* возвращает результат работы диалогового окна
*/
any LoginSettingsDialog() {
/* загаловок диалога */
string caption = _("SSHD Server Login Settings");
term contents = `VBox(
`Frame (
_("General Login Settings"),
`VBox (
/* Флажок */
`Left(`CheckBox(`id("PrintMotd"), _("Print &Message of the Day After Login"))),
/* Флажок */
`Left(`CheckBox(`id("PermitRootLogin"), _("Permi&t Root Login")))
)
),
`VSpacing(1),
`Frame (
_("Authentication Settings"),
`VBox (
/* Ввод текста */
`Left(`TextEntry(`id("MaxAuthTries"), _("Ma&ximum Authentication Tries"))),
/* Флажок */
`Left(`CheckBox (`id("PasswordAuthentication"), _("Pa&sswordAuthentication"))),
/* Флажок */
`Left(`CheckBox (`id("RSAAuthentication"), _("RSA Authenti&cation"))),
/* Флажок */
`Left(`CheckBox (`id("PubkeyAuthentication"), _("Public &Key Authentication")))
)
),
`VStretch()
);
Wizard::SetContentsButtons(caption, contents, HELPS["login_settings"]:"",
Label::BackButton(), Label::NextButton());
Wizard::SetNextButton(`next, Label::AcceptButton());
any ret = nil;
while(true) {
ret = UI::UserInput();
/* отмена? */
if(ret == `abort) {
if(Sshd::Abort()) break;
else continue;
/* далее */
} else if(ret == `next) {
break;
} else if(ret == `back) {
break;
/* неизвестная ситуация */
} else {
y2error("unexpected retcode: %1", ret);
continue;
}
}
Wizard::RestoreNextButton();
return ret;
}
Это простой диалог содержит две области General Login Settings и Authentication Settings с флажками.
Файл helps.ycp
Измененный файл helps.ycp можно скачать здесь.
Ниже приведены изменения в файле:
- Удалить справку для summary, overview, c1 и c2.
- Добавить справку для
server_configurationиlogin_settings
/* справка для диалога Server Configuration */
"server_configuration" : _("<p><b><big>Server Configuration</big></b><br>
Configure SSHD here.<br></p>"),
/* справка для диалога Login Settings dialog */
"login_settings" : _("<p><b><big>Login Settings</big></b><br>
Configure SSHD login settings here.<br></p>"),
<pre>
'''NOTE:''' Structure of helps is:
<pre>
map HELPS = $[
// TRANSLATORS: Комментарии для переводчиков (это текст справки для …)
"help_for" : _("Текст справки, отмеченный для перевода... "),
];
Файл sshd.ycp
Измененный файл sshd.ycp можно скачать здесь
Ниже приведены изменения в файле:
- Удалить определение command line.
- Удалить поддержку installation proposal.
Клиент по-прежнему запускается с поддержкой модуля CommandLine с пустым определением командной строки только, для того чтобы сообщить, что интерфейс командной строки не доступен для этого модуля, если кто-либо попытается запустить его.
Файл sshd_auto.ycp
Этот файл был полностью удален из пакета, а также соответствующие записи в файле Makefile.am.
Файл sshd_proposal.ycp
Этот файл был полностью удален из пакета, а также соответствующие записи в файле Makefile.am.
Файл Makefile.am должен быть изменен следующим образом.
Оригинальная версия:
client_DATA = \
sshd.ycp \
sshd_auto.ycp \
sshd_proposal.ycp
Новая версия:
client_DATA = \
sshd.ycp
Файл wizards.ycp
Измененный файл wizards.ycp можно скачать здесь
Ниже приведены изменения в файле:
- Удалить функцию
AddSequence(). - Удалить функцию
AutoSequence().
Изменения в каталоге testsuite/
Наборы тестов были разработаны для того, чтобы проверять глобальный функционал, например соответствие функций модулей. Они могут также помочь определить, когда что-то используемое модулем, было внезапно изменено.
В этой обучающей программе были полностью удалены все тесты testsuite/tests/Sshd.*, создание и управление наборами тестов планируется рассмотреть позже в другой статье.
Контрольная точка разработки проекта
На данном этапе разработки приложение уже можно запустить для этого надо выполнить ниже перечисленные инструкции.
# Перейти в основной каталог проекта cd sshd # Внести некоторые изменения в Make файлы make -f Makefile.cvs # Проверить синтаксис и выполнить компиляцию YCP модулей make # Установить проект в систему sudo make install # Запустить приложение в графическом режиме sudo /sbin/yast2 sshd # ... либо в текстовом sudo /sbin/yast sshd
Так как диалоги все еще не связаны с данными, то все поля пусты, а так же не возможно сохранить изменения в конфигурации.
Изображения ниже показывают текущее состояние модуля:
ВАЖНО Теперь для того чтобы в любой момент проверить изменения в исходном коде, надо выполнить следующие команды:
# Перейти в каталог с измененными файлами cd sshd/src/ # Скомпилировать и установить файлы в систему sudo make install # Запустить приложение sudo /sbin/yast2 sshd

