スパコンの残ポイント数とディスクの利用状況をSlackに定期通知させる

# スパコンの残ポイント数とディスクの利用状況をSlackに定期通知させる

## はじめに

スーパーコンピュータTSUBAME3.0の残ポイント数とディスクの利用状況はコマンドで概要は確認できるが，いちいち「ログインしてコマンド打ってコピーしてSlackに貼り付ける」という作業を毎回するのが面倒なので全て自動化することにした．本当はポータルにログインして利用状況の詳細を自動的にSlackに通知できるようにしたかったが，TSUBAMEホームページでユーザー名を入力してURLをメールで受け取って該当箇所までとんでコピーして......って作業が煩雑なので（だから自動化したいのだが），ひとまず簡単な情報として残ポイント数とディスクの利用状況だけでもしたかった．

まあぶっちゃけ参考リンクのシェルスクリプトをほぼそのまま使わせてもらいました．ここに書くのは9割どうやって組み合わせたかになる．

実行環境はWindows10のWSL1：

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.5 LTS
Release:        18.04
Codename:       bionic
```

また，大前提として公開鍵認証方式を利用しているので鍵そのものがない限りは不正アクセスの心配はないのだが，シェルスクリプト内に公開鍵にかけたパスワードを入力しておく必要があるので，TSUBAMEの利用規約にもあるように情報の取り扱いには最新の注意を払うこと．

>第9条　利用者は，計算機システムの利用に当たって，[国立大学法人東京工業大学情報倫理規則(平成17年規則第31号)](http://www.somuka.titech.ac.jp/reiki_int/reiki_honbun/x385RG00000462.html)，[国立大学法人東京工業大学情報セキュリティ規則(平成17年規則第32号)](http://www.somuka.titech.ac.jp/reiki_int/reiki_honbun/x385RG00000463.html)，国立大学法人東京工業大学情報セキュリティポリシー(平成17年4月8日決定)その他学内関係規定等を遵守しなければならない。
>
>[東京工業大学学術国際情報センター計算機システム利用細則](http://www.somuka.titech.ac.jp/reiki_int/reiki_honbun/x385RG00000476.html#joubun-toc-span)

>第11条　情報資産管理担当者は，大学の情報資産を不正アクセス等から保護するため，[次の各号](http://www.somuka.titech.ac.jp/reiki_int/reiki_honbun/x385RG00000463.html#e000000219)に掲げる必要な措置を講じなければならない。
>
>一　情報資産へのアクセス制御及びネットワーク管理等に対する適切な対策に必要な措置
>
>二　コンピュータウィルス等に対する適切な対策に必要な措置
>
>(対象範囲)
>
>第12条　この規則において情報資産の対象範囲は，[別表1](http://www.somuka.titech.ac.jp/reiki_int/reiki_honbun/x385RG00000463.html#e000000907)のとおりとする。
>
>[国立大学法人東京工業大学情報セキュリティ規則](http://www.somuka.titech.ac.jp/reiki_int/reiki_honbun/x385RG00000463.html#e000000219)

> 上記別表1　対象範囲の例(第12条関係)抜粋：システム設定情報(パスワードファイル等)
>
> [別表1](http://www.somuka.titech.ac.jp/reiki_int/reiki_honbun/x385RG00000463.html#e000000907)



## TSUBAME3.0とは

> TSUBAME3.0は東京工業大学学術国際情報センター(GSIC)が運用管理するスーパーコンピュータです。正式名称は「クラウド型ビッグデータグリーンスーパーコンピュータ」となります。TSUBAME3.0 は半精度以上で 47.2PFlops の理論演算性能を持ち，従来型 HPC に加えてビッグデータ・ AI など幅広いワークロードを処理する日本最大級のスパコンとなる見込みです。また、高密度化と省電 力化を追求し理論 PUE 値 1.033 を実現します。
>
> [TSUBAME3.0とは何ですか](https://www.t3.gsic.titech.ac.jp/node/11#:~:text=TSUBAME3.0%E3%81%AF%E6%9D%B1%E4%BA%AC%E5%B7%A5%E6%A5%AD,%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%A7%E3%81%99%E3%80%82&text=TSUBAME3.0%20%E3%81%AF%E5%8D%8A%E7%B2%BE%E5%BA%A6,%E3%82%B9%E3%83%91%E3%82%B3%E3%83%B3%E3%81%A8%E3%81%AA%E3%82%8B%E8%A6%8B%E8%BE%BC%E3%81%BF%E3%81%A7%E3%81%99%E3%80%82)

### 残ポイント数とディスクの利用状況確認コマンド

いくつかオプションはあるが，基本は`t3-user-info group point`で残ポイント数，`t3-user-info disk group`でディスクの利用量を確認できる．[TSUBAMEポイント、グループディスクの使用状況、ホームディレクトリの使用状況の確認方法](https://www.t3.gsic.titech.ac.jp/node/127)



## パート1：コマンドの結果をSlackに送る

[[10分で出来る]シェルスクリプトの結果をslackに投稿](https://qiita.com/tt2004d/items/50d79d1569c0ace118d6)のSlack設定とシェルスクリプトで解決する．注意事項だけ列挙しておくと，

- Slackの無料チームだと登録できるAppが10個に制限されているので，記事中のIncoming WebHooksを追加する際は登録数に注意する
- 記事中では#generalチャンネルでテストしているが，まずは自分ひとりの#test-webhookチャンネルでも作ったほうがSlackを荒らさずにすむ
- シェルスクリプトで編集する必要がある箇所は
  - `WEBHOOKURL="ここにIncoming Webhooks IntegrationのURLをいれてね"`にIncoming WebHooksで入手したURLをコピペ
  - 私の環境では`MESSAGEFILE=$(mktemp -t webhooks)`ではなく`MESSAGEFILE=$(mktemp -t webhooks.XXX)`とする必要があった（[MKTEMP](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/mktemp.1.html)コマンドの使い方として「最後に連続した 'X' を最低 3 個は含まなければいけません」とある）
  - `CHANNEL=${CHANNEL:-"#general"}`は例えば自分ひとりの#test-webhookに変更

- 文字コードはUTF-8，改行コードはLFで，ファイル名はひとまずwebhooks.shでローカルに保存
- ファイルに実行権限を与える必要があるので，`$ chmod 744 webhooks.sh`

以上に注意した上で

```sh
$ echo test1 | ./webhooks.sh
```

として，送信先のチャンネルに`test1`と表示されたら成功．



## パート2：自動でSSHログインした先でコマンドを実行させる

[expectやsshpassを使わずにシェルでSSHパスワード認証を自動化する](https://qiita.com/wadahiro/items/977e4f820b4451a2e5e0)のシェルスクリプトで解決する．以下は注意事項：

- `SSH_USER=test`の`test`はTSUBAMEのユーザー名に変更（ex. `"hpci000001"`，ダブルクォーテーションマークを忘れないこと）
- `SSH_PASS=mypass`の`mypass`はSSHログインで利用する鍵にかけたパスワード（`Enter passphrase for key `で入力するもの）
- `SSH_HOST=your_ssh_server`の`your_ssh_server`はTSUBAME3.0の場合，`"login.t3.gsic.titech.ac.jp"`
- 秘密鍵までのパスを指定したい場合は上記`SSH_HOST`に`"login.t3.gsic.titech.ac.jp -i パス"`
- `REMOTE_CMD="ls -al"`はひとまずそのまま

- 文字コードはUTF-8，改行コードはLFで，ファイル名はひとまずsshauto.shでローカルに保存
- ファイルに実行権限を与える必要があるので，`$ chmod 744 sshauto.sh`

以上に注意して，

```sh
$ ./sshauto.sh
```

としたら，TSUBAMEのホームディレクトリ（`cd ~`で移動できるディレクトリ）上で`ls -al`が実行されていたら成功．コマンドを実行したら自動的にログアウトされる．



## パート3：定期的に実行させる

[Windowsから定期的にSlackに投稿する](http://yamap55.hatenablog.com/entry/2017/12/08/235255)のタスクスケジューラで解決する．以下，注意事項：

- 名前はとりあえずwebhook
- トリガーはとりあえず何でもいい（テストするときは手動で実行する）
- 「プログラム/スクリプト」は`C:\Windows\System32\bash.exe`で固定
- 「引数の追加」は[パート2](#パート2：自動でSSHログインした先でコマンドを実行させる)で作成したsshauto.shの絶対パスを指定（例えばデスクトップ上に保存している場合は`/mnt/c/Users/ユーザー名/Desktop/sshauto.sh`．一応言っておくとここのユーザー名はTSUBAMEのユーザー名ではなくPC上のユーザー名である）

以上に注意してwebhookタスクを作成しておく（テストは後で）．



## パート1から3を組み合わせる

つまり，「タスクスケジューラでsshauto.shを実行して自動ログイン+ログイン先で`t3-user-info group point | ./webhooks.sh`とコマンドを実行させたら，`t3-user-info group point`で得られた残ポイント数情報がSlackに送られるというスンポー．

ということで，次のように変更する．

- sshauto.shの`REMOTE_CMD="ls -al"`は`"t3-user-info group point | ./webhooks.sh"`に変更
- webhooks.shをログイン時のホームディレクトリに保存（`chmod`を忘れずに）

また，このまま実行すると下のイメージのようにコードブロック用の``````` `````` ```````（バッククオート）が余計に出力されるので，webhooks.shの```` WEBMESSAGE='```'`cat ${MESSAGEFILE}`'```' ````は`` 
WEBMESSAGE=`cat ${MESSAGEFILE}` ``に変更しておく．

![image-20200906230654908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276577/28980f71-6b29-ae70-e8e8-be21bf016ee1.png)

以上で準備は整ったので，試しにタスクスケジューラでタスク名webhookを右クリックして実行してSlackの#test-webhookチャンネルに次のようなメッセージが追加されたら成功．

![image-20200906232737899.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276577/4cbfd04c-5a26-ac8f-718f-52ba2190e34b.png)

あとは，`t3-user-info disk group`でディスクの利用量も出力できるようになるし，タスクスケジューラでトリガーを好きに設定すれば，Slackへの定期通知が実現する．

## その他（総合ポイント数の通知）

総合ポイント数と，各四半期の割当てポイント数は事前に分かっているので，SlackのReminder機能をおとなしく使っている．

## 終わりに

ほとんど参考リンク先のシェルスクリプトをコピることで，概要だがスパコンの利用状況をSlackに定期通知させることができた．より詳細だが面倒な作業（ポータルにログインして......）を自動化するかは......まあいいや．

## 参考リンク

[TSUBAME3.0とは何ですか](https://www.t3.gsic.titech.ac.jp/node/11#:~:text=TSUBAME3.0%E3%81%AF%E6%9D%B1%E4%BA%AC%E5%B7%A5%E6%A5%AD,%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%A7%E3%81%99%E3%80%82&text=TSUBAME3.0%20%E3%81%AF%E5%8D%8A%E7%B2%BE%E5%BA%A6,%E3%82%B9%E3%83%91%E3%82%B3%E3%83%B3%E3%81%A8%E3%81%AA%E3%82%8B%E8%A6%8B%E8%BE%BC%E3%81%BF%E3%81%A7%E3%81%99%E3%80%82)

[TSUBAMEポイント、グループディスクの使用状況、ホームディレクトリの使用状況の確認方法](https://www.t3.gsic.titech.ac.jp/node/127)

[[10分で出来る]シェルスクリプトの結果をslackに投稿](https://qiita.com/tt2004d/items/50d79d1569c0ace118d6)

[MKTEMP](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/mktemp.1.html)

[expectやsshpassを使わずにシェルでSSHパスワード認証を自動化する](https://qiita.com/wadahiro/items/977e4f820b4451a2e5e0)

[Windowsから定期的にSlackに投稿する](http://yamap55.hatenablog.com/entry/2017/12/08/235255)

## シェルスクリプト一覧

```webhooks.sh
#!/bin/sh

