もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

alertyとmikutterでマイクラサーバの死活を監視するよ

はじめに

会社のお友達との会話。

友(品証部門「もぐのさん・・・またマイクラのサーバが落ちてません?」


も(ソフト屋さん)「あ、うあああ、あのですねっ!
サーバの電源が何故か落ちてる事がありまして!OAタップが怪しいんですが原因究明には至っていません!
仮対策でAC Power Fail AfterとVM自動起動をですねっ!てか今仮復旧させました!さぁ!さぁ!ご確認ください!!」

まぁ、恒久対策は後から考えるとして(考えない)、サーバが落ちてるのに気付けてない現状はアレなので、死活管理をする事にしました。

正直、専用のWebページやアラートメールなんか絶対見ないので、毎日平均6時間以上見つめているmikutterさんに表示させるのが良いかと思いました。

しかしながら、単に「pingを打つプラグイン」を作るのもつまらないので、今回はもうちょっと汎用的な仕組みを目指そうと思います。

UNIXによく似た世界と、ておくれたmikutterの世界

サーバの監視といえばUNIXライクなOSが得意とする分野ですね。
pingに限らずUNIXの任意のツールとmikutterが連携ができれば、色々応用が利きそうです。

と言うわけで、UNIXの世界とmikutterの世界を橋渡しするmikutterプラグインを作りました。

mikutter-datasource-netcat

moguno/mikutter-datasource-netcat · GitHub

ncやtelnetなどでlocalhost:39390/TCPに文字列を送り込むと、その内容をメッセージとして出力します。
(抽出タブの"TCP:39390"データソースのメッセージになります。)

例えばこんな感じです。

date | nc localhost 39390

f:id:moguno:20150907185641p:plain

コマンドの出力がmikutterのメッセージになりました。

echoを使えば任意のセリフをみくったーちゃんにしゃべらせることもできます。

echo 'もう!マスターのえっち' | nc localhost 39390

f:id:moguno:20150907185857p:plain

アホですね。

mikutterでping死活管理

さて、本題のping死活監視ですが、こんな感じでパーツを組み合わせていこうと思います。

  1. cronを使って定期的にサーバにpingを打つ。
  2. サーバから返事がなかったらncでlocalhost:39390にメッセージを送信。
  3. mikutter-datasource-netcatが抽出タブにメッセージを出力。

まずはcronで動かす監視スクリプトの作成ですが、ここで朗報が。

丁度この記事を書いてる最中に、cron用のエラー通知ツールの記事がはてブのホットエントリに出てきました。

blog.livedoor.jp

どうやらコマンドがエラーになったときに、色んなところに通知が飛ばせるツールっぽいです。
通知先に「任意のコマンド」を指定することも出来るっぽいので、ncを使ってmikutterとも連携出来そうです。
(くくく、これで俺もホットエントリの仲間入りじゃね?)

それではalertyのインストール。

sudo gem2.2 install alerty

続いてレシピファイルを書きます。
(/Users/moguno/alerty/watch_mincraft_server.yml)

plugins:
  - type: exec
    command: echo "マスター大変!マイクラサーバが死んでるよ!" | nc localhost 39390

次にcrontabを設定します。
ちなみに"araaraufufu.pw"がうちのマイクラサーバのホスト名です。(遊びに来てね。)

*/1 * * * * /opt/local/bin/alerty -c /Users/moguno/alerty/watch_mincraft_server.yml -- /sbin/ping -t 5 -c 3 araaraufufu.pw

後はmikutterで"TCP:39390"をデータソースとする抽出タブを作れば完成です。

これで1分周期でみくったーちゃんがサーバのダウンを通知してくれるようになります。

f:id:moguno:20150907191716p:plain

まとめ

UNIXな世界と連携して、mikutterにサーバの死活監視機能を持たせることができました。

屈強なUNIXコマンド達がガチではじき出した結果をゆるふわ可愛いみくったーちゃんが通知してくれるという、大変バランスの良い仕組みになりました。

alertyでオレオレ監視スクリプトを書かなくても良くなるのもいい感じです。
今後「もうちょっと真面目な通知システムで監視したいなぁ」ってなったときも、レシピファイルを書き換えるだけでOKですね。

お手軽で柔軟な良いシステムができました。

Minecraftを100倍楽しむ徹底攻略ガイド

Minecraftを100倍楽しむ徹底攻略ガイド

TLに背景画像を付けるmikutterプラグインを作ったよ。

何これ?

TLに背景画像を付けちゃいます。

f:id:moguno:20150906233057p:plain

インストール

GitHubからzipファイルをダウンロードして適当なディレクトリに展開して下さい。

moguno/mikutter-background_image · GitHub

※mikutterプラグインマネージャ"Packaged"で"moguno"を検索してインストールするのもおすすめです。

使い方

設定画面で画像ファイルと透明度を指定してください。

設定

背景画像

f:id:moguno:20150906232907p:plain

  • 画像ファイル

jpgかpngファイルを指定してください。

  • 濃さ(%)

背景画像の濃さを指定します。
100%で元画像。0%で透明です。

Windows10タブレットにMSYS2を入れてsshデーモンを立ち上げてみた

これまでのあらすじ

Windows10タブレットDELL Venue 8 Pro)に、Linuxっぽい環境を構築するMSYS2と、現時点で最強と思われるBluetoothキーボードのMicrosoft Wedge Mobile Keyboardを組み合わせて、外出先でも快適にRubyのコードが書ける環境を手に入れました。

