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

Так как диалоги все еще не связаны с данными, то все поля пусты, а так же не возможно сохранить изменения в конфигурации.

Изображения ниже показывают текущее состояние модуля:

T1-progress-dialog1.png

T1-progress-dialog2.png

ВАЖНО Теперь для того чтобы в любой момент проверить изменения в исходном коде, надо выполнить следующие команды:

# Перейти в каталог с измененными файлами
cd sshd/src/

# Скомпилировать и установить файлы в систему
sudo make install

# Запустить приложение
sudo /sbin/yast2 sshd

Далее