Программу, приведенную в данном примере, можно применять для создания собственных файлов настройки. Если добавить эти файлы в каталог SMIT, который поставляется вместе с операционной системой, то к ним можно будет обратиться с помощью пункта Приложения главного меню SMIT. Здесь представлены работающие версии разделов описания, за исключением Примера 3, в котором не устанавливается никаких языков.
#----------------------------------------------------------------
# Введение:
# Прежде чем создавать новую базу данных SMIT, необходимо решить,
# в каком месте в иерархии меню будет находиться меню вашего приложения.
# Новое меню будет ссылаться на другие меню, заголовки и
# окна диалогов. Мы, например, вставляем указатель на новое
# меню вслед за опцией меню "Приложения". Значение next_id для пункта
# меню "Приложения" равно "apps", поэтому мы начинаем с создания
# menu_opt со значением id, равным "apps".
#----------------------------------------------------------------
sm_menu_opt:
id = "apps"
id_seq_num = "010"
next_id = "demo"
text = "Примеры программ SMIT"
next_type = "m"
sm_menu_opt:
id = "demo"
id_seq_num = "010"
next_id = "demo_queue"
text = "Пример 1: Добавить очередь печати"
next_type = "n"
sm_menu_opt:
id = "demo"
id_seq_num = "020"
next_id = "demo_mle_inst_lang_hdr"
text = "Пример 2: Добавить язык для уже установленного приложения"
next_type = "n"
#----
# Поскольку demo_mle_inst_lang_hdr - описательное имя, но его трудно
# запомнить, то для ссылки на это окно можно создать более простой
# псевдоним.
#----
sm_menu_opt:
id = "demo_lang"
next_id = "demo_mle_inst_lang_hdr"
next_type = "n"
alias = "y"
sm_menu_opt:
id_seq_num = "030"
id = "demo"
next_id = "demo_lspv"
text = "Пример 3: Оглавление физического тома"
text_msg_file = "smit.cat"
next_type = "n"
sm_menu_opt:
id_seq_num = "040"
id = "demo"
next_id = "demo_date"
text = "Пример 4: Изменить/показать дату, время"
text_msg_file = "smit.cat"
next_type = "n"
#----------------------------------------------------------------
# Пример 1
# ------
# Цель: Добавить очередь печати. Если пакет printers.rte не установлен,
# то он должен устанавливаться автоматически. Если пользователь работает
# со MSMIT (SMIT с оконным интерфейсом), то для выполнения этой задачи
# будет запускаться графическая программа. В противном случае
# управление передается задаче очереди печати SMIT.
#
# Вопросы: 1. Обработанный вывод & cmd_to_classify
# 2. Переменная среды SMIT (msmit или ascii)
# 3. name_hdr для динамического окна
# 4. name_hdr для потомка динамического окна
# 5. Создание опции "OK / Отмена"
# 6. dspmsg для преобразований
# 7. Режим exit/exec
# 8. id_seq_num для опции name_hdr
#----------------------------------------------------------------
#----
# Вопросы: 1,4
# Следует отметить, что значение next_id совпадает со значением id.
# Помните, что обработанный вывод cmd_to_classify добавляется в next_id,
# так как задан тип "c". Поэтому значением для next_id будет либо
# demo_queue1, либо demo_queue2. Вывод name_hdr не показывается,
# а значение cmd_to_list в demo_queue_dummy_opt не указано,
# т.е. окно с данным name_hdr будет динамическим.
#----
sm_name_hdr:
id = "demo_queue"
next_id = "demo_queue"
option_id = "demo_queue_dummy_opt"
name = "Добавить очередь печати"
name_msg_file = "smit.cat"
name_msg_set = 52
name_msg_id = 41
type = "c"
ghost = "y"
cmd_to_classify = "\
x()
{
# Проверяется, установлен ли файл принтера.
lslpp -l printers.rte 2>/dev/null 1>/dev/null
if [[ $? != 0 ]]
then
echo 2
else
echo 1
fi
}
x"
next_type = "n"
#----
# Вопросы: 2,4
# Определив, что программное обеспечение принтера установлено, мы
# хотим узнать, запускать ли для данной задачи программу GUI,
# или переходить в текстовое окно SMIT. Для этого мы проверяем
# значение переменной среды SMIT, которое равно "m" для оконного
# (Motif) или "a" для текстового (ascii) режима. Здесь вывод
# cmd_to_classify снова передается в next_id.
#----
sm_name_hdr:
id = "demo_queue1"
next_id = "mkpq"
option_id = "demo_queue_dummy_opt"
has_name_select = ""
ghost = "y"
next_type = "n"
type = "c"
cmd_to_classify = "\
gui_check()
{
if [ $SMIT = \"m\" ]; then
echo gui
fi
}
gui_check"
sm_name_hdr:
id = "mkpqgui"
next_id = "invoke_gui"
next_type = "d"
option_id = "demo_queue_dummy_opt"
ghost = "y"
#----
# Вопрос: 7
# Примечание: значение exec_mode для команды равно "e"; это означает,
# что перед запуском cmd_to_exec программа SMIT завершается.
#----
sm_cmd_hdr:
id = "invoke_gui"
cmd_to_exec = "/usr/bin/X11/xprintm"
exec_mode = "e"
ghost = "y"
sm_cmd_opt:
id = "demo_queue_dummy_opt"
id_seq_num = 0
#----
# Вопросы: 3,5
# Программное обеспечение принтера не установлено. Установите
# его и вернитесь к demo_queue1, чтобы проверить значение переменной
# среды SMIT. Это name_hdr для динамического окна. cmd_to_list для
# sm_cmd_opt будет немедленно появляться на экране в виде всплывающей опции,
# вместо того, чтобы ждать, пока пользователь введет данные.
# В этом динамическом окне cmd_opt задает окно "OK/Отмена",
# в котором пользователю требуется просто нажать клавишу Return.
#----
sm_name_hdr:
id = "demo_queue2"
next_id = "demo_queue1"
option_id = "demo_queue_opt"
name = "Добавить очередь печати"
name_msg_file = "smit.cat"
name_msg_set = 52
name_msg_id = 41
ghost = "y"
cmd_to_classify = "\
install_printers ()
{
# Установить пакет принтера.
/usr/lib/assist/install_pkg \"printers.rte\" 2>&1 >/dev/null
if [[ $? != 0 ]]
then
echo "Ошибка при установке printers.rte"
exit 1
else
exit 0
fi
}
install_printers "
next_type = "n"
#----
# Вопросы: 5,6,8
# Здесь cmd_opt используется как окно "OK/Отмена". Следует также отметить,
# что для просмотра текста опции применяется команда dspmsg. Это
# позволяет преобразовывать сообщения.
# Примечание: значение id_seq_num для опции равно 0. Для каждого заголовка name_hdr
# разрешена только одна опция, и ее номер id_seq_num должен быть равен 0.
#----
sm_cmd_opt:
id = "demo_queue_opt"
id_seq_num = "0"
disc_field_name = ""
name = "Добавить очередь печати"
name_msg_file = "smit.cat"
name_msg_set = 52
name_msg_id = 41
op_type = "l"
cmd_to_list = "x()\
{
if [ $SMIT = \"a\" ] \n\
then \n\
dspmsg -s 52 smit.cat 56 \
'Для автоматической установки поддержки принтера нажмите Enter.\n\
Для отмены нажмите F3.\n\
'\n\
else \n\
dspmsg -s 52 smit.cat 57 'Для автоматической установки программного обеспечения
принтера щелкните на данном пункте.\n' \n\
fi\n\
} \n\
x"
entry_type = "t"
multi_select = "n"
#----------------------------------------------------------------
#
# Пример 2
# ------
# Цель: Добавление языка для уже установленного приложения. Часто
# рекомендуется предоставить пользователю некоторую информацию,
# перед тем как открывать какое-либо окно диалога. Для этой цели
# можно использовать имена заголовков (sm_name_hdr).
# В данном примере для определения устанавливаемого языка и
# установочного устройства используются два заголовка.
# В окне диалога предусмотрены поля ввода информации,
# необходимой для выполнения задачи.
#
# Вопросы:
# 1. Сохранение выходных данных от последовательных name_hdrs
# в cooked_field_name
# 2. Вызов функций getopts внутри cmd_to_exec для обработки
# информации в cmd_opt
# 3. Определение кольцевого списка или списка cmd_to_list для просмотра
# на экране значений cmd_opts
#----------------------------------------------------------------
#----
# Вопрос: 1
# Это первый name_hdr. Он вызывается из menu_opt для данной функции.
# Мы хотим сохранить данные, введенные пользователем, для последующего
# использования в окне диалога. Параметр, передаваемый в cmd_to_classify,
# вводится/выбирается пользователем. Cmd_to_classify очищает
# вывод и сохраняет его в переменной, определяемой в cooked_field_name.
# При этом переопределяется значение, заданное по умолчанию для
# вывода cmd_to_classify, которое равно _cookedname. Переопределение
# необходимо из-за того, что нам нужно сохранить вывод
# из следующего name_hdr.
#----
sm_name_hdr:
id = "demo_mle_inst_lang_hdr"
next_id = "demo_mle_inst_lang"
option_id = "demo_mle_inst_lang_select"
name = "Добавить язык для уже установленного приложения"
name_msg_file = "smit.cat"
name_msg_set = 53
name_msg_id = 35
type = "j"
ghost = "n"
cmd_to_classify = "\
foo() {
echo $1 | sed -n \"s/[^[]*\\[\\([^]]*\\).*/\\1/p\"
}
foo"
cooked_field_name = "add_lang_language"
next_type = "n"
help_msg_id = "2850325"
sm_cmd_opt:
id = "demo_mle_inst_lang_select"
id_seq_num = "0"
disc_field_name = "add_lang_language"
name = "Устанавливаемый язык"
name_msg_file = "smit.cat"
name_msg_set = 53
name_msg_id = 20
op_type = "l"
entry_type = "n"
entry_size = 0
required = ""
prefix = "-l "
cmd_to_list_mode = "a"
cmd_to_list = "/usr/lib/nls/lsmle -l"
help_msg_id = "2850328"
#----
# Вопрос: 1
# Это второй name_hdr. Здесь данные, введенные пользователем, передаются
# непосредственно через cmd_to_classify и сохраняются в переменной
# add_lang_input.
#----
sm_name_hdr:
id = "demo_mle_inst_lang"
next_id = "demo_dialog_add_lang"
option_id = "demo_add_input_select"
has_name_select = "y"
name = "Добавить язык для уже установленного приложения"
name_msg_file = "smit.cat"
name_msg_set = 53
name_msg_id = 35
type = "j"
ghost = "n"
cmd_to_classify = "\
foo() {
echo $1
}
foo"
cooked_field_name = "add_lang_input"
next_type = "d"
help_msg_id = "2850328"
sm_cmd_opt:
id = "demo_add_input_select"
id_seq_num = "0"
disc_field_name = "add_lang_input"
name = "Устройство/каталог для загрузки программного обеспечения"
name_msg_file = "smit.cat"
name_msg_set = 53
name_msg_id = 11
op_type = "l"
entry_type = "t"
entry_size = 0
required = "y"
prefix = "-d "
cmd_to_list_mode = "1"
cmd_to_list = "/usr/lib/instl/sm_inst list_devices"
help_msg_id = "2850313"
#----
# Вопрос: 2
# Каждое значение cmd_opts преобразуется к специальному формату
# (тире, затем одиночный символ и необязательный параметр), позволяющий
# обрабатывать его командой getopts. Двоеточие после буквы в команде
# getopts означает, что после опции с тире ожидается параметр.
# Это наилучший способ обработки информации, содержащейся в cmd_opt,
# если задается несколько опций, в особенности если одна из них
# пропускается, что приводит к нарушению последовательности $1, $2,
# и т.д.
#----
sm_cmd_hdr:
id = "demo_dialog_add_lang"
option_id = "demo_mle_add_app_lang"
has_name_select = ""
name = "Добавить язык для уже установленного приложения"
name_msg_file = "smit.cat"
name_msg_set = 53
name_msg_id = 35
cmd_to_exec = "\
foo()
{
while getopts d:l:S:X Option \"$@\"
do
case $Option in
d) device=$OPTARG;;
l) language=$OPTARG;;
S) software=$OPTARG;;
X) extend_fs="-X";;
esac
done
if [[ `/usr/lib/assist/check_cd -d $device` = '1' ]]
then
/usr/lib/assist/mount_cd $device
CD_MOUNTED=true
fi
if [[ $software = \"ALL\" ]]
then
echo "Устанавливается весь пакет программ для $language..."
else
echo "Устанавливается $software для $language..."
fi
exit $RC
}
foo"
ask = "y"
ghost = "n"
help_msg_id = "2850325"
sm_cmd_opt:
id = "demo_mle_add_app_lang"
id_seq_num = "0"
disc_field_name = "add_lang_language"
name = "Устанавливаемый язык"
name_msg_file = "smit.cat"
name_msg_set = 53
name_msg_id = 20
entry_type = "n"
entry_size = 0
required = "y"
prefix = "-l "
cmd_to_list_mode = "a"
help_msg_id = "2850328"
#----
# Вопрос: 2
# Перед выбираемым пользователем значением стоит поле prefix;
# оба значения (и prefix, и выбранное значение) передаются в
# cmd_to_exec для обработки командой getopts.
#----
sm_cmd_opt:
id = "demo_mle_add_app_lang"
id_seq_num = "020"
disc_field_name = "add_lang_input"
name = "Устройство/каталог для загрузки программного обеспечения"
name_msg_file = "smit.cat"
name_msg_set = 53
name_msg_id = 11
entry_type = "n"
entry_size = 0
required = "y"
prefix = "-d "
cmd_to_list_mode = "1"
cmd_to_list = "/usr/lib/instl/sm_inst list_devices"
help_msg_id = "2850313"
sm_cmd_opt:
id = "demo_mle_add_app_lang"
id_seq_num = "030"
name = "Установленное приложение"
name_msg_file = "smit.cat"
name_msg_set = 53
name_msg_id = 43
op_type = "l"
entry_type = "n"
entry_size = 0
required = "y"
prefix = "-S "
cmd_to_list_mode = ""
cmd_to_list = "\
list_messages ()
{
language=$1
device=$2
lslpp -Lqc | cut -f2,3 -d':'
}
list_messages"
cmd_to_list_postfix = "add_lang_language add_lang_input"
multi_select = ","
value_index = 0
disp_values = "ALL"
help_msg_id = "2850329"
#----
# Вопрос: 3
# Здесь вместо cmd_to_list указывается набор значений кольцевого
# списка в поле disp_values (через запятую). При нажатии пользователем
# клавиши Tab в поле ввода cmd_opt будет появляться по одному элементу из этого
# списка. Однако вместо того, чтобы передавать в cmd_hdr значение "yes" (да)
# или "no" (нет), рекомендуется использовать поле aix_values для передачи значения
# -X, или не передавать никакое значение. Список в поле aix_values должен в точности
# совпадать со списком в поле disp_values.
#----
sm_cmd_opt:
id_seq_num = "40"
id = "demo_mle_add_app_lang"
disc_field_name = ""
name = "Увеличить объем файловых систем при необходимости?"
name_msg_file = "smit.cat"
name_msg_set = 53
name_msg_id = 12
op_type = "r"
entry_type = "n"
entry_size = 0
required = "y"
multi_select = "n"
value_index = 0
disp_values = "yes,no"
values_msg_file = "sm_inst.cat"
values_msg_set = 1
values_msg_id = 51
aix_values = "-X,"
help_msg_id = "0503005"
#----------------------------------------------------------------
#
# Пример 3
# ------
# Цель: Показать характеристики логического тома. Имя логического
# тома вводится пользователем и передается в
# cmd_hdr как имя _rawname.
#
# Вопросы: 1. _rawname
# 2. Кольцевой список & aix_values
#----------------------------------------------------------------
#----
# Вопрос: 1
# Имя rawname не требуется, так как мы используем только один заголовок name_hdr
# и можем применять _rawname в качестве имени переменной по умолчанию.
#----
sm_name_hdr:
id = "demo_lspv"
next_id = "demo_lspvd"
option_id = "demo_cmdlvmpvns"
has_name_select = ""
name = "Оглавление физического тома"
name_msg_file = "smit.cat"
name_msg_set = 15
name_msg_id = 100
type = "j"
ghost = ""
cmd_to_classify = ""
raw_field_name = ""
cooked_field_name = ""
next_type = "d"
help_msg_id = "0516100"
sm_cmd_opt:
id_seq_num = "0"
id = "demo_cmdlvmpvns"
disc_field_name = "PVName"
name = "Имя физического тома"
name_msg_file = "smit.cat"
name_msg_set = 15
name_msg_id = 101
op_type = "l"
entry_type = "t"
entry_size = 0
required = "+"
cmd_to_list_mode = "1"
cmd_to_list = "lsvg -o|lsvg -i -p|grep -v '[:P]'| \
cut -f1 -d' '"
cmd_to_list_postfix = ""
multi_select = "n"
help_msg_id = "0516021"
#----
# Вопрос: 1
# Значение cmd_to_discover_postfix передает имя физического тома,
# которое представляет собой исходные данные, выбираемые пользователем в
# name_hdr - _rawname.
#----
sm_cmd_hdr:
id = "demo_lspvd"
option_id = "demo_cmdlvmlspv"
has_name_select = "y"
name = "Оглавление физического тома"
name_msg_file = "smit.cat"
name_msg_set = 15
name_msg_id = 100
cmd_to_exec = "lspv"
ask = "n"
cmd_to_discover_postfix = "_rawname"
help_msg_id = "0516100"
sm_cmd_opt:
id_seq_num = "01"
id = "demo_cmdlvmlspv"
disc_field_name = "_rawname"
name = "Имя физического тома"
name_msg_file = "smit.cat"
name_msg_set = 15
name_msg_id = 101
op_type = "l"
entry_type = "t"
entry_size = 0
required = "+"
cmd_to_list_mode = "1"
cmd_to_list = "lsvg -o|lsvg -i -p|grep -v '[:P]'| \
cut -f1 -d' '"
help_msg_id = "0516021"
#----
# Вопрос: 2
# Здесь кольцевой список из трех значений совпадает со списком aix_values,
# который мы хотим передать в cmd_to_exec для sm_cmd_hdr.
#----
sm_cmd_opt:
id_seq_num = "02"
id = "demo_cmdlvmlspv"
disc_field_name = "Option"
name = "Опция просмотра:"
name_msg_file = "smit.cat"
name_msg_set = 15
name_msg_id = 92
op_type = "r"
entry_type = "n"
entry_size = 0
required = "n"
value_index = 0
disp_values = "status,logical volumes,physical \
partitions"
values_msg_file = "smit.cat"
values_msg_set = 15
values_msg_id = 103
aix_values = " ,-l,-p"
help_msg_id = "0516102"
#----------------------------------------------------------------
#
# Пример 4
# ------
# Цель: Изменить/показать дату & время
#
# Вопросы: 1. Использование заголовка динамического окна для получения
# значений переменных для следующего окна диалога.
# 2. Использование cmd_to_discover для задания нескольких
# начальных значений cmd_opt.
# 3. Переупорядочение параметров в cmd_to_exec.
#----------------------------------------------------------------
#----
# Вопрос: 1
# Данный заголовок динамического окна name_hdr получает два значения, которые
# хранятся в переменных daylight_y_n и time_zone и используются в cmd_opts
# следующего окна диалога. Выходные значения cmd_to_classify разделяются двоеточием,
# как и в списке имен полей, определяемом в cooked_field_name.
#----
sm_name_hdr:
id = "demo_date"
next_id = "demo_date_dial"
option_id = "date_sel_opt"
name_msg_set = 0
name_msg_id = 0
ghost = "y"
cmd_to_classify = " \
if [ $(echo $TZ | awk '{ \
if (length($1) <=6 ) {printf(\"2\")} \
else {printf(\"1\")} }') = 1 ] \n\
then\n\
echo $(dspmsg smit.cat -s 30 18 'yes')\":$TZ\"\n\
else\n\
echo $(dspmsg smit.cat -s 30 19 'no')\":$TZ\"\n\
fi #"
cooked_field_name = "daylight_y_n:time_zone"
sm_cmd_opt:
id_seq_num = "0"
id = "date_sel_opt"
#----
# Вопросы: 2,3
# Здесь cmd_to_discover получает шесть значений, по одному для каждой
# доступной для изменения опции sm_cmd_opts для данного окна.
# Вывод cmd_to_discover состоит из двух строк; первая начинается с символа #,
# за которым следует список имен переменных, а вторая содержит список их значений.
# В обоих списках в качестве разделителя используется двоеточие. Следует отметить,
# что cmd_to_exec получает параметры из cmd_opts и переупорядочивает их
# при вызове команды.
#----
sm_cmd_hdr:
id = "demo_date_dial"
option_id = "demo_chtz_opts"
has_name_select = "y"
name = "Изменить / Показать дату и время"
name_msg_file = "smit.cat"
name_msg_set = 30
name_msg_id = 21
cmd_to_exec = "date_proc () \
# ММ дд чч мм сс гг\n\
# порядок параметров диалога # 3 4 5 6 7 2\n\
{\n\
date \"$3$4$5$6.$7$2\"\n\
}\n\
date_proc "
exec_mode = "P"
cmd_to_discover = "disc_proc() \n\
{\n\
TZ=\"$1\"\n\
echo '#cur_month:cur_day:cur_hour:cur_min:cur_sec:cur_year'\n\
date +%m:%d:%H:%M:%S:%y\n\
}\n\
disc_proc"
cmd_to_discover_postfix = ""
help_msg_id = "055101"
#----
# Первые два cmd_opts получают начальные значения
# (disc_field_name) из name_hdr.
#----
sm_cmd_opt:
id_seq_num = "04"
id = "demo_chtz_opts"
disc_field_name = "time_zone"
name = "Часовой пояс"
name_msg_file = "smit.cat"
name_msg_set = 30
name_msg_id = 16
required = "y"
sm_cmd_opt:
id_seq_num = "08"
id = "demo_chtz_opts"
disc_field_name = "daylight_y_n"
name = "Предусмотрен ли в данном часовом поясе переход на летнее время?\n"
name_msg_file = "smit.cat"
name_msg_set = 30
name_msg_id = 17
entry_size = 0
#----
# Последние шесть six cmd_opts получают свои значения из
# cmd_to_discover.
#----
sm_cmd_opt:
id_seq_num = "10"
id = "demo_chtz_opts"
disc_field_name = "cur_year"
name = "Год (00-99)"
name_msg_file = "smit.cat"
name_msg_set = 30
name_msg_id = 10
entry_type = "#"
entry_size = 2
required = "+"
help_msg_id = "055102"
sm_cmd_opt:
id_seq_num = "20"
id = "demo_chtz_opts"
disc_field_name = "cur_month"
name = "Месяц (01-12)"
name_msg_file = "smit.cat"
name_msg_set = 30
name_msg_id = 11
entry_type = "#"
entry_size = 2
required = "+"
help_msg_id = "055132"
sm_cmd_opt:
id_seq_num = "30"
id = "demo_chtz_opts"
disc_field_name = "cur_day"
name = "День (01-31)\n"
name_msg_file = "smit.cat"
name_msg_set = 30
name_msg_id = 12
entry_type = "#"
entry_size = 2
required = "+"
help_msg_id = "055133"
sm_cmd_opt:
id_seq_num = "40"
id = "demo_chtz_opts"
disc_field_name = "cur_hour"
name = "Час (00-23)"
name_msg_file = "smit.cat"
name_msg_set = 30
name_msg_id = 13
entry_type = "#"
entry_size = 2
required = "+"
help_msg_id = "055134"
sm_cmd_opt:
id_seq_num = "50"
id = "demo_chtz_opts"
disc_field_name = "cur_min"
name = "Минута (00-59)"
name_msg_file = "smit.cat"
name_msg_set = 30
name_msg_id = 14
entry_type = "#"
entry_size = 2
required = "+"
help_msg_id = "055135"
sm_cmd_opt:
id_seq_num = "60"
id = "demo_chtz_opts"
disc_field_name = "cur_sec"
name = "Секунда (00-59)"
name_msg_file = "smit.cat"
name_msg_set = 30
name_msg_id = 15
entry_type = "#"
entry_size = 2
required = "+"
help_msg_id = "055136"
Раздел Инструмент управления системой (SMIT) - Обзор книги Руководство по управлению системой AIX 5L версии 5.1: Операционная система и устройства
Глава 25, Инструмент управления системой (SMIT)
Команды dspmsg, gencat, ksh, man, odmadd, odmcreate , odmget, smit
Класс объектов sm_name_hdr (заголовок списков вариантов SMIT) , Класс объектов sm_cmd_hdr (заголовок окна диалога SMIT) , Класс объектов sm_cmd_opt (опции команд окна диалога/списка вариантов SMIT) , Класс объектов sm_menu_opt (меню SMIT).