しかしながら自宅に帰ればメイン環境のMacBookAirがある訳で、残作業をわざわざタブレットでするのもめんどい訳です。

なので、タブレットsshデーモンを動かしてMBAからリモートアクセスできる様にしました。
Windowsサービスなのでログインしてなくても電源を入れてればOKです。

sshデーモンの設定

まずはsshデーモンを設定していきましょう。
MSYS2 Shellを起動してください。

opensshのインストール

pacman -s openssh

鍵ペアの生成

他のディストリと違って、sshデーモン用の鍵は自動生成されないので作ります。

ssh-keygen -A

ユーザ作成

sshデーモンは一般的に管理者権限で起動します。

しかし、この状態で万一攻撃を受けた場合、システムへの被害が甚大になるので、sshデーモンは幾つかの処理を一般ユーザの権限で実行します。そのためUsersグループの一般ユーザのアカウントが必要になります。

ユーザアカウントの操作にはWindowsコマンドプロンプトを使います。

コマンドプロンプトを「管理者として実行」で起動してください。

今回はsshdと言うアカウントを作成します。

net user sshd /add /active:no

Windowsファイアウォールのルール作成

MSYS2 Shellで試しにsshデーモンを起動してみましょう。

/usr/bin/sshd

Windowsファイアウォールがサーバ待ち受けを許可するか聞いてくるので許可します。

他の端末からWindowsにログインする時のユーザ名とパスワードでログインできれば成功です。

ssh越しにみるとLinuxライクな何かにしか見えないですね。良い。

Windowsサービス化

次に、Windowsにログインしなくてもsshできるようにサービス化します。

サービス化には、同じくWindowsLinuxっぽいことをするcygwinの成果物を使用します。

  1. cygrunsrv:LinuxっぽいコマンドをWindowsサービス化する。
  2. editrights:ユーザアカウントに特殊な権限を付与する。

どちらのコマンドもpacmanからインストール可能なのですが・・・

pacman -S cygrunsrv editrights

何故かeditrightsはMSYS2 64bit版にしかありません。
今回のターゲットは32bitなWindows10タブレットなので、ソースからコンパイルします。

editrightsのコンパイル

pacman -S make gcc tar

curl -O http://ftp.jaist.ac.jp/pub/cygwin/x86/release/editrights/editrights-1.03-1-src.tar.xz

tar xvf editrights-1.03-1-src.tar.xz
tar xvf editrights-1.03-1.src/editrights-1.03.tar.bz2

cd editrights/
sed -i -e "s/stricmp/strcasecmp/g" main.c

make
make install

アカウントの追加

sshデーモンをWindowsサービス化するには特殊な権限を持つAdministratorsのアカウントが必要です。
sshdは内部でsetreuid()を呼びますが、Windowsサービスのユーザ("LocalService"とか)にはこれを呼ぶ権限がないためです。

こちらも、コマンドプロンプトを「管理者として実行」で作業します。
追加するユーザはcygrunsrvとします(パスワードもcygrunsrv)。

net user cygrunsrv cygrunsrv /add
net localgroup Administrators cygrunsrv /add

editrights -u cygrunsrv -a SeAssignPrimaryTokenPrivilege
editrights -u cygrunsrv -a SeCreateTokenPrivilege
editrights -u cygrunsrv -a SeTcbPrivilege
editrights -u cygrunsrv -a SeServiceLogonRight

sshデーモンをサービスとして登録する

サービス登録に管理者権限が必要なので、MSYS2 Shellを「管理者として実行」して作業します。

cygrunsrv --install sshd -u cygrunsrv -w cygrunsrv -p /usr/bin/sshd -a -D

cygeunsrv --start sshd

動作確認

一旦Windowsタブレットを再起動して、ログイン画面の状態で他の端末からssh接続してみます。
bashのプロンプトが出れば完成です。