Ethnaでデフォルトアクション名を変更する

久々のEthna小ネタです。

Ethnaでのデフォルトアクション名はAppID_Action_Hogeのようなスタイルのアクション名ですが、これを変更したい場合のTIPSです。

例えば、AppID_HogeActionのようにアクションのクラス名を変更したいと思います。

AppID_Action_Hoge => AppID_HogeAction

その場合は下記のようにAppID_Controller.php内にgetDefaultActionClassメソッドをオーバーライドすることで簡単に実現できます。
ちなみに、アクションをコマンドから作る場合にコントローラに下記のコードを書いておくだけで命名規則が変更されるため、アクションを作る前にコントローラに実装しておくことがお薦めです。
また、ビュー(View)やアクションフォーム(ActionForm)などの命名規則も同様にgetDefaultViewClass, getDefaultFormClassをオーバーライドするだけです。

function getDefaultActionClass($action_name, $gateway = null)  {
  $gateway_prefix = $this->_getGatewayPrefix($gateway);

  $postfix = preg_replace('/_(.)/e', "strtoupper('\$1')", ucfirst($action_name));
  $r = sprintf("%s_%s%sAction", $this->getAppId(), $gateway_prefix ? $gateway_prefix . "_" : "", $postfix);
  $this->logger->log(LOG_DEBUG, "default action class [%s]", $r);

  return $r;
}

ORF2009 SFC ORF SUPPORTER’S(SOS)

2009.11.01    中井, 渡辺   タグ: , —    peter   

今年度のORF2009、SFC ORF SUPPORTER’S(SOS)のスポンサーになってます。
左側のメニューのlinkから弊社の名前が出ております。

http://orf.sfc.keio.ac.jp/慶應義塾大学SFC ORF2009【Gardens for Ingenuity -断面の触感-】

11/23,24開催予定なので見に行ける方は是非是非。

- – -

私は23日に見に行く予定です。
一緒に行ける方は、ぜひ連絡を下さい。

さくらインターネットにおけるNagios(NRPE) RAID監視スクリプト on CentOS

2009.10.28    CentOS, Linux, 中井      hiko   

昨日、さくらインターネットにおけるRAID監視スクリプトに関して記事を書きましたが、これをCentOSで設定しているときに直面した問題とその解決策に関するTIPSです。

結論から述べると、昨日のRAID監視スクリプトの設定で監視対象をCentOSにした場合、そのままでは動きません。その原因はsudoの設定にあります。

まず、事前に確認すべきこととして、監視対象ホストの端末から以下のコマンドは実行可能ですが、

# sudo -u nagios /usr/lib/nagios/plugins/check_sakura_raid
RAID OK : u0 RAID-1 OK - - - 232.885 ON -

監視ホストから下記のコマンドを実行しても監視対象ホストから結果が取得できません。

# /usr/lib/nagios/plugins/check_nrpe -H (hostname) -c check_raid
NRPE: Unable to read output

つまり、端末からコマンドを実行した場合は実行できるのにも関わらず、リモートから実行すると何故か実行されないというわけです。

ここで、sudoに関係するログとして/var/log/secureのログに注目します。

Oct 28 11:58:28 localhost sudo: nagios : sorry, you must have a tty to run sudo ; TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/local/bin/tw_cli info c0

このログが意味することとしては、端末(tty)でないとsudoが実行できない、ということで
シェル以外から実行した場合(cronなど)sudoが実行できないように設定されています。

これは、CentOSの初期設定で/etc/sudoersファイルに”Defaults requiretty”として設定されていることによるものです。
このため、この問題は該当行をコメントアウトすることで解決します。

# visudo

#Defaults    requiretty

これで監視ホストから下記コマンドを実行すると結果が取得できるようになるはずです。

# /usr/lib/nagios/plugins/check_nrpe -H (hostname) -c check_raid
RAID OK : u0 RAID-1 OK - - - 232.885 ON -

やはり問題に直面した時は素直にログを追いかけるのが鉄則ですね!

以上です。

さくらインターネットにおけるNagios(NRPE) RAID監視スクリプト

2009.10.27    Linux, nagios, 中井, 投稿者      hiko   

さくらインターネットの専用サーバRAIDプランでは、RAIDに障害発生した場合、利用者側からさくらインターネットに報告する必要があります。
RAID制御用のコマンドが用意されており手動で状態を確認することは可能ですが、問題があった場合は自動的に通知してくれる仕組みがあると便利です。

