🛜

社内ネットワークの死活監視機構をRaspberry Pi 4で作った話_有線編

に公開

おいすおいすあざすおいす
社内ネットワークの管理相変わらずしてますケンシロウです!

https://qiita.com/advent-calendar/2025/genda

この間の社内ネットワークの死活監視機構をRaspberry Pi 4で作った話_無線編に続き、有線編になります!
https://zenn.dev/genda_jp/articles/8ce9c2864ab055

これで全部ちゃんと監視できてるかはNGですが、まぁ作ったので見てくださいw
見てくれないと病んじゃうかも🔪❤️

1.用意するもの

2.有線監視ロジック

正常です!画面も出せるのですが、弊社のFE/BE部長が作ったサイトがあるので正常な時はそれつけることにしました。
異常な時に別の画面を上から出すようになってます。

3.設定方法

事前準備

sudo apt update
sudo apt install -y chromium rpi-chromium-mods
sudo apt install python3-tk(入ってなかったら)

正常な画面と異常画面を出すpythonファイル

import tkinter as tk
import subprocess

# --- 設定 ---
TARGET_IP = "8.8.8.8"      # 監視先
INTERFACE = "eth0"         # 有線LAN
PING_INTERVAL = 5000       # Pingチェック間隔 (5秒)
BLINK_INTERVAL = 500       # 点滅の速さ (0.5秒)

# --- グローバル変数 ---
is_network_ok = True       # ネットワーク状態
blink_state = False        # 点滅用フラグ

def check_ping():
    """Pingを実行して結果を保存"""
    global is_network_ok
    try:
        command = ["/bin/ping", "-I", INTERFACE, "-c", "1", "-W", "1", TARGET_IP]
        subprocess.check_output(command, stderr=subprocess.STDOUT)
        is_network_ok = True
    except Exception:
        is_network_ok = False
    
    root.after(PING_INTERVAL, check_ping)

def update_gui_blink():
    """異常時だけ画面を出して点滅させる"""
    global blink_state
    
    if is_network_ok:
        # --- 正常時:ウィンドウを隠す(裏のブラウザが見える) ---
        root.withdraw()
    else:
        # --- 異常時:ウィンドウを表示して最前面へ ---
        root.deiconify()
        root.attributes('-topmost', True) # 念のため最前面指定
        
        # 点滅処理
        blink_state = not blink_state
        if blink_state:
            bg_color = "red"
            fg_color = "white"
        else:
            bg_color = "black"
            fg_color = "red"
            
        status_text.set("インターネット\n壊れた!!!!!\n僕の連絡先:00000000000\nまたはSlackへ!")
        root.configure(bg=bg_color)
        label.configure(bg=bg_color, fg=fg_color)
    
    root.after(BLINK_INTERVAL, update_gui_blink)

# --- GUIのセットアップ ---
root = tk.Tk()
root.title("LAN Monitor")

# フルスクリーン設定
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry(f"{width}x{height}+0+0")
root.attributes('-fullscreen', True)

# 文字設定
status_text = tk.StringVar()
label = tk.Label(root, textvariable=status_text, font=("Helvetica", 60, "bold"), wraplength=width)
label.pack(expand=True, fill='both')

# 終了キー
root.bind("<Escape>", lambda e: root.destroy())

# 実行開始
check_ping()
update_gui_blink()

root.mainloop()

~/.config/autostart/配下に画面を消さない処理ファイルを作る

[Desktop Entry]
Type=Application
Name=NoBlank
# xsetを使ってスリープと画面オフを強制停止するコマンド
Exec=xset s off s noblank -dpms
StartupNotify=false
Terminal=false

~/.config/autostart/配下に再起動しても勝手に動く処理ファイルを作る

[Desktop Entry]
Type=Application
Name=LAN Monitor
# 10秒待ってから実行する設定
Exec=sh -c "sleep 10; export DISPLAY=:0; /usr/bin/python3 ~/hogehoge/hoge_gui.py"
StartupNotify=false
Terminal=false

~/.config/autostart/配下に特定のURLが自動で開く処理ファイルを作る

Exec=/usr/bin/chromium --user-data-dir=/home/kenshirotanaka/.config/chromium --kiosk --start-fullscreen --window-size=1920,1080 --noerrdialogs --disable-infobars --check-for-update-interval=31536000 https://tokeinopagehoge/

設定後は一度再起動しましょう

4.検証

実際はこんな感じ
有線止まれば無線APも含めて大体さよなら状態になるのでその場にいなかったら電話かSlackで連絡してねサインを刻んでいる感じです

正常時

ちなみに映っているこのサイト作った人ですw

障害発生時

点滅します

5.まとめ

無線と有線のNW監視の仕組みをお手軽に作ってみましたが、これ作った後に社内の人達がぞろぞろと見に来ましたw
みんなこういうのが好きなんでしょ!

ということで暫定でお手軽ですがまた何か思いついたら作ってみようと思います!

GENDA

Discussion