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”を使って国際化&ローカライズを試してみました。
■サーバー環境
-
- OS:IBM i V5R4M0
- Zend Core for i5 2.6.1
- Zend Framework 1.10.0
■クライアント環境
-
- OS:Windows XP SP3
- Zend Studio i5 Edtion 7.0.2
- Poedit-1.4.5
■参考サイト
最新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”の大まかな使い方は、以下のステップです。
-
- 「require_once 'Zend/Translate.php'」でインクルード。
- Zend_Translateのインスタンス(※以下”$tl”)を作成。この際にコンストラクタで、翻訳アダプタ、翻訳されたリソースのパス、ローケルを指定します。翻訳アダプタは様々なフォーマットが使える様に柔軟に出来ているようです。今回はgettextで試しました。
- Array
- CSV
- gettext(*.mo)
- ini
- TMXなどなど...
- 追加のローケルがあれば、$tl->addTranslationメソッドで、翻訳リソースとローケルを追加する
- ローケルを設定しなければ、デフォルトローケルが使われます。明示的に設定する場合は、$tl->setLocaleメソッドを呼び出します。
- $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デーモンを再起動します。
公開鍵・秘密鍵の作成
- 公開鍵・秘密鍵を作成するまでの手順は以下の通りです。
手順をまとめると以下の通りです。
$ // ディレクトリ移動 > 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)]→[設定の保存(S)]で設定を保存しておく(次回から設定読込で使えます)
ディレクトリパーミッション・所有権
実は、ここで少し躓きました。
自分は、ディレクトリ作成、鍵の配置やらを、前述の様にシェルを使って、操作をしたのではなく、実は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
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のシェルを呼び出す。
-
- 「ジョブの確認」
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するやり方もあったので、また次回以降でコマンドを自作したいと思います。
これで、sshでAS/400のシェルを起動できるので、「call qp2term」が、いらなくなりました。
...と思ったら、echoとか簡単なコマンドが、動かなかったりするし。文字化けとか、環境変数の辺りがまだ怪しいです。
続きは、「公開鍵暗号の認証」と「Port Forwarding」を使ってSSH越しに、別の端末にリモート出来る様にしていきたいと思います。