SMIT プログラムの例

以下のプログラム例は、ユーザーが独自のスタンザを作成する際に役立つように設計されています。

オペレーティング・システムに付属している SMIT ディレクトリーにこれらのスタンザを 追加すると、SMIT メインメニューの Applications 項目を選択する ことにより、SMIT を介してこれらのスタンザにアクセスできるようになります。 言語を何もインストールしていない、デモ 3 以外のすべてのデモが機能します。

#----------------------------------------------------------------
# はじめに :
# 新規 SMIT データベースを作成する場合でないかぎり、まず最初に
# アプリケーションのためのメニューを挿入する場所を決める必要があります。
# 新規メニューは他のメニュー、名前ヘッダー、およびダイアログを指します。 
# この例では、「アプリケーション」メニュー・オプションの下の
# デモ・メニューを指すポインターを挿入しています。「アプリケーション」
# メニュー項目の next_id は「apps」であるため、その ID と同じ「apps」を
# 持つ menu_opt を作成することで開始します。
#----------------------------------------------------------------
sm_menu_opt:
   id           = "apps"
   id_seq_num   = "010"
   next_id      = "demo" 
   text         = "SMIT Demos" 
   next_type    = "m"    
 
sm_menu_opt:
   id           = "demo"
   id_seq_num   = "010"
   next_id      = "demo_queue" 
   text         = "Demo 1: Add a Print Queue" 
   next_type    = "n"    
 
sm_menu_opt:
   id              = "demo"
   id_seq_num      = "020"
   next_id         = "demo_mle_inst_lang_hdr"
   text            = "Demo 2: Add Language for Application Already Installed"
   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            = "Demo 3: List Contents of a Physical Volume"
   text_msg_file   = "smit.cat"
   next_type       = "n"
 
sm_menu_opt:
   id_seq_num      = "040"
   id              = "demo"
   next_id         = "demo_date"
   text            = "Demo 4: Change / Show Date, Time"
   text_msg_file   = "smit.cat"
   next_type       = "n"
 
