昔 いったように, 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しかし, どんなパッチを当てたか, このスクリプトから想像できますね。
時刻ぐらいは自動であわせたい
メールの設定