ushidayの日記

主に「IBMi」のメモに・・・

PASE環境でのsyslogの設定

以前、PASE環境でsyslogを設定した時の事を、また忘れていたので、備忘録として...。

syslogd用のディレクトリ&ファイルを作成

PASE版syslogdは、”/QOpenSys/usr/sbin/syslogd -> /QOpenSys/QIBM/ProdData/OS400/PASE/sbin/syslogd”こういう状況になってます。syslog用のディレクトリやファイルは、予め用意する必要があり、自前で作成します。

mkdir /var/log
touch /var/log/secure

設定ファイルは、”/QOpenSys/etc/syslog.conf”を作成します。
■syslog.conf

#1日単位でファイルを区切る。ファイルは、最大7つまでで、圧縮してアーカイブする
authpriv.info /var/log/secure rotate time 1d  files 7 compress archive /var/log/archive/secure/

#全てのfacilityのデバッグレベルとメール機能を除いたログを出力。ファイルサイズは1024Kで最大2つまで
*.debug;mail.none /var/log/syslog/syslog.out rotate size 1024k files 2

PASEのsyslog設定、facilityのワイルドカードは出来るが、レベルのワイルドカードは出来ないので少し、Linuxとは違ったり...(これを結構忘れてる)。後は、IPL等でsyslogdを実行すればOKです。

Zend Core for i5で国際化&ローカライズ

IBM i(AS/400)の5250アプリで、多言語対応する場合は、”*MSGF”を使ったり、画面制約に縛られたりで、実装も保守も個人的には「面倒だ」というネガティブなイメージがあります。(中には画面やメニューだけ別言語で書き直して、OVRDSPFなんてのもあります。)
しかし、海外拠点を持つカスタマー(特にアチラコチラに散在しているケース)からは、「今後どこの国に進出するか判らないけど(現在は主に中国、東南アジアやヨーロッパだったり)、アプリケーションは多言語対応したい」との要望を寄せられるケースもあります。そこで、”Zend Core for i5”に、デフォでバンドルされている、”Zend Framework(ZF)”の機能の1つ、”Zend Translate”を使って国際化&ローカライズを試してみました。

■サーバー環境

■クライアント環境

■参考サイト

最新Zend Frameworkの導入

Zend CoreにデフォでバンドルされているZFは、”1.6.0”だったので、最新の”1.10.0”にしました。"Zend Frameworkの公式サイト"から手に入れる事が出来ます。
アーカイブをダウンロードしたら、AS/400のIFS上の適当なディレクトリで解凍して、php.ini(/usr/local/Zend/Core/etc/php.ini)の”include_path”に、「/usr/local/Zend/ZendFramework-1.10.0/library」を追加します。これで、”require”などで「Zend/フレームワーク名」で使えるようになります。

PHPプログラムの準備

”Translate”の大まかな使い方は、以下のステップです。

    1. 「require_once 'Zend/Translate.php'」でインクルード。
    2. Zend_Translateのインスタンス(※以下”$tl”)を作成。この際にコンストラクタで、翻訳アダプタ、翻訳されたリソースのパス、ローケルを指定します。翻訳アダプタは様々なフォーマットが使える様に柔軟に出来ているようです。今回はgettextで試しました。
      • Array
      • CSV
      • gettext(*.mo)
      • ini
      • TMXなどなど...
    3. 追加のローケルがあれば、$tl->addTranslationメソッドで、翻訳リソースとローケルを追加する
    4. ローケルを設定しなければ、デフォルトローケルが使われます。明示的に設定する場合は、$tl->setLocaleメソッドを呼び出します。
    5. $tl->_メソッドで言語を変換。
翻訳ファイルの準備

gettextのソースファイルpoを編集可能な”poEdit”を使います。導入はインストーラまかせで、特に何もありません。初回起動時に言語の選択等があります。
起動後、phpのソースファイルを元に、翻訳用のカタログを作成します。[ファイル]→[新規カタログ]を選びます。

[情報]タブで、必要な項目を以下の様に入力します。

[パス]タブでは、[ベースパス]に環境依存のパスを指定します。今回の場合はZend Studioワークスペースまでのパスとします。[パス]には、翻訳対象となるソースが存在するパスを指定します。

[キーワード]タブは、翻訳対象となるメソッドを登録します。デフォルトで”_”が存在するので特にする事はありません。OKボタンを押して、保管先を指定すればpoファイルが作成されます。

あとは、対訳をえっちらおっちらと、入力します。デフォルトで、”poファイル”を保存すれば、同じディレクトリに”moファイル”が作成される設定になってます。