# [[10分で出来る]シェルスクリプトの結果をslackに投稿](https://qiita.com/tt2004d/items/50d79d1569c0ace118d6)
# ほとんど上記記事のシェルスクリプトそのままになります

set -eu

#Incoming WebHooksのURL
WEBHOOKURL="ここにIncoming Webhooks IntegrationのURLをいれてね"
#メッセージを保存する一時ファイル
MESSAGEFILE=$(mktemp -t webhooks.XXX)
trap "
rm ${MESSAGEFILE}
" 0

usage_exit() {
    echo "Usage: $0 [-m message] [-c channel] [-i icon] [-n botname]" 1>&2
    exit 0
}

while getopts c:i:n:m: opts
do
    case $opts in
        c)
            CHANNEL=$OPTARG
            ;;
        i)
            FACEICON=$OPTARG
            ;;
        n)
            BOTNAME=$OPTARG
            ;;
        m)
            MESSAGE=$OPTARG"\n"
            ;;
        \?)
            usage_exit
            ;;
    esac
done
#slack 送信チャンネル
CHANNEL=${CHANNEL:-"#test-webhook"}
#slack 送信名
BOTNAME=${BOTNAME:-"mybot"}
#slack アイコン
FACEICON=${FACEICON:-":ghost:"}
#見出しとなるようなメッセージ
MESSAGE=${MESSAGE:-""}

