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