元のPHPソースに変更が合った場合は、[カタログ(A)]→[ソースから更新(U)]を行うか、ツールバーにある地球マークをクリックすれば、poファイルをマージします。
翻訳リソースのmoファイルを、Zend Studioに適宜配置します。(PROJECT_HOME/languages/jp/message_jp.moなど)
以下が今回のサンプルプログラムです。
■ ZendTranslate.php

<?php
require_once 'Zend/Translate.php';

// Zend Transelate
$translate = new Zend_Translate("gettext","./languages/en/messages_en.mo","en");
$translate->addTranslation("./languages/ja/messages_ja.mo","ja");

echo "これは英語\n";
$translate->setLocale("en");
print $translate->_("Example") . "\n";
print "=======\n";
print $translate->_("Here is line one"). "\n";
$format = $translate->_("Today is the %1\$s.%2\$s.%3\$s");
printf($format . "\n" , date("m"),date("d") ,date("Y"));
print $translate->_("Here is line two") . "\n";
print "\n";

echo "ここから日本語\n";
$translate->setLocale("ja");
print $translate->_("Example") . "\n";
print "=======\n";
print $translate->_("Here is line one"). "\n";
$format = $translate->_("Today is the %1\$s.%2\$s.%3\$s");
printf($format . "\n" , date("m"),date("d") ,date("Y"));
print $translate->_("Here is line two") . "\n";

■実行結果

番外編:gtedプラグイン

Eclipseのpluginの”gted”も試してみました。”http://gted.sourceforge.net/update”を、Zend Studioの[Help]→[install New Software]から導入します。
導入後に[Preferences]→[gted]→[gettext Tools]で、”poEdit”のインストールディレクトリにある”bin”ディレクトリを指定します。

プロジェクトを右クリックして[Properties]→[gted Settings]を適宜設定します。

プロジェクトを右クリックして[gted]→[Update PO Files]を行うと、プロジェクト内のソースからpoファイルが作成されます。ただ一見するとマージ機能等はなさそうなので(※自分が機能を探しきれてないだけかも知れませんが...)、poEditの方が使い勝手は良いような気がします。ただ参照と編集だけの用途ならば、十分にも思えます。po専用のエディタは縦横2タイプのGUIビューとコードエディタが選べます。

結局この後、[Preference]→[General]→[Editors]→[File Associations]で、”*po”と”*pot”のデフォルトエディタを、外部エディタで”poEdit”に変更しました。

PASE環境でbash,zshを使う場合

IBM i(AS/400)には、PASE環境でコマンド処理をする為の、5250で使えるターミナル(※”call qp2term”で実行)があります。
このターミナルですが、ログインシェルは”shやbsh”(リンク元は”/QOpenSys/QIBM/ProdData/OS400/PASE/bin/ksh”)で、当然キーバインドも5250エミュレータのままで、今時としては実用性がかなり低くいです。
少しでも実用性を高める為に、PASE環境にbash,zshを、Windows環境にPoderosaというターミナルを入れてみたので、メモを残しておきます。
■導入環境

特に難しい設定は、ありませんが、言語環境はUTF-8を選ぶのと、”Terminfo”(/QOpenSys/usr/share/lib/terminfo)を見ると、”aixterm”か”xterm”しかないので、必要に応じて”tic”コマンドでterminfoを作成するか、どちらかを選択する必要がありそうです。
他に、AIXだとコマンドのオプションが、結構違ったりして、Mac,Cygwin,Linuxエイリアスそのまま使えないものが多いです。特にカラー関係や、コマンド処理表示のオプションは無いので。

■~/.bashrcの一部抜粋

HISTSIZE=10000
HISTFILESIZE=10000
HISTCONTROL=ignoredups
export HISTSIZE HISTFILESIZE HISTCONTROL

set -o vi

export TERM=xterm
#export TERM=aixterm
export PS1=\\s:\\w\\$\ 
export LANG=JA_JP
export SHELL=/usr/local/bin/bash
export TMPDIR=/tmp
export TZ='<JST>-9'
export LC__FASTMSG=true
export LOCPATH=/usr/lib/nls/loc 
export NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/%L/%N.cat:/usr/lib/nls/msg/JA_JA/%N:/usr/lib/nls/msg/JA_JA/%N.cat

export JAVA_HOME=/QIBM/ProdData/Java400/jdk15
export GROOVY_HOME=/usr/local/groovy/groovy-1.6.3
export GRAILS_HOME=/usr/local/grails/grails-1.0.5
export ANT_HOME=/usr/local/ant/apache-ant-1.7.1