#----------------------------------------------------------------
# デモ 1
# ------
# ゴール: 印刷キューを追加します。printers.rte パッケージが
#         インストールされていない場合は、自動的にインストールされます。
#         ユーザーが MSMIT (Windows インターフェースでの SMIT) を実行している
#         場合は、このタスクに対するグラフィカル・プログラムを立ち上げます。
#         それ以外の場合は、SMIT 印刷キュー・タスクへの分岐を実行します。
#
# トピック:    1. 加工済み出力 & cmd_to_classify
#              2. SMIT 環境変数 (msmit と ascii)
#              3. ゴースト name_hdr
#              4. スーパー・ゴースト name_hdr   
#              5.「OK/取り消し」オプションの作成
#              6. 変換のための dspmsg
#              7. 終了/実行モード
#              8. name_hdr のための id_seq_num オプション
#----------------------------------------------------------------
#----
# トピック: 1、4
# next_id が id と同じであることに注意してください。タイプが
# 加工済みの「c」であるため、cmd_to_classify の出力が next_id に
# 追加されるということを覚えておいてください。そのため、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                      = "Add a Print Queue"
   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 プログラムを実行する必要があるかどうか、 # または ASCII SMIT 画面への分岐を実行する必要があるかどうかを調べます。 # これを行うには、環境変数 SMIT の値を検査します。この値は、ウィンドウ (Motif) # の場合は「m」、ASCII の場合は「a」です。ここで再度、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 です。ただちに # sm_cmd_opt の cmd_to_list がポップアップ・オプションとして # 表示され、ユーザーが応答を入力するのを待機しません。 # このゴーストにおいて、cmd_opt は、ユーザーが Enter キーを押すように # プロンプト指示を出す簡単な「OK/取り消し」ボックスです。 #---- sm_name_hdr:    id = "demo_queue2"    next_id = "demo_queue1"    option_id = "demo_queue_opt"    name = "Add a Print Queue"    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 "Error installing printers.rte" exit 1 else exit 0 fi } install_printers "    next_type = "n" #---- # トピック: 5、6、8 # ここでは cmd_opt が「OK/取り消し」ボックスとして使用されます。また、コマンド # dspmsg を使用してオプションのテキストが表示されていることにも注意してください。 # これにより、メッセージの変換が可能になります。 # 注: このオプションの id_seq_num は 0 です。1 つの name_hdr について認められる # オプションは 1 つだけで、その id_seq_num は 0 でなければなりません。 #---- sm_cmd_opt:    id = "demo_queue_opt"    id_seq_num = "0"    disc_field_name = ""    name = "Add a Print Queue"    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 ¥ 'Press Enter to automatically install the printer software.¥n¥ Press F3 to cancel.¥n¥ '¥n¥ else ¥n¥ dspmsg -s 52 smit.cat 57 'Click on this item to automatically install the printer software.¥n' ¥n¥ fi¥n¥ } ¥n¥ x"    entry_type = "t"    multi_select = "n" #---------------------------------------------------------------- # # デモ 2 # ------ # ゴール: 既にインストール済みのアプリケーションに言語を追加します。 # ユーザーは度々、ダイアログ画面が表示される前にある情報を取得 # するよう、明確にされます。名前ヘッダー(sm_name_hdr) は、 # この目的に使用できます。この例では、インストールする言語および # インストール・デバイスを判別するために 2 つの名前ヘッダーが # 使用されます。ダイアログには、このタスクを達成するのに必要な # その他の情報に関する項目があります。 # # # トピック: # 1. 連続する cooked_field_name 付き name_hdrs からの # 出力を保存中 # 2. cmd_to_exec 内部で getopts を使用して cmd_opt を # 処理 # 3. 値 cmd_opts を表示するためのリング・リスト対 # cmd_to_list #---------------------------------------------------------------- #---- # トピック: 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 = "Add Language for Application Already Installed" 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 = "LANGUAGE translation to install" 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 # これは 2 番目の 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 = "Add Language for Application Already Installed" 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 = "INPUT device/directory for software" 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_opt のそれぞれが、getopts コマンドによる処理に合うようにその情報の # 形式設定を行います (ダッシュと単一文字の後ろにオプショナル・パラメーターが # 続く形式)。getopts コマンドの英字の後ろのコロンは、ダッシュ・オプション # の後ろにパラメーターがあると予想されることを意味します。 # これは、複数のオプションがある場合、特に、オプションの 1 つが左側に # はずれて、一連の $1、$2、などが順序が変わってしまうような場合に、 # cmd_opt の情報を処理するのに良い方法です。 # #---- sm_cmd_hdr: id = "demo_dialog_add_lang" option_id = "demo_mle_add_app_lang" has_name_select = "" name = "Add Language for Application Already Installed" 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 "Installing all software for $language..." else echo "Installing $software for $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 = "LANGUAGE translation to install" 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 フィールドを置き、 # その接頭部とユーザーが選択した値の両方が getopts 処理 # のために cmd_to_exec に渡されます。 #---- sm_cmd_opt: id = "demo_mle_add_app_lang" id_seq_num = "020" disc_field_name = "add_lang_input" name = "INPUT device/directory for software" 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 = "Installed APPLICATION" 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 ではなく、コンマで区切られた Ring 値の # セットが disp_values フィールドにあります。このリストは、 # ユーザーが cmd_opt エントリー・フィールドで「タブ」キーを 1 回押す # ごとに 1 つのエントリーが表示されます。ただし、cmd_hdr に yes または no を # 渡す代わりに、aix_values フィールドを使用して -X を渡すか、または何も # 渡さないという方法がより有効です。aix_values フィールド内のリストは、 # disp_values フィールド内のリストと 1 対 1 で対応していなければなりません。 #---- sm_cmd_opt:    id_seq_num = "40"    id = "demo_mle_add_app_lang"    disc_field_name = ""    name = "EXTEND file systems if space needed?"    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 # name_hdr は 1 つしかないため、rawname は必要なく、 # デフォルトの変数 name _rawname を使用することができます。 #---- sm_name_hdr:    id = "demo_lspv"    next_id = "demo_lspvd"    option_id = "demo_cmdlvmpvns"    has_name_select = ""    name = "List Contents of a Physical Volume"    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 = "PHYSICAL VOLUME 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 = "List Contents of a Physical Volume"    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 = "PHYSICAL VOLUME 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 # ここで、3 つの値のリング・リストが、sm_cmd_hdr の cmd_to_exec に # 渡したい aix_value と一致しています。 #---- sm_cmd_opt:    id_seq_num = "02"    id = "demo_cmdlvmlspv"    disc_field_name = "Option"    name = "List OPTION"    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_opt に初期値を入力するための # cmd_to_discover の使用。 # 3. cmd_to_exec でのパラメーターの再配列。 #---------------------------------------------------------------- #---- # トピック: 1 # このゴースト name_hdr は 2 つの値を取得し、それらを使用に備えて # 変数 daylight_y_n および time_zone を cmd_opt に保管します。 # 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 は、6 つの値 (このスクリーン用の # 編集可能な sm_cmd_opt それぞれについて 1 つ) を取得します。 # cmd_to_discover の出力は 2 行です。最初の行は # の後ろに # 変数名のリストが続き、2 番目の行は値のリストです。 # 両方のリストともコロンで区切られています。また、コマンド # をコールしたときに cmd_opt からパラメーターを取り出し、 # それらを再配列する cmd_to_exec もここに表示されます。 #---- sm_cmd_hdr:    id = "demo_date_dial"    option_id = "demo_chtz_opts"    has_name_select = "y"    name = "Change / Show Date & Time"    name_msg_file = "smit.cat"    name_msg_set = 30    name_msg_id = 21    cmd_to_exec = "date_proc () ¥ # MM dd hh mm ss yy¥n¥ # dialogue param order   # 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" #---- # 最初の 2 つの cmd_opt は、name_hdr から # 初期値 (disc_field_name) を取得します。 #---- sm_cmd_opt:    id_seq_num = "04"    id = "demo_chtz_opts"    disc_field_name = "time_zone"    name = "Time zone"    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 = "Does this time zone go on daylight savings time?¥n"    name_msg_file = "smit.cat"    name_msg_set = 30    name_msg_id = 17    entry_size = 0 #---- # 最後の 6 つの cmd_opts は、cmd_to_discover から # 値を取り出します。 #---- sm_cmd_opt:    id_seq_num = "10"    id = "demo_chtz_opts"    disc_field_name = "cur_year"    name = "YEAR (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 = "MONTH (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 = "DAY (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 = "HOUR (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 = "MINUTES (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 = "SECONDS (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"