次のページ 前のページ 目次へ

7. ダイアルオンデマンド(Dial-on-Demand)

KerneldはPPPといったモジュールを必要に応じてロードします。kerneld-HOWTO に書かれている追加機能は,特定のルートが失われたらスクリプトを呼び出すという 機能があるというものです。Kerneldはシェルスクリプト/sbin/request-routeを探します。以下のスクリプトはmodules-2.0.0.tar.gzにあった スクリプトのコピーです。

/sbin/request-route:


#!/bin/sh
LOCK=/var/run/request-route.pid
export PATH=/usr/sbin:$PATH     # for ppp-2.2*

# This script will be called from kerneld with the requested route as $1
# $1として要求されるルートで、このスクリプトがkerneldから呼び出されます。

chatfile=/etc/ppp/$1

# If no chatscript exists use a default value (symlink to preferred script):
# chatスクリプトがなければデフォルト値を使います
# (参照されるスクリプトへのシンボリックリンク):

[ ! -f $chatfile ] && chatfile=/etc/ppp/default

# Check if we're already running:
# 実行されているかどうかチェックする:
if [ ! -f $LOCK ] ; then
        pppd connect "chat -f $chatfile" &

        # Timer to be killed by ip-up, tunable! Check kerneld delay as well
        # ip-upによってkillされるタイマ。変更できます!kerneldもチェック。
        sleep 60 &
        sleepid=$!
        echo $sleepid > $LOCK
        wait $sleepid
        rm -f $LOCK
        exit 0
fi
exit 1

Kerneldは引数として無くなったルートを使ったこのスクリプトを実行します。
/sbin/request-route x.x.x.x
スクリプトは'request-route'-要求(instances)の重複を防ぐためにロックファイル (lock-file)を使います(訳注:ロックファイルがあるデバイスは他から 使用できないようになります)。 最初はネームサーバへの参照があった時にスクリプトが起動されるように していました。しかし、ローカル(=自分のマシン)で(キャッシュ用に)ネー ムサーバを走らせようとすると、(最初の)参照がキャッシュされるため、2 度目(以降)の参照では(外部へアクセスが無いため)接続が確立しません。

異なるリンク用のチャットスクリプト(chat-scripts)を複数つくるか デフォルトのチャットスクリプトでISP(プロバイダ)に接続するようにします。

リンクが確立されたらpppdは/etc/ppp/ip-upスクリプトを実行します。 これはロックファイルを削除するものです。sendmailのキュー実行(queue-run)のよう に、リンクが確立される時はいつでも実行したいコマンドを追加します。


#!/bin/ash
LOCK=/var/run/request-route.pid
[ -f $LOCK ] && kill `cat $LOCK`

# Execute these commands after connecting:
# 接続後実行するコマンド:
#/usr/sbin/sendmail -q

'idle-disconnect'オプションは自動的にアイドルリンクを切断します。直接 PPPを切断するときは'ppp-off'スクリプトを実行します。

/usr/sbin/ppp-off:


#!/bin/sh
LOCK=/var/run/request-route.pid
DEVICE=ppp0

rm -f $LOCK
#
# If the ppp0 pid file is present then the program is running. Stop it.
# ppp0 PIDファイルがあればkillする。
if [ -r /var/run/$DEVICE.pid ]; then
        kill -INT `cat /var/run/$DEVICE.pid`
#
# If unsuccessful, ensure that the pid file is removed.
# 不成功なら、PIDファイルが削除されていることを確認。
        if [ ! "$?" = "0" ]; then
                echo "removing stale $DEVICE pid file."
                rm -f /var/run/$DEVICE.pid
                exit 1
        fi
#
# Success. Terminate with proper status.
# 成功。適当な状態で終りました。
        echo "$DEVICE link terminated"
        exit 0
fi
#
# The link is not active
# リンクがアクティブではない。
echo "$DEVICE link is not active"

exit 1


次のページ 前のページ 目次へ