PATH=/QOpenSys/QIBM/ProdData/SC1/OpenSSH/openssh-3.5p1/bin
PATH=/usr/local/Zend/Core/bin:$PATH
PATH=$ANT_HOME/bin:$PATH
PATH=$GRAILS_HOME/bin:$PATH
PATH=$GROOVY_HOME/bin:$PATH
PATH=$JAVA_HOME/bin:$PATH
PATH=/usr/local/gnu/bin:$PATH
PATH=/usr/local/bin:$PATH
PATH=/usr/bin:$PATH
PATH=.:$PATH
PATH=/usr/sbin:$PATH
PATH=/QOpenSys/usr/bin/X11:$PATH
PATH=/usr/ccs/bin:$PATH
PATH=/QOpenSys/usr/bin:$PATH

HOME=/home/username
alias h='history 32'
alias ll='ls -al'
alias rm='rm -e'
alias mv='mv -i'
alias ps='ps -e'

■~/.zshrcの一部抜粋

autoload -U compinit
compinit
setopt auto_cd
setopt auto_pushd
setopt correct
setopt list_packed
setopt nolistbeep

PROMPT="zsh:%/%% "
PROMPT2="%_%% "
SPROMPT="%r is correct? [n,y,a,e]: "

HISTFILE=~/.zsh_history
HISTSIZE=6000000
SAVEHIST=6000000
setopt hist_ignore_dups     # ignore duplication command history list
setopt share_history        # share command history data

bindkey -v

------ 以下 .bashrcと同様 -------

Poderosaは、SSH2接続などをサポートしている高機能ターミナルです。タブ形式で複数のターミナルを開けたり、背景をカスタマイズしたりと、初めて使ったのですが、なかなかいい感じです。
見た目は、こんな感じです。補完が使えるってスバラシイ。viもまともに使えるようになります。

PASEのtarって...

ZendFrameWorkを入れようと、IBM i(AS/400)上で、”〜tar.gz”をungzipして、tarしたら...
「警告うんぬん」言われて、"@LongLink"ファイルが、解凍先に出来ているではありませんか。



どうやら、”PASE標準(AIX標準?)”って、100文字縛りがあるらしい。
というか、GNU tarでの100文字以上のファイルに付けられる”@LongLink”を理解してくれないみたい。
「まいったな。」という事で、今後の事も考えて、”GNU tar”を入れておきました。以前、"gcc"でお世話になったサイトに、AIXバイナリが有りましたので、有り難く使わせて頂きました。
そして、tarコマンドの既存の場所を検索すると、二つ出てきました。

PASE環境のtarシンボリックリンクGNU tarに置き換えて実行すると、今度は”libintl.so.2がねぇぞ!”と言われました。依存関係に有る「GNU gettext」が、PASEに無いので、これまた先程のありがたい場所から(バイナリあるとホント助かります。本来は別の所のお仕事な...)同じく取得して解凍すれば、その後は無事tarコマンドが動きました。めでたし×2。

PASE環境とAIXのバージョン相互関係

IBM i”のPASE環境とAIXとの相対表をメモっときます。
詳しくはこちら(V5R4 Information Center)
詳しくはこちら(V6R1 Information Center)
(×が、使えるって事で、日本人的な表現と逆ですね。)

AIX のリリース OS/400 V5R1 OS/400 V5R2 i5/OS V5R3 i5/OS V5R4 i5/OS V6R1
4.3 (32 ビット)
4.3 (64 ビット) × × × ×
5.1 (32 または 64 ビット) ×
5.2 (32 または 64 ビット) × ×
5.3 (32 または 64 ビット) × × ×

という事で、ウチにある”V5R4M0”では、大抵のAIXバイナリは使えそうだという事が解りました。

IBM iのSSH設定その3

前回の続きです。IBM i(※以下AS/400)にSSHサーバーを立てたので、公開鍵認証にします。それから、外部環境からインターネット越しに、SSHで接続して、5250エミュが使えるかやってみました。

sshd_configの変更

まず、パスワード認証やユーザー制限を掛ける為に、SSHデーモンの設定ファイル”sshd_config”を変更します。”sshd_config”は「/QOpenSys/QOpenSys/QIBM/UserData/SC1/OpenSSH/openssh-3.5p1/etc/sshd_config」にあります。

  • 以下の項目を設定します。
