kooshinlab / コーシンラボ

現役ネットワークエンジニアが、ネットワーク運用で必要になった技術の記事を書くブログです。

コマンドの実行結果によってネットワーク監視灯(パトライト)を点滅させてみた

コマンドを実行した際の終了状態によって、ネットワーク監視灯(通称:パトライト)に操作して、視覚的に通知してみました。 例として、LinuxUbuntu)のfpingをインストールして、Ping OKなら緑点滅、Ping NGなら赤点滅する動画です。

はじめに

コマンドの実行に時間がかかった場合(例えば、rbenvによるRubyのインストールや、ネットワークが遅くてdocker pullが異常に時間がかかる場合など)、終わるまでTwitterなどで時間をつぶすことがあると思います。しかしながら、コマンドの終了に気が付かなく、Twitterで時間を溶かしてしまうことが私は多々あります。 このため、コマンドの実行終了をパトライト経由で通知してみました。

ネットワーク監視表示灯(以下、パトライト)にコマンドの実行が終了した場合に、緑点滅や赤点滅で気づけるように、ラッパーする感じのシェルスクリプトを作成してみました。

何かしらのコマンドを実行して、終了状態(exit status/return code)が、正常であればパトライトを緑点滅、異常であればパトライトを赤点滅させてみます。

パトライトをシェルから操作する方法は、下記を参照してください、

kooshin.hateblo.jp

動作環境

動作環境は下記のとおりです。 今回はLinux上で動作させています。

仕組み

自作したシェルスクリプトpatliteスクリプトの引数に、コマンドを指定すると、コマンドの終了状態に応じてパトライトを操作します。 コマンドの終了状態によって、パトライトを緑点滅や赤点滅させます。

f:id:KOOSHIN:20200211210434p:plain
仕組み

実行の流れ

大まかに下記のような流れでpatliteスクリプトは動作しています。

  1. patliteスクリプトの引数に、終了を通知したいコマンドを指定
  2. patliteスクリプトを実行
  3. 開始時にパトライトを緑点灯。それ以外は消灯
  4. 引数のコマンドを実行
  5. コマンドの終了状態(exit status/return code)をもとに判断
  6. 終了状態が0ならパトライトを緑点滅。0以外ならパトライトを赤点滅
  7. 割込シグナルで途中終了した場合、パトライトを赤点滅
  8. 終了

patliteスクリプト

シェルスクリプトpatliteスクリプトのコードは下記のとおりです。

変数として定義した、パトライトIPアドレスIPADDTCPポート番号PORTを変更することで、他の環境でも使えると思います。

終了状態 パトライトの操作
正常終了(0) 緑点滅(点滅パターン1)
異常終了(0以外) 赤点滅(点滅パターン2)
割込終了(シグナル割込) 赤点滅(点滅パターン1)
#!/bin/sh

# パトライトのIPアドレスとTCPポート番号
IPADDR="192.168.11.101"
PORT="10000"

# 緑の表示灯のみ点灯
/bin/echo -ne '\x58\x58\x53\x00\x00\x06\x00\x00\x01\x00\x00\x00' | /bin/nc -q0 $IPADDR $PORT

# 途中終了の場合、異常と判断し、赤の表示灯を点滅(点滅パターン1)
trap "/bin/echo -ne '\x58\x58\x53\x00\x00\x06\x02\x00\x00\x00\x00\x00' | /bin/nc -q0 $IPADDR $PORT; exit 1" 1 2 3 15

# 引数をコマンドとして実行
$*
RETURN_CODE=$?

case "$RETURN_CODE" in
    # return codeが0の場合は、正常と判断し、緑の表示灯を点滅(点滅パターン1)
    0 ) /bin/echo -ne '\x58\x58\x53\x00\x00\x06\x00\x00\x02\x00\x00\x00' | /bin/nc -q0 $IPADDR $PORT ;;

    # return codeが0以外の場合は、異常と判断し、赤の表示灯を点滅(点滅パターン2)
    * ) /bin/echo -ne '\x58\x58\x53\x00\x00\x06\x03\x00\x00\x00\x00\x00' | /bin/nc -q0 $IPADDR $PORT ;;
esac

exit $RETURN_CODE

実行例

サンプルとして、fpingをインストールして、pingしてみました。 patiliteスクリプトの引数に、各コマンドを指定しています。

# patliteスクリプトに実行権付与
$ chmod +x patlite

# fpingをインストール(ちょっと時間がかかる)
$ ./patlite sudo apt install fping

# Ping OKな例
$ ./patlite fping 192.168.10.1 -c 1

# Ping NGな例
$ ./patlite fping 192.168.10.2 -c 1

実行結果(ターミナル画面)

実行結果は、patliteスクリプトに実行コマンドを指定する以外、 特に変化はありません。

f:id:KOOSHIN:20200211211556p:plain
実行結果

実行結果(パトライト

パトライトとターミナル画面を撮影した動画です(Twitterを参照)。

おわりに

簡単な仕組みでパトライトを操作できるため、様々なことに応用できると思います。

きっと、ご自宅に必須のアイテムになること間違いなしです。 この機会に皆さんご自宅用に買いましょう。