2009年12月13日日曜日

NetWalkerで快適一日常時接続(もどき) その1


タイトルがうまくかけません。NetWalkerでbluetooth DUNで、電源入れたら自動接続みたいな内容なんですが...題名でググってこられた方は、こちらのリンクで解説部分へジャンプできます。
12月12日
今日はさっきまで二日酔い抜けずにごろごろしてたけど、これからMacBook Pro持って外出します。一度スタバとかでMac開いてみたい。あと、会社にiPhoneの充電ケーブル忘れたので、買いにいかないと明日iPhoneが文鎮になっちゃう。

それで午後だいぶ回ってからバス停に並んでいると、宅急便運送の2トントラックがバス停スペースの前方に止まりました。人が並んでるの見て、バスがすぐ来るの分かるじゃん、どこの○○○○だよ...と思っていると、降りてきた運転手みてビックリ。ソリコミの入った元族みたいな感じの、いかにもな人が降りてきました。道路反対側のコンビニに荷物3個持って入っていきます。その後バスが来るぞ来るぞと待っているとなかなか来ない。バスが来てもまだ止めるスペースはありますが、前方の端にトラックが止まっているので出るときに迷惑そうです。
そのうち、既に時刻表から5分近く経過。運送屋の運転手がコンビニから出てきます。道路後方を見る。そして、遠くから近づきつつあるバスを見ると、ニヤリと不敵な笑いを浮かべてからトラックに素早く乗り込み、バスが来る直前に去っていきました。なんかこの雰囲気をなんというのか。一瞬カッコイイとかそういう表現が当てはまってしまうような気が、いや違反行為ではありますが。

その後バスで駅まで。途中のバス停で降りる人を見て、「後ろの人たちをブロックして両替機で両替してる人は、支払い動作もすごく遅いな...」という持論の検証をしてうんうんとか思ってました。ところが両替3人目くらいの若者が、両替機の出力を素早く取ると、何かのプロとしか思えない一瞬の動作で硬貨を選別して料金箱に放り込みおりていきました。持論崩れる。

今日は素早いヤンキーを良く見るな...とか思いながら、NetWalkerで打ってます。そういえばこうしてNetWalkerで快適なネットモバイル環境がエンジョイ出来るのもイーモバイルTouch Diamond S21HTのBluetooth DUNのおかげな訳ですが、その件で1エントリー書くのを忘れてた。せっかくなので今書きます。

その内容は「NetWalkerで快適一日つなぎ放題生活」もともと、NetWalkerの電源入れたら自動でインターネットにつながって、ずっとオンラインで使えたら便利だろうなーという思いつきで始めてみました。数日試してブログにでも書いたら飽きて終わり、みたいなネタ的扱いの予定で。ところがどっこいマジ快適です。構想当初は、とにかく自動接続出来ればいいやと接続コマンドponをスリープ復帰スクリプトに組み込んでいただけだったのですが、その後演出上の都合で接続通知を組み込んだりしてます。通知を見て「あぁ、自動接続してるんだ。便利だなぁ」と無理やりにでも便利な気持ちにマインドコントロール出きるように工夫しました。

さて、自動接続を主体とした今回の設定ですが決行前に一つ準備というか前提があります。
それにはまず秋葉原にバッテリーを買いに行かなければなりません。S21HTはbluetooth DUNモデムとして使っていると数時間でバッテリーが切れてしまいます。例えば秋葉原に出かけるとき頻繁に通信すると帰りにはバッテリーが切れてしまう。このままでは自動接続されても、バッテリーが早く切れるだけです。
そこで、まず秋葉に行って、大容量バッテリーを買ってきます。秋葉原にアキモバ(旧モバイル専科と店内いっしょ)とかモバイルプラザとかあってサードパーティー製のを売ってます。3倍まであるので、これで連続でも半日持ちます(実験で8時間とかだったかな?twitter漁らないと記録出ないや)。売り切れの可能性もあるので通販がいいかもしれません。それでは、S21HTの厚みが3倍になった所で本題に入りたいと思います。

12月13日
かゆ...うま... じゃなくて続き書かないでいるうちに一日たっちゃったよ。
最初に本日の何ていうかレシピ?(あぁこっぱずかしい)を挙げときます。

  1. スリープで自動切断 起動で自動接続

  2. 起動スクリプトから通知表示(通知先の表示セッション(Xセッションっての?自信なし)を持ってないので指定しないと表示されないので)

  3. syslogの中を見て接続途中の経過を良さげに通知表示


個々の内容について幾つかは過去のエントリーで書いています。

こうして見ると今回の内容は過去のエントリーの集大成という感じでしょうか。どれくらい集大成かというと...

スリープ時のスクリプト実行については、bluetoothアダプタがスリープ後に使えなくなる対策として前に書いたのが上記のエントリです。しかしそのうち段々効果が不安定になって、スリープ後bluetooth使えないことが多くなってきました。ところが、
こちらのブログ「NetWalkerでbluetoothを安定して使用する」の方法をやってみたら、すごい安定するじゃありませんか。そこで今回はその方法を有難く真似させていただいております。あれ?過去エントリーだめじゃん。

通知については、上記のエントリーでは標準のnotify機能が不安定でポップアップ併用とか日和ってましたが、Twitterでぼやいてたら、詳しい方にちゃんと通知が出る方法を教えて頂けました!よって出力方法ちょっと違います。これも全然集大成じゃないです。

sudoのパスワード省略ですけど、あれ?そもそも今回のスクリプトはrootで実行されるから、sudo必要ないかも(自分はつけてるけど)これも使わないかな?

