2009-09-27 (日)
*「もしものとき」に備えて
最近の反省を踏まえて,携帯電話から一通りの作業が出来るように環境を整える.
携帯電話といっても,iPhoneやAndroidとかではなくて,私は普通のケータイ使ってます.iPhoneはAppleにお布施しないとソフトを開発できないのが嫌だし,Androidはもう少し様子見という感じ.
今までは,HTTP経由でコマンドを実行できるCGIを設置していたけど,設置していたサーバでは最近何もしていないので別の場所に.
さらに,コマンドの実行結果を返すだけだと対話的なコマンドとかが実行できないので作り直す.
i-modeからsshするためのゲートウェイとアプリを数年前から考えていたのだけど,面倒なので普段使っているscreenをCGIから操作することにしました.
基本的なこと
今回はapacheの権限でCGIを動かすので,screenを操作するためにsuidする.suidperlとか入ってないので,C++で書く.
とてもセキュリティ的に危険なので認証とかにバグが混入しないように.
screenのhardcopyはUTF-8が文字化けする
現在の画面はhardcopyコマンドで保存とか昨日書いたけど,実は文字化けしてダメ.ちゃんと設定すれば大丈夫だろうと思っていたのですが,encodingとかc1とか色々やってもダメでした.
logを使う
logにはコントロールコードを含めて全てが記録されます.
最終的には端末をエミュレートするアプリを作る予定ですが,まずはテキストベースということでエスケープシーケンスとかが邪魔です.凝ったインターフェイスのソフトとか使っていると大変.
とりあえず,現在の一画面だけログに出力する.
screen -X eval "msgminwait 0" "logfile flush 0" "width -w 80" "logfile test.log" "log on" screen -X eval "log on" redisplay screen -X log off
「redisplay」だけだと上手くいかないことがあるので「width -w 80」とかして強制的に更新.
ペーストバッファを使って保存
今回は,画面全体をペーストバッファにコピーして保存しました.
screen -X eval "readreg t" "msgminwait 0" "copy" "stuff \"H L$ \"" "writebuf screen.txt" "paste t ."
こんな感じで,一旦 t にペーストバッファを退避して,全体をコピー&保存して,ペーストバッファを元にもどします.
コピーモードだとダメなのが痛い.
あとは
色々やると,メッセージ周りで嵌りやすい.メッセージ表示中はコマンド受け付けてくれなかったり,書き込んでも画面が更新されなかったりする.
detachされているscreenに書き込むとscreenが落ちてしまうので,screenの中からlocalhostにsshで入ってattachしておく.