http://faq.sakura.ad.jp/faq/1032/app/servlet/qadoc?000494

弊社では既にNagiosによるサーバ監視体制を構築していますので、今回はNagios(NRPE)プラグインを自作・設定してさくらインターネットのRAID監視を自動化してみようと思います。

しかし、”RAID制御コマンドがrootでのみ実行可能”と”NRPE-serverがrootで起動不可”という相反する制約があるため、セキュリティ上の制約を考慮したうえでsudoコマンドを利用してRAID制御コマンドを実行することでこの問題を回避します。

では、早速ですが、今回設置の前提となる環境は以下の通りです。

  • 監視対象ホストがさくらインターネットの専用サーバRAIDプラン
  • 監視対象ホスト、監視ホストはともにLinux(Ubuntu 8.04)
  • 監視ホストにnagios2, nagios2-commonがインストール済み
  • 監視対象ホストにnagios-nrpe-server, nagios-nrpe-pluginがインストール済み

以上の前提を踏まえたうえで、大まかな設定を以下の手順で行います。

  1. RAID監視プラグインを監視対象ホストに設置
  2. nagios実行ユーザに対してRAID制御コマンドの実行権限を付与
  3. 監視対象ホストで監視ホストからRAID監視を可能にする設定
  4. 監視ホストから監視対象ホストに対してRAID監視を行うように設定

1. RAID監視プラグインを監視対象ホストに設置

まず、以下のシェルスクリプト(#!/bin/sh以降の行)を監視対象ホストのプラグインディレクトリ(/usr/lib/nagios/plugins)に設置し、実行権限を与えます。
今回はcheck_sakura_raidというファイル名で設置しました。設置後はrootで実行して問題なく実行できることを確認してください。

# cd /usr/lib/nagios/plugins
# vim check_sakura_raid
#!/bin/sh
DESC=`/usr/bin/sudo /usr/local/bin/tw_cli info c0 | /bin/grep "RAID-1"`
STATUS=`/bin/echo $DESC | /usr/bin/awk '{print $3}'`
case $STATUS in
  OK) echo "RAID OK :" $DESC; exit 0 ;;
  DEGRADED) echo "RAID WARNING :" $DESC; exit 1 ;;
esac
# chmod 755 check_sakura_raid
# ./check_sakura_raid

2. nagios実行ユーザに対してRAID制御コマンドの実行権限を付与

nagiosの実行ユーザ(初期設定ではnagios)がRAID制御コマンドを実行できるように細工をしてやる必要がありますので、visudoコマンドなどを使って/etc/sudoersファイルに以下のように設定を追加します。

# visudo
nagios ALL=NOPASSWD: /usr/local/bin/tw_cli

上記の設定ではnagiosユーザがパスワード無しでRAID制御コマンドを実行できるように設定していますので、設定後にnagiosユーザで実行可能かどうか確認します。

# sudo -u nagios /usr/local/bin/tw_cli

3. 監視対象ホストで監視ホストからRAID監視を可能にする設定

次に、監視対象ホストのnrpe-serverの設定ファイル(/etc/nagios/nrpe.cfg)に下記の行を追加し、監視対象から設置したプラグインを実行できるように設定します。設定後はnrpe-serverを再起動します。

# vim /etc/nagios/nrpe.cfg
 command[check_raid]=/usr/lib/nagios/plugins/check_sakura_raid

# /etc/init.d/nagios-nrpe-server restart

4. 監視ホストから監視対象ホストに対してRAID監視を行うように設定

最後に監視ホストの監視サービス設定にRAIDを追加します。

# vim /etc/nagios2/conf.d/services_nagios2.cfg

define service {
  hostgroup_name                  nrpe-raid-servers
  use                             generic-service
  service_description             [NRPE] RAID
  check_command                   check_nrpe_1arg!check_raid
}

また、上記で追加したRAID監視設定を監視対象ホストに対して適用します。

# vim /etc/nagios2/conf.d/hostgroups_nagios2.cfg

define hostgroup {
 hostgroup_name nrpe-raid-servers
 alias          [NRPE] RAID servers
 members        server1, server2
}

ここまで設定を変更したらnagiosを再起動します。

# /etc/init.d/nagios2 restart

最終的に監視ホストのnagiosの管理画面から監視対象ホストのRAIDに関するステータスが表示されるようになれば監視設定は完了です。

nagios

以上です。

Ethna2.5以降でTemplateのディレクトリ・パスを変えたい場合