# rootでのログインの許可 
PermitRootLogin no
# RSA 認証が成功した時、rhosts を使った認証を許可。
RhostsRSAAuthentication no
# パスワード認証を許可
PasswordAuthentication no
# 空のパスワードを許可
PasswordAuthentication no
# 特定ユーザのみ接続許可をする
AllowUsers user1 user2


SSHクライアントからホストへユーザー名が届く時には、小文字として認識されている様です。
AllowUsersは小文字で登録する必要が有ります。
AllowUsersを使う場合は、SSHクライアントのユーザー名とホームディレクトリ名も完全一致している必要があります。

設定後、SSHデーモンを再起動します。

公開鍵・秘密鍵の作成
  • 公開鍵・秘密鍵を作成するまでの手順は以下の通りです。
    1. 「CALL QP2TERM」でシェルを起動
    2. SSH接続するユーザーのホームディレクトリに「.sshディレクトリを作成
    3. ssh-keygen」コマンドで、公開鍵と秘密鍵を作成
    4. 公開鍵を「authorized_keys」に追加

手順をまとめると以下の通りです。

   $ // ディレクトリ移動
 > cd /home/user1
   $ // 「.ssh」ディレクトリ作成
 > mkdir .ssh
   $ // ディレクトリ移動
 > cd .ssh
   $ // 鍵を作成
 > ssh-keygen -t rsa
    公開 / 秘密  rsa  鍵ペアの生成中。
   Enter file in which to save the key (/home/user1/.ssh/id_rsa):
 > ( 実行キー )
   Enter passphrase (empty for no passphrase): 
 > ( 秘密鍵のパスワード入力 )
   Enter same passphrase again:  識 
 > ( パスワード確認入力 )
    別が  /home/user1/.ssh/id_rsa  に保管されました。                         
    自身の公開鍵が  /home/user1/.ssh/id_rsa.pub  に保管されました。           
 キーの指紋 :
   $ // 公開鍵の登録
> cat id_rsa.pub >> authorized_keys
   $

上記で出来た秘密鍵の「id_rsa」は、クライアント側で厳重に保管します。クライアント側で鍵を作成して、サーバーに登録でも構いません。(今回、githubの時に、cygwinで作成した鍵でも試してみましたが、もちろんOKでした。)。windowsの場合は”TeraTerm”などを使えば、以下の様に簡単に出来ます。

SSHクライアントの実行

今回はTeraTermでやってみました。設定は以下の通りです。

  • 「漢字コード」を”SJIS”にする

  • メニューの[設定(S)]→[SSH認証(A)]で「sshのユーザー」と、「秘密鍵」を設定する。

  • メニューの[設定(S)]→[設定の保存(S)]で設定を保存しておく(次回から設定読込で使えます)

  • メニューの[ファイル]→[新しい接続]でSSHへ接続を行う。(パスフレーズ秘密鍵を作ったときのパスワード。)


ディレクトパーミッション・所有権

実は、ここで少し躓きました。
自分は、ディレクトリ作成、鍵の配置やらを、前述の様にシェルを使って、操作をしたのではなく、実はiナビ(オペナビ)でしていました。その為、パーミッションの設定や、所有権がメタメタで、SSHで接続しても、「Permission denied (publickey,keyboard-interactive).」となってしまいました。最初は、クライアント側の-vオプションで、デバッグしても、「何事か?」と全く解からず、「ならばと」サーバー側のデーモンをデバッグモードの「sshd -d」で動かすと、ようやく「原因は”パーミッション”と”所有権”にある」と気づいたのでした。恥ずかしい...:-p

 +--home
     +--user_home ( 755 )
         +--.ssh ( 700 )
             +--authorized_keys ( 644 )
  • シェルで以下を実行
chmod 755 /home/user_home
chmod 700 /home/user_home/.ssh
chmod 644 /home/user_home/.ssh/authorized_keys
chown user /home/user_home
chown user /home/user_home/.ssh
chown user /home/user_home/.ssh/authorized_keys
ルーターのNATアドレス&ポート変換

外部からルーター越しにSSHが実行できる様にする為、ルーターの22ポートを、SSHサーバーの22ポートへ転送します。

ポートフォワードで5250やVNC

インターネット環境からポートフォワードで5250エミュレータを実行してみます。
Windows環境なので、TeraTermでポートフォワードの設定をしました。

  • メニューの[設定(S)]→[SSH転送(O)]で、クラインアンとの任意ポート(※8881とする)フォワード先のホストとポートを設定します。



  • 5250エミュレータのセッションを設定。リンク・パラメータのホストを「localhost」、ポートを「8881」とします。



