2004年1月12日月曜日

Debian GNU/Linux, PPxP オンデマンド接続 on kernel 2.2.x

PPxPオンデマンド on kernel2.2.x(スクリプト作成)

PPxPというのは、オンデマンド接続に対応している。 外に出ようとする通信があると、それを察知し、勝手に繋いでくれるという機能だ。 ちょうど「イソターネットエクスプローラを起動したら自動的にインターネットに繋いでくれて、M$Nのトップページを表示してくれるんだよ 便利だよね」というのとだいたい一緒だろう。

ところが、この便利な機能は、カーネル2.1.xの後半くらいからそれ以降のものではちょっと調子が悪いのである。 びっくりである。 ちなみに筆者のDebian BOX、カーネルのバージョンは2.2.17である。 ジャストミートした。 筆者は、懸賞などの抽選に洩れなかったことは今までに一度もないくせに、こういうのにはよく洩らさず当たる。 森永チョコボールのエンゼルマークに、人生のうちのすべてのツキを捧げているのだからしようがあるまい。
それはいいとして、この機能がどう調子が悪いのか述べよう。
オンデマンド(オートモード)をONにすると、インターネットに繋ごうとしても、プロバイダ外への通信ができなくなり、この症状はppxpdを切るまで(quitするまで)ずっと続く、というもの。 (公式ホームページの詳細情報
なお、公式ホームページにある「対処方法」にある通り

仮アドレスとして127.0.0.xを使わない。 例えば、一度手動で接続し、その時のIPアドレスを仮アドレスとしてIP.LOCALに設定する。

という方法を用いると確かにうまくいくのだ。 具体的には

  1. 手動で接続する
  2. そのときのIPアドレスを/sbin/ifconfigや、ターム上でppxpのプロンプト(ppxp>)を出し、printと打って変数IP.LOCALに入っている値を見る
  3. 切断する
  4. ターム上でppxpのプロンプト(ppxp>)を出し、変数IP.LOCALにさきほど調べたIPアドレスを代入する(set IP.LOCAL xxx.xxx.xxx.xxxのようにすればよいだろう)
  5. オートモードをONにする
  6. オンデマンド準備完了、また繋ぐ

.............面倒だ。 筆者は面倒なことは好きではないのだ。

PPxPには「接続確立時と切断時にスクリプトを実行する」ことができるという機能がある。 人によっては「インターネットに繋いだときにニュースグループからニュースを取ってくるようにした」とか「インターネットに繋いだときに日本の時計サーバーに繋いでPCの時計と同期させる」といった使い方をしている。 たしかにこれは便利な機能かもしれない。 筆者は今までこの機能をずっと眠らせていた。 PPxPオンデマンド接続機能を実現するにはこれを利用しない手はない。

どうやってスクリプトを扱うのか。 主にユーザ権限でこの機能を利用する場合を紹介する。

実行させたいスクリプトは、~/.ppxp/rc/に置いておく。 筆者は~/.ppxp/rc/ondemand.rcというスクリプトを書いた。 書いたスクリプトはchmodコマンドで実行形式にすることを忘れないようにしよう。

次に~/.ppxp/ip/にテキスト形式のファイルをつくる。 筆者は~/.ppxp/ip/reconnectというファイルを作った。 これのほかに、~/.ppxp/ip/というディレクトリが無かったのでmkdirで作ったりもした。

最後に~/.ppxp/conf/fooなどのppxpでプロバイダなどへ繋ぐ際の設定が書かれたファイル内を編集する。

スクリプト~/.ppxp/rc/ondemand.rcは以下のようにした。 # 筆者は家じゃbash関白である(謎

#!/bin/sh
export PATH="/usr/bin:/bin:/sbin:/usr/sbin"

case "$1" in
    up)
 case "$PPXP_PHASE" in
     Dead)
  ;;
         *)
  ONDEMAND1=`ppxp foo -C show mode`
  case `echo $ONDEMAND1 | grep AUTO` in
      "")
          ONDEMAND2=`ppxp foo -C print IP.LOCAL`
   ONDEMAND3=`expr "$ONDEMAND2" : "IP.LOCAL=\(.*\)"`
   ppxp foo -C disconnect
   ppxp foo -C disconnect
   ppxp foo -C set IP.LOCAL "$ONDEMAND3"
   ppxp foo -C auto on
   ppxp foo -C connect
      ;;
  esac
      ;;
 esac
 ;;
    down)
 ;;
esac

もしPPxPで接続(手動)したら、そのときの変数IP.LOCALの値(IPアドレス)をとっておく。
そうしたら切断する。 切断のためのコマンドが連続して2つあるのは、すぐに切断したいからである。
切断すると、変数IP.LOCALは最初の127.0.0.1/0.0.0.0という値に戻ってしまう。 よって、変数IP.LOCALにさきほどとっておいたIPアドレスを代入する。
代入してからオートモードをONにする。
また接続する。
するとまたこのスクリプトを実行することになる。
現在のモードがオートモードかどうかをチェックし、オートモードならスクリプトではなにも実行させずに終えるようにする。
これでオンデマンド接続を行える状態になる。

ただ単に「自動でオンデマンド接続OK状態に持っていかせる」だけだが意外に苦労した。 今までスクリプトはほとんどやったことがなかったので、何度もスクリプトをループさせてしまったりした。 接続させるたびにスクリプト内の切断コマンド、接続コマンドを実行してしまうので、繋いだり切ったりをえんえんと繰り返すのである。
とても面白い光景だったが、それでは人を楽しませること以外なんの役に立たないので改良を重ねた。

ファイル~/.ppxp/ip/reconnect
このファイルは以下のようになっている。

start ondemand

これだけ、1行だけ。 ondemandというのは、上記のondemand.rcのことだ。 拡張子は書かないのだ。
もっとその他のスクリプトを~/.ppxp/rc/に作り、それも実行したいのなら

start ondemand
start foo
start fooo
start foooo

のように書けばいい。
なお、スクリプトondemand.rc、foo.rc、fooo.rc、foooo.rcは~/.ppxp/rc//etc/ppxp/rc/などに置く。

設定ファイル~/.ppxp/conf/foo
これは普段PPxPでプロバイダにつないでいるときに使っているものを利用すればいい。 以下は筆者が普段使っているもの(修正あり)である。

source qdial
set MODE active
set AUTH.PASSWD foo
set LOG.FILE foo.log
set LINE /dev/ttyS0
set DIAL.TYPE Isdn
set DIAL.LIST 0123456789PA/10
set AUTH.PROTO PAP
set SERIAL.MODEM aterm
set IDLE.INIT 0
set IP.VJ yes
set IP.RESOLV yes
set IP.DNS xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy
set Initialize "ATH0E1Q0V1X3$N9=10$N1=1&D0&C1"
set IP.START reconnect    # ここでスクリプトを指定している

最後の1行だけ加える。 変数IP.STARTにセットされたものをPPxP起動時に実行する。 同様にして変数IP.STOPをつかえばPPxP終了時に行いたいスクリプトの指定ができる。

お願いとか
こんな強引な方法ではなくもっといい方法があるぞという方は、掲示板もしくはメールでよろしくお願いします。
#はじめてのスクリプトなものでして....(^^;