Tweet
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
- Newer: Macbook(MC240J/A)届いた
- Older: mod_hello: 初めてのApacheモジュール
Home > > Apache&Cのお勉強:mod_statusをちょっと変えてみる(クエリでExtendedStatus ONに)
Tweet
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Home > > Apache&Cのお勉強:mod_statusをちょっと変えてみる(クエリでExtendedStatus ONに)
Home > Apache > Apache&Cのお勉強:mod_statusをちょっと変えてみる(クエリでExtendedStatus ONに)
Tweet
Apacheのお勉強継続中。
Cとかわからなすぎて、Apacheのソース読むどころか、
モジュール作ってみるのさえいつになることやら。
なんて愚痴ってばかりもいられないので、
今日は既存のモジュールを弄ってみる。
ターゲットはmod_status。
?autoで形式変えれるんだから、
?extendでExtendedStatus ONの変わりができないかという発想。
参考書がパンダ本なので、Apacheのバージョンは1.3です。
# prototype作成
cd /home/t/module
apxs -g -n status2
cd status2
# mod_statusで上書き
cp -pi mod_status2.c mod_status2.c.org
cp -pi /home/t/apache_1.3.41/src/modules/standard/mod_status.c mod_status2.c
# statusをstatus2に置換
$perl -i.bk -p -w -e 's/status/status2/g' mod_status2.c
# やりすぎた。定義済みのがあるらしい
$ perl -i -p -w -e 's/extended_status2/extended_status/g' mod_status2.c
$ perl -i -p -w -e 's/score_record\.status2/score_record\.status/g' mod_status2.c
# そのまま動かしてみる
make
make install
# 自動で設定される
LoadModule status2_module libexec/mod_status2.so
# 手動設定するやつ
vi /home/t/apache/conf/module.conf
<Location /status>
SetHandler server-status
</Location>
<Location /status2>
SetHandler server-status2
</Location>
# 再起動
apachectl restart
# 動作確認⇒OK
firefox localhost:8080/status &
firefox localhost:8080/status2 &
すでに行き当たりばったり感がガンガン漂ってますが、
気にせずカスタマイズしていきましょう。
# 動いた状態を保存しとく
cp -pi mod_status2.c mod_status2.c.ok
クエリに応じた処理を追加。
vi mod_status2.c
160行目付近
/* ID values for command table */
#define STAT_OPT_END -1
#define STAT_OPT_REFRESH 0
#define STAT_OPT_NOTABLE 1
#define STAT_OPT_AUTO 2
#define STAT_OPT_EXTEND 3
170行目付近
ENDまでループしてるっぽいので4個目に挿入。
static const struct stat_opt status2_options[] = /* see #defines above */
{
{STAT_OPT_REFRESH, "refresh", "Refresh"},
{STAT_OPT_NOTABLE, "notable", NULL},
{STAT_OPT_AUTO, "auto", NULL},
{STAT_OPT_EXTEND, "extend", NULL},
{STAT_OPT_END, NULL, NULL}
};
250行目付近
case STAT_OPT_AUTO:
r->content_type = "text/plain; charset=ISO-8859-1";
short_report = 1;
break;
case STAT_OPT_EXTEND:
break;
}
# とりあえず、ここまででテスト⇒OK
make
make install
apachectl restart
firefox localhost:8080/status2 &
# さて、いよいよExtendedStatusをONに
# ap_extended_statusが怪しい
# /home/t/apache_1.3.41/src/include/http_conf_globals.h
# で定義されてるやつ↓
# extern API_VAR_EXPORT int ap_extended_status;
vi mod_status2.c
250行目付近
case STAT_OPT_EXTEND:
ap_extended_status = 1;
break;
}
としてみる。
# 動いた・・・けど、ずっとExtendedStatus Onになっちゃう。
# 保存しといてメソッドから出る前に戻せばいいのか?
180行目付近
static int status2_handler(request_rec *r)
{
int extend_by_query = 0;
int temp_ap_extended_status = ap_extended_status;
:
:
250行目付近
case STAT_OPT_EXTEND:
ap_extended_status = 1;
extend_by_query = 1;
break;
}
:
:
720行目付近
if (extend_by_query) {
ap_extended_status = temp_ap_extended_status;
}
ap_kill_timeout(r);
return 0;
}
おぉ!一応要件通りの結果に!!
/status2で概要を目で見つつ、
/status2?auto&extendで詳細情報を機械的に取得、
とか、需要ないか;
・・・っていうか何か絶対ダメだな、このコード。
素直に設定ファイルで変更した方が良さそうだ。
(Cがわからなすぎて、何が危ないかもわからない・・・)
というわけでソース全体を公開するのは止めときます。
まぁそこそこ勉強になったのでめでたしめでたし。
Home > Apache > Apache&Cのお勉強:mod_statusをちょっと変えてみる(クエリでExtendedStatus ONに)