これでバッチリ繋がったので、自宅や移動中も5250が使えます。VNCも試しにやったら問題なくOKでした。ただWindwosのリモート・デスクトップは何故か?SSHデーモンからのフォワードでタイムアウト。:-(
↑勘違いでした。ただのタイポでした。最近歳のせいかタイポが多い気がする。ヤバイ...。
またそのうち、チャレンジしてみます。

IBM iのSSH設定その1

IBM i(以下AS/400)にSSHを設定したのでメモしときます。
SSHは、OpenSSHがデフォでPASE環境に導入されています。
このあたりを参考に設定しました。

  • SSHのバージョンとインストール先
    • OS/400「V5R3 & V5R4」の場合は、OpenSSH-3.5p1が「/QOpenSys/QIBM/ProdData/SC1/OpenSSH/openssh-3.5p1/」にインストールされています。
    • OS/400「V6R1」の場合は、OpenSSH-3.8.1p1が「/QOpenSys/QIBM/ProdData/SC1/OpenSSH/openssh-3.8.1p1/」にインストールされています。

その他に、「/QOpenSys/QIBM/ProdData/SC1」下に”OpenSSL”と”zlib”がPASE用のツールとして提供されているようです。
SSHの設定に関してですが、相変わらず資料が無いというか、解りづらいというか...。:-(

SSHサーバーの設定(V6R1の場合)
  • 原文
For V6R1 the sshd daemon can be started with CL command STRTCPSVR SERVER(*SSHD) and ended with ENDTCPSVR SERVER(*SSHD). If they do not exist, the host key files will be generated when the sshd daemon is started.

という事で、V6R1は「STRTCPSVR」のパラメータに「*SSHD」が、追加されているみたいです。もっと早く気づこうよ...IBMさん。

SSHサーバーの設定(V5R3、V5R4の場合)

悲しいかな、上記の「STRTCPSVR」コマンドは、自分の環境では、残念ながら使えません(つд∩) 。
大した事は無いですが、自分で設定しなければいけない事が、幾つかあります。

  • ホスト鍵の作成
    • 「call qp2term」又は「qsh」でAS/400のシェルを呼び出す。

    • ssh-keygen -t rsa1 -f /QOpenSys/QIBM/UserData/SC1/OpenSSH/openssh-3.5p1/etc/ssh_host_key -N ""」を実行。

    • ssh-keygen -t dsa -f /QOpenSys/QIBM/UserData/SC1/OpenSSH/openssh-3.5p1/etc/ssh_host_dsa_key -N ""」

    • ssh-keygen -t rsa -f /QOpenSys/QIBM/UserData/SC1/OpenSSH/openssh-3.5p1/etc/ssh_host_rsa_key -N ""」


  • SSHデーモンの実行

    • 「ジョブの確認」


SSHクライアントの実行

クライアントは、自分の環境は、Windowsでしたが、cygwinが入っているので、そのままcygiwnのターミナルから確認しました。


AS/400ユーザーの注意

デーモンの起動や、SSHクライアントのAS/400ユーザー名は、8文字以下の必要が有るようです。「The userid that starts the daemon must be 8 or fewer characters long」、「The userid that is connecting must be 8 or fewer characters long」何て事が地味に書かれています。最初は気づかなくSSHクライアントでエラーになって、小ハマリしました。結構重要な事なので、もっと目立つように書いて頂けたらありがたいです。よく読まない自分が悪いのですが...Σ(・A ・;) 。ユーザー、パスワード共に、小文字は大文字として解釈してくれました。

sshdデーモンの終了

OpenSSHによると「sshd stop」でデーモン終了のようですが、AS/400では通用しないようです。他の”start”や”restart”も同様に”余計な引数 xxxx 。”って怒られます。「余計な..」って。

「こちらに」同じ事で悩まれた方がいる様で、参考にさせて頂きました。(最悪”WRKACTJOB”から、強制終了も考えました。)「ps ax」で、プロセスを出力して、sshdのプロセスIDを「kill プロセスID」で終了。


その他、デーモンのプロセスIDをファイルに出力して、CLでQSHからそのプロセスIDをkillするやり方もあったので、また次回以降でコマンドを自作したいと思います。

これで、sshAS/400のシェルを起動できるので、「call qp2term」が、いらなくなりました。
...と思ったら、echoとか簡単なコマンドが、動かなかったりするし。文字化けとか、環境変数の辺りがまだ怪しいです。
続きは、「公開鍵暗号の認証」と「Port Forwarding」を使ってSSH越しに、別の端末にリモート出来る様にしていきたいと思います。