2015年9月22日火曜日

Chinachu のコマンドフックで jq を使って予約変更メールを飛ばしたりする

まず、現時点ではChinachuのdevel-betaが必要なので、そのセットアップをする。


$ git clone https://github.com/kanreisa/Chinachu.git chinachu-test
$ cd chinachu-test

まずはこんな感じでclone。

$ git checkout devel-beta

で、devel-betaブランチに切り替え。元々使っているディレクトリを使いまわしても良いけど、何かあると怖いので、念のため-testにして、再取得しているわけで。

$ ./chinachu installer

Node.jsが4.0.0に上がっていたりするので、使いまわしたときはupdaterで必要ソフトの更新をすること。

必要なものとして、andreyvit/json-diffjq-1.5 と heirloom-mailx を入れよう。json-diff は npm install json-diff するだけ・・・のはずなんだけど、libディレクトリが無くなって上手く動かないので、Issue 投げてある。なんとかするには http://registry.npmjs.org/json-diff/-/json-diff-0.3.1.tgz を拾ってきて中の lib ディレクトリを node_modules/json-diff 以下に置けばなんとかなる。
jqの方はビルドするのもめんどいので、Download jq 1.5 ボタンから linux用の64bitなり32bitなりのバイナリを拾って来よう。heirloom-mailx は apt-get install でOK。heirloom-mailxの設定方法はこちらを参考に。

やっと本題に入れる。これで、PR #214 が入った Chinachu と必要なソフトが準備できたので、予約前/後フックが使える準備が整ったわけだ。(そのうちmasterに入ればこんな手順をふまなくても./chinachu updaterだけで良くなるんだけど)

  • conflictCommand
  • schedulerStartCommand
  • schedulerEndCommand
  • epgStartCommand
  • epgEndCommand
が、config.jsonのキーに追加されている。recordedCommandと同じように、実行可能なスクリプトファイルパスを指定すれば良い。今回はこのうちschedulerStartCommandにreserve_start.shを、schedulerEndCommandにreserve_end.shを設定する。

スクリプトは /home/chnachu/chinachu-scripts/ にまとめておくことにした。ログファイルとかもとりあえずここに放り込む感じで。

まずは reserve_start.sh から。ログ吐いたりしてるけど、やってることは reserves.json をちょっとだけ加工して、id: 予約内容というオブジェクト形式にしている。元々の配列形式だと順番が変わったりすると上手く diff が取れないのでその対策というわけだ。

#!/bin/bash

PID=$1
RULES_FILE=$2
RESERVES_FILE=$3
SCHEDULE_DATA_FILE=$4

LOGDIR=$(dirname $0)/logs
LOG=${LOGDIR}/reserve_start.log
JQ=$(dirname $0)/jq-linux64


RESERVES_BAK=${LOGDIR}/${PID}_old_$(basename $RESERVES_FILE)

date >> $LOG
echo "RULE:$RULES_FILE RESERVES:$RESERVES_FILE SCHEDULE:$SCHEDULE_DATA_FILE" >> $LOG

$JQ 'map({key: .id, value: .}) | from_entries' ${RESERVES_FILE} > ${RESERVES_BAK}

続いて reserve_end.sh で、こっちは start と同じように json の加工をまずやって、加工したもの同士で diff を取る。で、added と deleted を抜き出して、必要に応じてメールする、という処理をしている。TO=はもちろん、通知したいメールアドレスに書き換えること。

diff から抜き出すときに色々加工しているところにあれこれ工夫が入っているので、気になる人は jq のマニュアルを見ながら調べて欲しい。

#!/bin/bash

PID=$1
RULES_FILE=$2
RESERVES_FILE=$3
SCHEDULE_DATA_FILE=$4
MATCHES=$5
DUPLICATES=$6
CONFLICTS=$7
SKIPS=$8
RESERVES=$9

LOGDIR=$(dirname $0)/logs
LOG=${LOGDIR}/reserve_end.log
DATE=$(date +"%Y%m%d-%H%M%S")

RESERVES_MOD=${LOGDIR}/${PID}_new_$(basename $RESERVES_FILE)
RESERVES_BAK=${LOGDIR}/${PID}_old_$(basename $RESERVES_FILE)

DIFF=${LOGDIR}/${DATE}_${PID}_diff.json
ADD=${LOGDIR}/${DATE}_${PID}_added.txt
DEL=${LOGDIR}/${DATE}_${PID}_deleted.txt
MAIL=${LOGDIR}/${DATE}_${PID}_mail.txt

TO=hogehoge@gmail.com

#DEL_TMP=true
DEL_TMP=false

JSONDIFF=$(dirname $0)/node_modules/.bin/json-diff
JQ=$(dirname $0)/jq-linux64

date >> $LOG
echo "PID:$PID RULE:$RULES_FILE RESERVE:$RESERVES_FILE SCHEDULE:$SCHEDULE_DATA_FILE" >> $LOG
echo "MATCHES:$MATCHES DUP:$DUPLICATES CONFLICTS:$CONFLICTS SKIP:$SKIPS RESERVE:$RESERVES" >> $LOG
echo "***********************************************************************" >> $LOG

$JQ 'map({key: .id, value: .}) | from_entries' $RESERVES_FILE > $RESERVES_MOD

$JSONDIFF -j ${RESERVES_BAK} ${RESERVES_MOD} > ${DIFF}

$JQ -r 'to_entries | map(select(.key | endswith("_added")) | .value) | .[] | ("ID: " + .id, .channel.name, .title + " #" + (.episode|tostring) + " 「" + .subTitle + "」", .detail, (.start/1000+9*3600|todate) + "~" + (.["end"]/1000+9*3600|todate), "********************************************")'  ${DIFF} > ${ADD}

$JQ -r 'to_entries | map(select(.key | endswith("_deleted")) | select(.value.start/1000.0 > now) | .value) | .[] | ("ID: " + .id, .channel.name, .title + " #" + (.episode|tostring) + " 「" + .subTitle + "」", .detail, (.start/1000+9*3600|todate) + "~" + (.["end"]/1000+9*3600|todate), "********************************************")' ${DIFF} > ${DEL}


if [ -s $ADD -o -s $DEL ] ; then
    echo "*********Make mail**********" >> $LOG
    date > $MAIL
    if [ -s $ADD ] ; then
        echo "******以下の予約が追加されました******" >> $MAIL
        cat $ADD >> $MAIL
    fi
    if [ -s $DEL ] ; then
        echo "******以下の予約が削除されました******" >> $MAIL
        cat $DEL >> $MAIL
    fi
    heirloom-mailx -s "Chianchu スケジューラ" "$TO" < $MAIL
fi

if [ "{$DEL_TMP}" == "{true}" ] ; then
    rm -f $DIFF $ADD $DEL $MAIL
fi

スクリプトは gist にも上げておいたので見にくいって人はそっちを見てくださいな。

0 件のコメント:

コメントを投稿