2009.03.15    Ethna, PHP, フレームワーク, 中井      hiko   

ethna2.3.6までは、デフォルトのTemplateディレクトリ(template/ja)から変更したい時に{App_Id}_ControllerでgetTemplatedirをオーバーライドするのが定石でした。ethnaコマンドもgetTemplatedirを見てくれるのでethna add-templateなども問題ありませんでした。

ただ、Ethna-2.5以降では、国際化対応のためLocaleが追加され、以下のジェネレータプラグインのコードのコメント通り(39,40行目)、Localeが入っていないと勝手に補完してくれるようです。このため、ethna add-templateコマンドでtemplateを生成する際にLocaleをディレクトリパスに強制的に入れられてしまうため、国際化対応したくない場合(笑)はここをスキップする必要があります。

今回は綺麗に拡張するのが面倒だったためコメントアウトしましたが、今後は何らかの切り替えができるといいかもしれませんね。

Ethna/class/Plugin/Generator/Ethna_Plugin_Generator_Template.php

13 /**
14  *  スケルトン生成クラス
15  *
16  *  @author     Masaki Fujimoto <fujimoto@php.net>
17  *  @access     public
18  *  @package    Ethna
19  */
20 class Ethna_Plugin_Generator_Template extends Ethna_Plugin_Generator
21 {
22     /**
23      *  テンプレートのスケルトンを生成する
24      *
25      *  @access public
26      *  @param  string  $forward_name   テンプレート名
27      *  @param  string  $skelton        スケルトンファイル名
28      *  @param  string  $locale         ロケール名
29      *  @param  string  $encoding       エンコーディング
30      *  @return true|Ethna_Error        true:成功 Ethna_Error:失敗
31      */
32     function &generate($forward_name, $skelton = null, $locale, $encoding)
33     {
34         //  ロケールが指定された場合は、それを優先する
35         if (!empty($locale)) {
36             $this->ctl->setLocale($locale);
37         }
38
39         //  ロケール名がディレクトリに含まれていない場合は、
40         //  ディレクトリがないためなのでそれを補正
41         $tpl_dir = $this->ctl->getTemplatedir();
42         if (!empty($locale) && strpos($tpl_dir, $locale) === false) {
43             $tpl_dir = $this->ctl->getDirectory(’template’);
44             $tpl_dir .= “/$locale”;
45         }
46         if ($tpl_dir{strlen($tpl_dir)-1} != ‘/’) {
47             $tpl_dir .= ‘/’;
48         }

127.0.1.1

2009.01.26    Linux, 中井      hiko   

FTPの設定をしている時にはまったのですが、下記のようなログがでてうまくいかなかったので何なのかと思って調べてみると、

Ubuntu(Debian)のバグ?というか/etc/hostsに勝手に書かれた設定の影響みたいです。

> Jan 17 12:34:50 xxxx proftpd[18744] xxxx.xxxxx.xxx: 127.0.1.1:21 masquerading as
127.0.1.1
(あるのかわかりませんが)意図があるのだとしても、これによって動かなくなるソフトウェアはあるようなので、

ネットワーク周りを扱うソフトウェアでかつDebian系列で、はまった時は/etc/hostsの設定を見直してみることをお勧めします。

<参考>

http://itmst.blog71.fc2.com/blog-entry-100.html

jQuery

2009.01.06    Web, javascript, 中井      hiko   

遅ればせながらJQuery触ってみました。

思ったより楽なので、早く使えばよかったと若干後悔しました。

ちなみに若干はまったポイントをメモしておきます。

IDセレクタでID名に.や/なんかが入っている場合、エスケープしないといけないのに気づかず、少々はまりました。

きっと、エスケープしなきゃいけない宗教の人による設計なんでしょう。

prototype.jsではエスケープしなくてもよかったのに。ぶつぶつ。

とはいえ、リファレンスちゃんと読んだら書いてありましたが^^;

$(”#hoge[1]“).html(); ×

$(”#hoge\\[1\\]“).html(); 〇

<参考>

http://semooh.jp/jquery/api/selectors/id/

サイトリニューアル

2008.12.22    中井      hiko   

約半年がかり?で自社サイトをリニューアルできました。

やはり一番大変なのは文章ですね。

正確に簡潔に伝えることが難しい。普段から書いてないせいか、どこかで見たことあるような薄っぺらい文章になったり。。

とにかく、リニューアルできてよかったですが、これからも更新は続けていきます!

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.