2015年5月17日日曜日

tracの通知をslackへ飛ばそう

tracのチケット通知はメールアドレスを指定できるだけです。
しかしメールはちょっと不便ですよね。まず気がつきません!

リアルタイムに把握したい場合は、流行のslackが便利です。
slackについての説明や設定ははしょって、通知を飛ばす方法を紹介します。

Tracの通知メールはCCでいくつでも設定できるので、slack用メアドへ通知を送り、それをプログラムへ転送してslackへメール内容を送るという方法になります。

pythonの古い仕様のソースはgithubに上がってますが、そのままでは使えないしPHPが好きだしということで、PHPでの方法です。


メール転送は、ユーザディレクトリに「.forward」ファイルを設置し、この中に転送先を書きます。
とりあえず、「slack」というlinuxユーザを作って説明していきます。

ホームディレクトリありでslackユーザを作成すると
/home/slack ディレクトリが作られます。

/home/slack/.forward ファイルを作って
中身は


"|php slack.php"




とでもしておきましょう。
「|」がコマンド実行するよーという合図で
「php」がコマンド
「slack.php」が、コマンドに渡すパラメータで、まぁ、これを実行するわけですね。

ここから先はサーバ設定によってまったく異なりますのでご注意。


.forward で指定できる内容は、セキュリティー設定によりかなり制限されます。
・指定されたディレクトリに存在するコマンドしか使えない。
・コマンドのパス部分は無視され、ファイル名部分だけ認識。
・絶対パスは使えない。
|php /home/slack/slack.php と書いたら駄目です。 必ず相対パス。

以上3点がはまりやすいかもしれません。

phpコマンドを使えるように、設置
/etc/smrsh/ にあるコマンドのみ使えるので

# ln -s /usr/bin/php /etc/smrsh/
シンボリックリンクを置きます。

これで php コマンドが使えます。

次に、slackへメール転送するphpである slack.php。

<?php
require_once 'mimeDecode.php';

$WebHookURL = 'https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxxxxxx';
$param = array(
 'channel'  => '#channel',
 'username' => 'username',
 'icon_emoji' => ':vertical_traffic_light:',
 'text'     => '',
 'color'    => '#cccccc',
);

$decoder = new Mail_mimeDecode(file_get_contents("php://stdin"));
$params = array("include_bodies"=>true);
$structure = $decoder->decode($params);
$param['text'] = $structure->body;
postRequest($WebHookURL, $param);

function postRequest($url, $param)
{
 $content = json_encode($param);
 $headers = array(
  "Content-Type: application/json",
  "Accept: application/json",
  "Content-Length: ".strlen($content),
 );

 $options = array('http' => array(
  'method' => 'POST',
  'content' => $content,
  'header' => implode("\r\n", $headers),
 ));
 $contents = file_get_contents($url, false, stream_context_create($options));
 return $contents;
}

こんな感じで適当につくりましょう。
mimeDecode.phpはpearのです。slack.phpと一緒に置いてください。


動かない時は、.forwardのセキュリティーが非常に宜しいです。

.forwardのオーナーをslackにし、パーミッションを600にしてみましょう。
これで動かないサーバは無いと思います。



最後のphpの中身を少し解説

Mail_mimeDecode:pearライブラリで、メール内容をヘッダ、タイトル、本文、添付ファイルと分けてくれる便利な物です。
メールを読み込んでいる部分は file_get_contents("php://stdin")
file_get_contentsは外部と通信するための万能ツールです。slackへの送信もこれで。