if [ -p /dev/stdin ] ; then
    #改行コードをslack用に変換
    cat - | tr '\n' '\\' | sed 's/\\/\\n/g'  > ${MESSAGEFILE}
else
    echo "nothing stdin"
    exit 1
fi

WEBMESSAGE=`cat ${MESSAGEFILE}`

#Incoming WebHooks送信
curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}${WEBMESSAGE}\" }" ${WEBHOOKURL} >/dev/null
```

```sshauto.sh
#!/bin/bash

# [expectやsshpassを使わずにシェルでSSHパスワード認証を自動化する](https://qiita.com/wadahiro/items/977e4f820b4451a2e5e0)
# ほとんど上記記事のシェルスクリプトそのままになります

# 接続先情報
SSH_USER="test"
SSH_PASS="mypass"
SSH_HOST="your_ssh_server"
REMOTE_CMD="t3-user-info group point | ./webhooks.sh"


# 後述のSSH_ASKPASSで設定したプログラム(本ファイル自身)が返す内容
if [ -n "$PASSWORD" ]; then
  cat <<< "$PASSWORD"
  exit 0
fi

# SSH_ASKPASSで呼ばれるシェルにパスワードを渡すために変数を設定
export PASSWORD=$SSH_PASS

# SSH_ASKPASSに本ファイルを設定
export SSH_ASKPASS=$0
# ダミーを設定
export DISPLAY=dummy:0

# SSH接続 & リモートコマンド実行
exec setsid ssh $SSH_USER@$SSH_HOST $REMOTE_CMD
```