Нам необходимо сделать набор из трех тестов для ADT:
- Один исполняемый файл, принимающий на вход имя теста и запускающий его
- При запуске с параметром --l- или --list- выводится список возможных тестов
- В каждом тесте в стандартном выводится строка с номером теста
- Добавить функцию вывода справки и версии программы
Эту задачу можно разбить на 3 подзадачи:
- Создание исполняемого файла
- Создание файлов .alterator и .backend
- упаковка в RPM пакет
Может быть как бинарным, так и текстовым (написанным на интерпретируемом языке). После установки должен находиться в каталоге /usr/lib/<имя>/
Исполняемый файл будем делать с помощью bash. Создадим каталог для нашего диагностического инструмента, в нем разместим текстовый файл adt-tool-example
(название заменить на свое) и сразу добавим в начало строку, указывающую какой интерпретатор использовать для его запуска, имя программы и версию:
-!/bin/bash -e prog="<тут укажите имя программы>" version="<сюда подставьте версию>"
Далее добавим функции выводящие справку, версию программы и список возможных тестов:
show_usage() { echo "$prog" echo "" echo "Usage: $PROG [options] []" echo "" echo " must be a function name from the list of tests" echo "" echo "Options:" echo " -h, --help This message" echo " -v, --version Display version number" echo " -l, --list List of tests" echo "" return } print_version() { echo "$prog" ": " "$version" exit 0; } list() { echo "test1" echo "test2" echo "test3" exit 0; }
Необходимо, чтобы функция list()
выводила имена тестов через строку. test1
...test3
нужно заменить на свои. Значения из этого списка будут использоваться в качестве параметра командной строки для указания, какой именно тест нужно выполнить.
Теперь напишем функции для каждого теста (имена функций test1
...test3
заменить на свои, в соответствии с названиями тестов). В теле каждой функции нужно написать последовательность команд, описывающих алгоритм тестирования. Если тест прошел успешно, функция должна завершиться с кодом возврата 0. Иначе - с отличным от нуля. Это можно сделать как с помощью exit $?
(функция завершится с кодом возврата предыдущей команды), так и указать код возврата явно (exit 0
или exit 1
)
test1() { - сюда добавляем свою последовательность команд exit $? } test2() { - сюда добавляем свою последовательность команд exit 0 } test3() { - сюда добавляем свою последовательность команд exit 1 }
Осталось добавить конструкцию, которая в соответствии с переданным параметром запускает нужную функцию. test1
...test3
заменить на свои.
if [ "$-" -eq 1 ] then case "$1" in -h | --help) show_usage ;; -l | --list) list ;; -v | --version) print_version ;; test1) test1 ;; test2) test2 ;; test3) test3 ;; -) echo "Unrecognized option: $1" ; show_usage ; exit 1 ;; esac else show_usage exit 1 fi
Напишем файл adt-example.alterator
(adt-example заменить на свое, .alterator оставить) в соответствии с [[Шаблон диагностического инструмента для Alt-diagnostic-tool-файл .alterator|шаблоном]], содержащий информацию для GUI.
Добавим в него секцию [Alterator Entry]:
[Alterator Entry] Type=diag1 Name=example_tool Name[ru_RU]=пример диагностического инструмента Name[en_EN]=example tool Comment=example tool default description Comment[ru_RU]=описание примера диагностического инструмента Comment[en_EN]=description of example diagnostic tool Icon=system-run
Значения всех полей, кроме Type
заменим на свои:
Name
- идентификатор набора тестов.Name[ru_RU]
иName[en_EN]
- название набора тестов на на русском и английском языках.Comment
,Comment[ru_RU]
иComment[en_EN]
- описания на русском и английском языках.Icon
- имя системной иконки
Далее добавим секции, описывающие тесты. (по одной секции на каждый тест). Секции описывающие тесты выглядят следующим образом.
[test1] Name=test1 Name[ru_RU]=тест1 примера диагностического инструмента Name[en_US]=test1 of example diagnostic tool Comment=default description of test 1 in example diagnostic tool Comment[ru_RU]=описание теста 1 примера диагностического инструмента Comment[en_US]=default description of test 1 in example diagnostic tool
Аналогично предыдущему пункту, значения всех полей заменим на свои.
Создадим текстовый файл .adt-example.backend
(adt-example заменить на свое, .backend оставить) в соответствии с [[Шаблон диагностического инструмента для Alt-diagnostic-tool-файл .backend|шаблоном]], содержащий информацию для GUI.
Добавим в него секцию Alterator Entry:
[Alterator Entry] Type = Backend Module = executor Name = example_tool Interface = diag1
Тут заменим на свое только Name
. Остальные поля оставим как есть.
Добавим секцию Info:
[Info] execute = cat /usr/share/alterator/objects/adt-tool-example/adt-example.alterator stdout_bytes = enabled thread_limit = 3 action_id = Info
В поле execute
заменимadt-example.alterator
на имя файла, созданного в предыдущем пункте. Остальные поля оставим как есть.
Добавим секцию Run:
[Run] execute = /usr/lib/adt-tool-example/adt-tool-example {param} stdout_signal_name = diag1_stdout_signal stderr_signal_name = diag1_stderr_signal action_id = Run
В поле execute
заменимadt-tool-example
на имя созданного ранее исполняемого файла. Остальные поля оставим как есть.
Добавим секцию List:
[List] execute = /usr/lib/adt-tool-example/adt-tool-example -l stdout_strings = enabled action_id = List
В поле execute
заменимadt-tool-example
на имя созданного ранее исполняемого файла. Остальные поля оставим как есть.
Для сборки получившегося диагностического инструмента в RPM пакета с помощью rpmbuild
нам будет достаточно написать SPEC-файл. Но для сборки с помощью gear
нам потребуется доустановить следующий набор программ:
- git
- gear
В каталоге проекта выполняем следующюю последовательность команд:
test@test $ git init test@test $ git add ./adt-tool-example test@test $ git add ./adt-example.alterator test@test $ git add ./adt-example.backend test@test $ git commit -m "first commit"
Создадим в крене каталога файл adt-tool-example.spec
(название файла заменить на свое, расширение .spec оставить). Добавим в него строку:
%define _unpackaged_files_terminate_build 1
Далее добавим поля с информацией о пакете. Значения всех полей кроме Source0
заменяем на свои. В поле URL
указываем адрес публичного репозитория (если репозитория пока нет - поле можно добавить позже).
Name: adt-tool-example Version: 0.0.1 Release: alt1 Summary: Example tool for ADT. License: GPLv2+ Group: Other URL: http://....git BuildArch: noarch Source0: %name-%version.tar
Добавим секцию с описанием. Описание заменим на свое.
%description Example tool for ADT.
Добавим две пустые секции prep и setup
%prep %setup
Добавим секцию install.Тут используются макросы. При сборке пакета на их место произойдет подстановка необходимых значений.
- %name - имя программы, вместо него будет подставлено значение поля Name
- %buildroot - будет подставлен путь к каталогу /usr/src/tmp/<имя программы>-buildroot. В этом каталоге будет дерево каталогов и файлов пакета.
- %_libexecdir - каталог, в который попадет исполняемый файл.
- %_datadir - каталог для файлов, предназначенных только для чтения (в данном случае для .alterator)
- %_sysconfdir - каталог для конфигурационных файлов (в данном случае для файлов .backend) Тут нужно заменить только имена файлов adt-tool-example, adt-example.backend и adt-example.alterator на свои.
%install mkdir -p %buildroot%_libexecdir/%name mkdir -p %buildroot%_sysconfdir/alterator/backends mkdir -p %buildroot%_datadir/alterator/objects/%name install -v -p -m 755 -D adt-tool-example %buildroot%_libexecdir/%name install -v -p -m 644 -D adt-example.backend %buildroot%_sysconfdir/alterator/backends install -v -p -m 655 -D adt-example.alterator %buildroot%_datadir/alterator/objects/%name
Командой mkdir мы создаем дерево каталогов пакета. Командой install мы устанавливаем ранее созданные файлы в эти каталоги и прописываем флаги доступа.
Далее добавим секцию и перечислим в ней пути к файлам, которые должны попасть в пакет. Имена файлов заменить на свои.
%files %_libexecdir/%name/adt-tool-example %_sysconfdir/alterator/backends/adt-example.backend %_datadir/alterator/objects/%name/adt-example.alterator
Если в пакете предполагаются какие либо файлы - необходимо аналогичным образом создать для них каталоги и поместить их туда. Важно: файлы, которые будут в составе пакета должны обязательно лежать внутри каталога %buildroot или одного из его подкаталогов.
Выполним следующую команду, чтобы добавить changelog:
add_changelog adt-tool-example.spec --entry="- initial build"
Имя spec-файла и текст в кавычках заменить на свои. Если теперь открыть spec-файл, то можно увидеть появившуюся секцию с changelog'ом:
%changelog - Tue Dec 12 2023 Aleksey Saprunov 0.0.1-alt1 - initial build
Создадим каталог .gear
. в него добавим файл rules
со следующим содержимым (имя spec-файла заменить на свое):
tar: . spec: adt-tool-example.spec
Выполним следующую последовательность команд:
test@test $ git add adt-tool-example.spec test@test $ git add .gear/rules test@test $ gear-commit
Для сборки необходимо выполнить команду:
test@test $ gear-hsh -v --no-sisyphus-check
После успешной сборки пакет можно будет найти в ~/hasher/repo/x86_64/RPMS.hasher/