IIJ-PPP を改造する

98年1月18日


ここまででなかなか便利になってきたのだが, どうも気に入らないことがある。

いったように, PPP 接続していない時と, している時で状況が大きく異なり, さらに PPP 接続先によっても設定をいろいろと変えないといけない。 これを手動でやるのは面倒である。 ということで, 自動設定用のスクリプトを作るのだろうが, 何か間抜けなスクリプトになってしまう。 PPP によるリンクが張られているかを常に監視して, リンク確立を確認して named の設定を変える, という感じになるだろうが, 「常に監視して」というのが, 何とも間抜けである。

あるいは, IIJ-PPP を立ち上げるのと同時に suid (+wrapper) したスクリプトを たちあげる, という方法もある。しかし, これでは ppp が異常終了したとき (電話がかからなかったような時) にも, リンクが張られている設定に変化してしまう。

ということで, 普通にやったら間抜けな方法しか思いつかない。 と, ここで, Linux の PPP を参考にしてみる。Linux では PPP コマンドは ルートでしか使えない。そのかわり, PPP リンクが確立された時に自動的に スクリプトを実行して, そのスクリプト内で resolv.conf を書き換えたり, キューに溜ってまだ配送されていないメールを送り出したり, ということができる。

ということで, この「リンクにスクリプトを実行」という機能を実現する。 C で書かれた IIJ-PPP のプログラムに 10 行ほど書き加えただけである (なかなか quick hack な, へぼいパッチなので公開しないけど, どうしても欲しいという人がいれば, あげます。2.2.1 の PPP + NAT patch な IIJ-PPP に対するパッチです。とりあえず メールでどうぞ)。

で, できた IIJ-PPP を使うことにする。リンク確立・解消に実行されるスクリプトは, こんな感じである。IIJ-PPP 自体を root に suid しておけば, このスクリプトも root 権限で実行される。 したがって, ちょっとしたミスが死を呼ぶので注意しよう。特に, 環境変数に依存するスクリプトには細心の注意が必要である。 下手に rm $HOGE なんてやってて, $HOGE="-rf /" だったりしたら…。

#! /bin/sh
if [ $1 = up ]; then
  cp /etc/namedb/named.boot.ppp /etc/namedb/named.boot
  kill -HUP `cat /var/run/named.pid`

# キューに溜ったメールを出す
  /usr/sbin/sendmail -q
# ニュースを取り込む
  su news -c "gnspool -f"
fi

if [ $1 = down ]; then
  cp /etc/namedb/named.boot.noppp /etc/namedb/named.boot
  kill -HUP `cat /var/run/named.pid`
fi
しかし, どんなパッチを当てたか, このスクリプトから想像できますね。
時刻ぐらいは自動であわせたい
メールの設定