「何か。(仮)」を使っていてある日思いました。
SSTPでメッセージを送ればこの子は喋る。
じゃあ、自宅サーバのイベントでSSTPを送るようにすれば
「ジェーン」や「キャナル」みたいでかっこ良くないか。

絶対かっこいい。
全然原始的だけど、何かを感じる。


というわけでFreeBSD 4.3からSSTPを送るPerlスクリプトを書きました。
といっても大部分はDORI_x氏が書かれたものを流用しています。パクリ。


2001/06/08:
install時にs3tp.confを作るようにしました。
SWATCHを使ってlogからイベントを拾うようにしました。
設定サンプルどおりにexecで'"'を使うと動作しないのに3日悩みました。

2001/06/02:
メッセージ中に$fooのようにして環境変数を使えるようにしました。

2001/05/26:
'409 Conflict'が返ってきた時には何度でも5秒後に送りなおします。貫徹美。
相手リストに'+'を指定すると5秒間待ちます。

2001/05/25:
引数でホストとポートを指定できるようにしました。

2001/05/24:
UTF-8=unicodeだと勘違いしてました。無知とは罪。
UTF-8で書いたロシア語、ポルトガル語、ドイツ語のメッセージサンプルを追加しました。
ただし、「何か。(仮)」はUTF-8の日本語部分にしか対応していないようで、ロシア語を喋らせようとすると苦悶します。
さらにゴミが表示されたりされなかったりします。

2001/05/23:
SEND/1.2とSEND/1.4をSEND/1.1で送っていたのを修正。「何か。(仮)」はおおらかだ。
UTF-8で\hや\s等を送っても駄目で、ASCIIコードで送らないと受け付けない模様。

2001/05/22:
SEND/1.2とSEND/1.4に対応しました。「何か。(仮)」からの返答は標準出力に出力するようにしました。
UTF-8で「何か。(仮)」にメッセージを送っても無視されます。

2001/05/21:
環境変数LC_ALL、LC_CTYPE、LANGを調べて複数言語に対応できるようにしました。
引数が指定されない場合は標準入力から読み込むようにしました。

2001/05/20:
全面的に書き直しました。
エラーチェックをするようにしました。エラー報告などを標準出力に出力します。


一応ports化してありますので、fetchしてホームディレクトリでtar xzf s3tp.tar.gzで展開してmake installして下さい。root権限が必要です。

s3tp.tar.gz
s3tp.tar.gz
s3tp.tar.gz
s3tp.tar.gz
s3tp.tar.gz
s3tp.tar.gz
s3tp.tar.gz
s3tp.tar.gz
s3tp.tar.gz
s3tp.tar.gz

FreeBSDでない人は手作業で何とかしてください。

s3tp0.5
s3tp0.42
s3tp0.41
s3tp0.4
s3tp0.32
s3tp0.31
s3tp0.3
s3tp0.2
s3tp0.1
s3tp0.01


/usr/local/etc/s3tp.conf.sample
s3tp.confにリネームして適当に変更を加えてください。
1行目はsender(送り主はどのサーバか)。
2行目はSSTPポート。
3行目以降はSSTPを送るIPアドレスおよびホスト名です。foo.bar.jpみたいなホスト名は使えません。

/usr/local/etc/s3tpsample/ppp.linkdown
/etc/ppp/にコピーしてください。必要に応じて「papchap:」も変更してください。

起動時とshutdown時、ppp切断時に「何か。(仮)」が喋ります。
rebootを使うのははしたないのでやめましょう。shutdown -r nowです。

テストとして、

/usr/local/bin/s3tp bootup.dat

で「何か。(仮)」が喋れば成功です。(root権限が必要です。)


■s3tpはどう動くのか。

ソースのご加護あれ。

/usr/local/etc/s3tp.confを読み込み、諸々を知ります。
環境変数LC_ALL、LC_CTYPE、LANG、の順に調べ、値がセットされていればデータファイルは/usr/local/etc/nanika./以下の環境変数で指定されたディレクトリにあるものとします。
環境変数が空か、該当するディレクトリが無ければ/usr/local/etc/nanika./defaultになります。
そのディレクトリから.langを読み込み、セリフデータは.langに書かれている文字コードで書かれているものとして扱います。
.langが存在しないか、文字コード名が異常な場合はShift_JISとして扱います。
引数をチェックして読み込みます。
s3tp [-h host] [-p port] [datafile]
第1引数のファイル指定されたファイルを上記のディレクトリからセリフデータとして読み込みます。
引数が無ければファイルが指定されなければ標準入力から読み込みます。
ランダムに1ブロックをSSTPで送るというのを相手分繰り返します。
'409 Conflict'が返ってきた時は相手リストの最後に'+'と共に再び登録します。
1ブロックは行頭文字が'\'なら1行分、':'ならSEND/1.2として、'+'ならSEND/1.4として次に行頭が':'か'+'の行が現れるまでです。
エラーチェックは一切やってません。
指定されたファイルが存在するか、中身があるかないか、指定されたホスト名は存在するか、等をチェックして標準エラー出力にエラーを出力します。

標準出力には、
相手のIPアドレス
「何か。(仮)」からのステータス
セリフがSEND/1.2でステータスが正常なら選択された項目がSJISで
空行

が相手分出力されます。


■SEND/1.1、SEND/1.2、SEND/1.4のサンプル

SEND/1.2とSEND/1.4のサンプルは公式ページのサンプルそのままです。

\t\h\s0これにて一巻の終わりでございます。\w6\uぽっくん。\e
:
\t\h\s0どんな感じ?\n\n\q0[#temp0][まあまあ]\q1[#temp1][今ひとつ]\z
Entry: #temp0,\h\s0ふーん。\e
Entry: #temp1,\h\s0酒に逃げるなヨ!\e
+
IfGhost: さくら,うにゅう
Script: \h\s0さくらだー。\w8\n\n%j[#mainblock]
IfGhost: せりこ,まるちい
Script: \h\s0せりこだー。\w8\n\n%j[#mainblock]
IfGhost: さくら,ケロ
Script: \u\s0わいのはモダン焼きにしてや?。\w8\h\s0はいはい。\e
Entry: #mainblock,\s7寝言は寝てから言えっ!\w8\u\s0落ち着けっ!\e

都合上、SEND/1.1のデータをSEND/1.2やSEND/1.4よりも後に置くことは出来ません。


■今後の目標。

・Perlを勉強してエラーチェックをする。
・Linuxなんかにも対応する。
・LANGやLC_CTYPEを参照して複数言語に対応する。
・もっとセリフを増やす。
・もっといろんなイベントに対応する。
・send-prする。(野望)
2001/05/20:
・引数でファイルが指定されない場合標準入力からメッセージを読み込む。
・引数で接続先やポート番号を指定できるようにする。
2001/05/21:
・SEND/1.2とSEND/1.4に対応する。
・SEND/1.2で選択することでサーバで何か動作を起こす。
・サーバに対する外部からの接続要求をイベントとする。(野望)
2001/05/23:
・UTF-8をどうにかする。「何か(仮)」が対応しないとどうにもなりません。
2001/05/24:
・409 Conflictが返ってきた時は時間を空けて何回かリトライする。

戻る