Программу, приведенную в данном примере, можно применять для создания собственных файлов настройки. Если добавить эти файлы в каталог 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).