From 0da2378c5ddd866ca4c1486ecf630771cf6b81c0 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Fri, 28 Feb 2025 12:49:46 +0000 Subject: [PATCH] first commit --- monitor_network.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 monitor_network.py diff --git a/monitor_network.py b/monitor_network.py new file mode 100755 index 0000000..46ce1e9 --- /dev/null +++ b/monitor_network.py @@ -0,0 +1,91 @@ +import subprocess +import time +import platform +import requests +from datetime import datetime +try: + from zoneinfo import ZoneInfo +except ImportError: + from backports.zoneinfo import ZoneInfo # type: ignore + +class ServerMonitor: + def __init__(self): + # Server settings + self.SERVER_IP = "ntc381.tplinkdns.com" + self.GOOGLE_DNS = "8.8.8.8" + self.INTERVAL = 10 + self.MAX_RETRIES = 5 + # LINE Notify settings + self.LINE_NOTIFY_TOKEN = "Yv0j6udRR1YzxfCybUWkfZ2a6KxAELZAyhtpEepwhrI" + self.LINE_NOTIFY_API = "https://notify-api.line.me/api/notify" + + def notify(self, message): + headers = {"Authorization": f"Bearer {self.LINE_NOTIFY_TOKEN}"} + payload = {"message": message} + try: + response = requests.post(self.LINE_NOTIFY_API, headers=headers, data=payload) + response.raise_for_status() + except requests.exceptions.RequestException as e: + print(f"Failed to send LINE notification: {e}") + + def now_time(self): + now_utc = datetime.now(ZoneInfo("UTC")) + taipei_time = now_utc.astimezone(ZoneInfo("Asia/Taipei")) + return taipei_time.strftime("%Y-%m-%d %H:%M:%S") + + def ping_server(self, target): + system = platform.system() + ping_command = ["ping", "-n", "1", target] if system == "Windows" else ["ping", "-c", "1", target] + + try: + result = subprocess.run(ping_command, capture_output=True, text=True, check=True) + return True + except subprocess.CalledProcessError: + return False + + def fail_check(self): + if not self.ping_server(self.SERVER_IP): + message = f"{self.now_time()}: Host is unreachable after {self.MAX_RETRIES} attempts!!!" + print(message) + self.notify(message) + offline_time = 0 + while not self.ping_server(self.SERVER_IP): + offline_time += self.INTERVAL + message = f"{self.now_time()}: Server is still OFFLINE. Total offline time: {offline_time} seconds" + print(message) + if offline_time % 1800 == 0: # Notify every 30 minutes + self.notify(message) + time.sleep(self.INTERVAL) + else: + pass + + def monitor_server(self): + while True: + is_online = False + for attempt in range(self.MAX_RETRIES): + if self.ping_server(self.SERVER_IP): + is_online = True + break + time.sleep(1) # Short delay between retries + + if is_online: + print(f"{self.now_time()}: Host is online.") + else: + if not self.ping_server(self.GOOGLE_DNS): + print(f"{self.now_time()}: VPS Internet is down.") + break + self.fail_check() + + + message = f"{self.now_time()}: Server is back ONLINE." + print(message) + self.notify(message) + + time.sleep(self.INTERVAL) + + def run(self): + self.monitor_server() + +if __name__ == "__main__": + monitor = ServerMonitor() + monitor.run() \ No newline at end of file