物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

複数のサーバーを、PythonとHTMLで監視する

pingを飛ばすのに pings というパッケージを使った pip install pings でインストール可能。次の例では36台のPCを監視している。

import datetime
import matplotlib.pyplot as plt
import pings

hosts = []
for i in range(1, 37):
    hosts.append("192.168.0.{}".format(i))

p = pings.Ping(timeout=1000)
xs = [0, 1, 1, 0, 0]
ys = [0, 0, 1, 1, 0]
for i, h in enumerate(hosts):
    plt.subplot(6, 6, i+1)
    if i == 0:
        plt.text(0, 1.2, "HTS-1 Alive Monitoring (ping)", size=15)
    if i == len(hosts)-1:
        plt.text(
            0, -0.5, datetime.datetime.now().strftime('%Y/%m/%d\n%H:%M:%S'), size=10)
    plt.text(0, 0, str(i+1), size=20)
    plt.axis("off")
    res = p.ping(h)
    if not res.is_reached():
        plt.fill(xs, ys, color="tab:red")
        plt.axis([0.0, 1.0, 0.0, 1.0])
        print("Not connected", h)
    else:
        plt.fill(xs, ys, color="tab:green")
        plt.axis([0.0, 1.0, 0.0, 1.0])
        print("Connected", h)
plt.savefig("AliveHTS1.png")

生成した画像は、ブラウザ上で見たい。例えば上記のプログラムを1分ごとに自動実行するようにしておけば、それ以上の頻度で画像を読み込めば最新の状況が見れる。

画像の再読み込み(自動リロード)は、一般的な方法である末尾に?と乱数を付けることで実装した。コード例は10秒ごと。実装は下記のURLを参考にした。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Draft//EN">
<html>
<head>
    <title>HTS-1 Alive Monitoring</title>
    <script>
        function reloadimg() {
            AliveHTS1.src = "./AliveHTS1.png?r=" + Math.random();
        }
        function setreload(timer) {
            setTimeout('reloadimg()', timer);
        }
    </script>
</head>
<body>
    <img name="AliveHTS1" src="./AliveHTS1.png" onload="setreload(10000)" />
</body>
</html>

こんな感じで表示される

f:id:onsanai:20210604133925p:plain

参照 iww.hateblo.jp