Day After Day
tsurezure naru mamani...
ANOTHER DECADE

from 2022 when it's begining after/with CORONA Virus.

D-STAR Gateway の機能停止を監視する

12月
25
2024
Back
Alt+HOME


今年の初めに同様の Rpi-GW 向けのツールを公開しましたが、絶対数の多い Redhat系 Gateway にも対応するように変更をと考えていたところ、当方にも AlmaLinux のテスト機が入手できたことと、ある管理団体の方から導入の依頼があったため、動作確認が取れましたので公開することとしました。

Raspberry Pi OS / AlmaLinux 共用です。(ポート変更は必要)



よくある現象は、何かの原因で xchange への multi_forward の接続が外れる事が有り、その場合双方のアプリをリスタートする必要が有ると言うものです。 これは結構運用上面倒なので、自動化してみました。

挙動としては、図のように xchange WEB における multi_forward のステータスが [OK] ならば問題ないのですが、上のケースでは [Not Running] になります。 (註: ZR Status が Not Running になっているのは、当方のゲートウェイはリピータが接続されていないテストサイトだからです。)

監視の目的は、この Not Running を発見したら自動的に xchangemulti_forward をリスタートすることです。

早速ですが Python 3 で書いたスクリプトです。


    import subprocess
    import requests
    import time
    
    # WEBサーバーにアクセスしてhtmlコードを取得する
    def fetch_html_from_server(port):
    
        # 監視するURLを構成する
        url = 'http://127.0.0.1' + ':' + port
    
        try:
            # requestsを送信して200(リクエスト成功)が返ったらその内容を取得
            response = requests.get(url)
            if response.status_code == 200:
                html_content = response.text
                return html_content
    
            # もしエラーが返ったらその内容を表示(コンソールで起動している時のみ)
            else:
                print(f"サーバーからのレスポンスコードがエラーです: {response.status_code}")
                return None
        except:
            print("Get nothing..")
            return None
    
    # 取得したhtmlコード内にターゲットの文字が有るかチェックする
    def check_status(fetched_html, target_string):
    
        # もし文字列が存在したらrpi-xchangeをリスタート
        if target_string in fetched_html:
    
            if (os_id == "debian"):
                msg_mlt = "rpi-multi_forward をリスタートします。"
                msg_xch = "rpi-xchange をリスタートします。"
                cmd_mlt = 'sudo systemctl restart rpi-multi_forward.service'
                cmd_xch = 'sudo systemctl restart rpi-xchange.service'
            else:
                msg_mlt = "multi_forward をリスタートします。"
                msg_xch = "xchange をリスタートします。"
                cmd_mlt = 'sudo systemctl restart multi_forward.service'
                cmd_xch = 'sudo systemctl restart xchange.service'
    
            print(msg_mlt)
            subprocess.run(cmd_mlt, shell=True)
            time.sleep(5)
    
            print(msg_xch)
            subprocess.run(cmd_xch, shell=True)
    
    # OSの種類を取得
    def get_os_id():
    
        # OS変数の初期化
        os_id = None
    
        # OSの種類を取得してos_idに代入する
        try:
            with open('/etc/os-release', 'r') as file:
                for line in file:
                    if line.startswith('ID='):
                        os_id = line.strip().split('=')[1].strip('"')
                        break
        # OS種類が取得できない時
        except FileNotFoundError:
            os_id = "Unknown"
    
        return os_id
    
    if __name__ == "__main__":
    
        # OSを取得
        os_id = get_os_id()
    
        # OS特有のポートを代入(独自のポートを設定した時は変更する)
        if (os_id == "debian"):
            port = '20202'                   # 監視するポート番号
        else:
            port = '8081'                    # ポートはブログどおりに設定した場合Alma:8081
    
        # WEB表示を監視したい文字列
        target_string = "Not Running"
        count = 0
    
        # 監視開始(シャットダウン・リブート又は[Ctrl] + [c]でのみ終了
        print("ポート:", port, "を監視しています。")
    
        while True:
    
            # 取得したhtmlを変数に代入
            fetched_html = fetch_html_from_server(port)
    
            # 変数が空で無ければ
            if fetched_html:
    
                # 内容を検査
                check_status(fetched_html, target_string)
    
            # リクエスト送信の間隔を設定する。(10sec)
            time.sleep(10)
    	

    概要を書くと、上3つの def は特定の処理をする関数で、if __name__ == "__main__": 以下のメインの処理から呼び出して処理します。

  1. このままスクリプトをコピーして、Raspbery Pi OS の場合も AlmaLinux の場合も /usr/local/bin/watch_xchange.py に貼り付け、保存します。 このスクリプトは単独では起動しませんので、起ち上げ可能モードに設定する必要は有りません。

  2. どのポートを監視するのか決めて、port = 'ポート番号' の所を訂正します。

  3. 規定値は RpiGW が multi_forward : 20202、AlmaLinux : 8081 となっていますが、ケースバイケースで 20201 や 8080 の xchange を監視する場合も有ります。 現在テスト中ですが、xchange と multi_forward 両方を監視する必要が有ると判断した場合は、コードを追加しようと思っています。

  4. ポートの確認が済んだら、コマンドとして動かしてみて動作確認します。

  5. $ python /usr/local/bin/watch_xchange.py
    ポート: 20202 を監視しています。
    実際に xchange をストップして multi_forward 側に [Not Running] を表示させ、自動復帰するか見ます。

異常が無ければ自動起動に設定します。


  1. 先ず、watch_xchange.service と言う名でユニットファイルを作成します。

  2. $ sudo nano /etc/systemd/system/watch_xchange.service
      GNU nano 5.6.1                          /etc/systemd/system/watch_xchange.service
    [Unit]
    Description=xchange restart daemon for Status NG
    After = xchange.service
    
    [Service]
    ExecStart=python /usr/local/bin/watch_xchange.py
    Restart=always
    Type=simple
    
    [Install]
    WantedBy=multi-user.target

  3. service を自動起動に設定します。

  4. $ sudo systemctl enable watch_xchange.service
    $ sudo reboot

  5. 再起動後、確実に起動しているか確認します。

  6. $ sudo systemctl status watch_xchange.service
     watch_xchange.service - xchange restart daemon for Status NG
         Loaded: loaded (/etc/systemd/system/watch_xchange.service; enabled; preset: enabled)
         Active: active (running) since Sun 2024-12-29 05:14:32 JST; 2s ago
       Main PID: 5367 (python)
          Tasks: 1 (limit: 762)
            CPU: 844ms
         CGroup: /system.slice/watch_xchange.service
                 └─5367 python /usr/local/bin/watch_xchange.py
    
    Dec 29 05:14:32 gateway systemd[1]: Started watch_xchange.service - xchange restart daemon for Status NG.


Back
Alt+HOME