振り返ってみると過去のエントリーはあんまり役に立っていないような。まぁ、全然使ってない訳ではないですし、google検索の元単語拾うネタにするとか、いろいろ調べる役には立つのではないかと思います。

さて、それでは電源入れると自動で接続される動作のご紹介をしてから、スクリプトのソースを貼っていきたいと思います。


まず、電源を入れる(実際にはスリープから復帰)と、接続開始の通知が出ます。
自動ですが、最後にスリープしたときPPP接続中だった場合のみ接続開始しますので、ある程度コントロール可能です。

次に、接続中の状況が適宜表示されます。
これは、ponの実行ログが、/var/log/syslogに書かれるのを1秒間隔で見て、出力に変化がなかったら「時間かかってんのかな?」という事で表示しています。結構親切だと思いませんか。


最後に、接続状況を表示して終わりです。


それでは以下にスクリプトのソースを貼ります。私はこれを、50-test.shという名前で/etc/pm/sleep.dに保存しています。(上記のお世話になったブログ「NetWalkerでbluetoothを安定して使用する」を参考にして)なお、スクリプトの頭は今回は数値である必要は無い...と思いますが試してません。ファイル名がひどくてすみません。
保存はsudo geditで新規ファイル作って下のソースをコピペして上記フォルダに保存。その後sudo chmod 755 /etc/pm/sleep.d/50-test.sh で実行属性をつける
過去エントリー「NetWalkerのBluetoothアダプタがスリープで動かなくなる」を見て/etc/acpi/suspend.dにスクリプトを作っている人は、機能がかぶりますので、消した方がよいです。
あと、スクリプトの変更ポイントですが、
flagfile="/var/tmp/pppsuspend20091123" は、スリープ時に接続状態だったかどうかを覚えるワークファイル名なので何でもいいです(このままでも)
userid="XXXXX" 利用者のユーザーIDに変更します。通知で使うので。
log () { logger -p 'user.notice' -t 50-NW "$1" ; }  「50-NW」の部分はsyslogに目印として書いていますので何でもいいです
sudo /usr/bin/pon s21ht 私はs21htという名前でpppconfigの設定作ってるのでこうなってます。デフォルト設定でponだけの人が多いかも。

さて、ここからスクリプトの部分解説をしたいところなんですが、もう11時半ですか、ほんとは自らの初心者スクリプトを言い訳しながら解説するのが楽しくて書いているエントリーなんですが、明日会社だし、長くなりすぎたので、次のエントリーに持ち越したいと思います。よし、タイトルにその1って書いちゃえ。


#!/bin/bash

flagfile="/var/tmp/pppsuspend20091123"

userid="XXXXX"

#関数を定義 通知を表示する usage:notify タイトル テキスト
notify(){
cmd="python -c \"import pynotify;pynotify.init('$1');n=pynotify.Notification('$1','$2','dialog-info');n.set_urgency(pynotify.URGENCY_CRITICAL);n.show()\""
su $userid -c "exec env DISPLAY=':0.0' XAUTHORITY='/home/${userid}/.Xauthority' ${cmd}"
}

#関数を定義 syslogに出力する
log () { logger -p 'user.notice' -t 50-NW "$1" ; }

log "$1処理中"
if [ "$1" = "suspend" -o "$1" = "hibernate" ]
then
if ifconfig | grep "^ppp"
then
log "PPP接続中"
sudo /usr/bin/poff
echo >${flagfile}
chmod 666 ${flagfile}
else
log "PPP未接続"
fi
sleep 2
sudo /etc/init.d/bluetooth stop
elif [ "$1" = "resume" -o "$1" = "thaw" ]
then
log "レジューム処理"
sudo /etc/init.d/bluetooth start
sleep 2
if [ -e ${flagfile} ]
then
rm ${flagfile}
########
notify "PPP" "接続開始"
log "PPP接続開始"
sudo /usr/bin/pon s21ht
sleep 1
fskip=0
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
if [ $fskip = "0" ]; then
#syslogの末尾がExit.かどうか調べる
tail /var/log/syslog -n 20 | egrep "(pppd\[|chat\[)" | tail -n 1 | grep "Exit.$"
rexit=$?

#syslogの末尾がDNS.*addressかどうか調べる
tail /var/log/syslog -n 20 | egrep "(pppd\[|chat\[)" | tail -n 1 | grep "DNS.*address"
rdns=$?

#syslogの末尾がERROR^Mかどうか調べる
tail /var/log/syslog -n 20 | egrep "(pppd\[|chat\[)" | tail -n 1 | grep "ERROR^M$"
rerror=$?

#syslogの末尾を$nlに取得
nl=""
while read ll2; do
if [ "$ll2" != "" ]; then
nl=$ll2
fi
done < <( tail /var/log/syslog -n 20 | egrep "(pppd\[|chat\[)" | tail -n 1 )

#syslogの末尾($nl)が前回($ll)と変化なくかつ通知済み($al)と違ってたら通知表示
if [ "$nl" != "" -a "$nl" = "$ll" -a "$ll" != "$al" ]; then
notify "PPP" "$nl"
al=$nl
fi
ll=$nl

#終了条件のどれかが立っていたら終了
if [ "$rexit" = "0" -o "$rdns" = "0" -o "$rerror" = "0" ]
then
fskip=1
else
echo $i
fi
sleep 1
fi
done
#最後に、接続状況を表示
if ifconfig | grep "^ppp"
then
notify "PPP" "接続しました"
else
notify "PPP" "接続していません"
fi
########
fi
fi

0 件のコメント:

コメントを投稿