apachectl 3分ハッキング

 
あまりにも最近更新出来ていないので、仕事ネタで更新しておこうと思いついた。
過去のBlogから記事を引っ張りだしてきた。
 
apachectl 3分ハッキング:
 http://myhome.cururu.jp/aquacity/blog/article/91001486526
 
以下の内容は上記記事の転載である。
自分の記事なので著作権を気にしなくていい♪
ああ、せっかくだから少し見直して多少文章を直しておくかな。
 

                                                                                                                      • -

 
諸事情で apachectl をハックすることになった。
 
OSがLinux系の apache では、apachectl を使って httpd(http deamon) の起動・停止を行うのが一般的だろう。
今回、ハックする要件は「httpd 起動の際は必ずSSLを有効にしたい」である。
 
apachectl start
 通常の起動
apachectl startssl(/sslstart/start-SSL)
 SSL有効起動
 
なのは、apacheを使っている方には基本であろう。
この apachectl start をどうにかしたい。
SSL有効起動をするはずが、うっかり通常起動してしまうことを防ぐためだ。
 
まず、apachectl の中身は実は shell script である。
オレはずっとバイナリかと思っていたので、今まで知らなかった(笑
 
中を見てみると意外と簡潔でわかりやすい。
 

### 中略
    case $ARG in
    start)
    if [ $RUNNING -eq 1 ]; then
        echo "$0 $ARG: httpd (pid $PID) already running"
        continue
    fi
    if $HTTPD ; then
        echo "$0 $ARG: httpd started"
    else
        echo "$0 $ARG: httpd could not be started"
        ERROR=3
    fi
    ;;
    startssl|sslstart|start-SSL)
    if [ $RUNNING -eq 1 ]; then
        echo "$0 $ARG: httpd (pid $PID) already running"
        continue
    fi
    if $HTTPD -DSSL; then
        echo "$0 $ARG: httpd started"
    else
        echo "$0 $ARG: httpd could not be started"
        ERROR=3
    fi
    ;;
    stop)
### 以下略

 
これなら3分ハッキングが余裕で可能である。
shell がわからない方のために、2つほど修正方法を紹介しておく。
 
ちなみに上記は引数("./apachectl start"などとした場合の'start'に当たる部分)ごとの処理を行っている部分の一部抜粋。
「start」と「startssl/sslstart/start-SSL」でほぼ同一処理をしているのがわかる。
違うのは一点、$HTTPD に対して -DSSL オプションを与えているかどうかのみ。
HTTPD変数はここで紹介していないが、/apache/bin/httpd などを指定している
 
改修その1:
「'start'オプションが指定されても、SSL有効起動とする」
 
修正前:

    if $HTTPD ; then

修正後:

    if $HTTPD -DSSL ; then

 
これは start 引数指定時処理をhttpdSSL有効起動としてしまう方法。
 
または、start) 〜 ;; を全て削除し、
修正前:

    startssl|sslstart|start-SSL)

修正後:

    start|startssl|sslstart|start-SSL)

 
こちらは、元々のSSL有効起動処理の引数判定の中に'start'も含めてしまう方法。
 
いずれにせよ、これらのパターンだと 'start' オプションでもSSL有効起動を行う。
悪い癖がつく、というデメリットも存在するわけだ。
なので、オレは次の方法を使った。
 
改修その2:
「'start'オプションが指定されたら、エラーメッセージを出力する」
 
修正前:

    start)
    if [ $RUNNING -eq 1 ]; then
        echo "$0 $ARG: httpd (pid $PID) already running"
        continue
    fi
    if $HTTPD ; then
        echo "$0 $ARG: httpd started"
    else
        echo "$0 $ARG: httpd could not be started"
        ERROR=3
    fi
    ;;

修正後:

    start)
    echo "Please Use Command 'startssl/sslstart/start-SSL'
    ;;

 
至ってシンプル。
また、見ての通り、apachectl は httpd を起動したりする、ただの shell スクリプトである。
ハック対象 apachectl の apache(httpd) が起動していても、リプレイス可能である。