D-STAR Gateway の機能停止を監視する
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 を発見したら自動的に
xchange と
multi_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__": 以下のメインの処理から呼び出して処理します。
- このままスクリプトをコピーして、Raspbery Pi OS の場合も AlmaLinux の場合も /usr/local/bin/watch_xchange.py に貼り付け、保存します。
このスクリプトは単独では起動しませんので、起ち上げ可能モードに設定する必要は有りません。
- どのポートを監視するのか決めて、port = 'ポート番号' の所を訂正します。
規定値は RpiGW が multi_forward : 20202、AlmaLinux : 8081 となっていますが、ケースバイケースで 20201 や 8080 の xchange を監視する場合も有ります。
現在テスト中ですが、xchange と multi_forward 両方を監視する必要が有ると判断した場合は、コードを追加しようと思っています。
- ポートの確認が済んだら、コマンドとして動かしてみて動作確認します。
$ python /usr/local/bin/watch_xchange.py
ポート: 20202 を監視しています。
実際に xchange をストップして multi_forward 側に [Not Running] を表示させ、自動復帰するか見ます。
異常が無ければ自動起動に設定します。
- 先ず、watch_xchange.service と言う名でユニットファイルを作成します。
$ 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
- service を自動起動に設定します。
$ sudo systemctl enable watch_xchange.service
$ sudo reboot
- 再起動後、確実に起動しているか確認します。
$ 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
この 作品 は
クリエイティブ・コモンズ 表示 - 非営利 - 改変禁止 4.0 国際 ライセンス
の下に提供されています。
English
Powered by