From 1a312e3414834fa400d5643dd40fde3297228943 Mon Sep 17 00:00:00 2001 From: gru Date: Fri, 20 Feb 2026 13:26:16 +0100 Subject: [PATCH] Update routeros_version_notify.py --- routeros_version_notify.py | 91 +++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/routeros_version_notify.py b/routeros_version_notify.py index b516b2c..d0ceeba 100644 --- a/routeros_version_notify.py +++ b/routeros_version_notify.py @@ -1 +1,90 @@ -@ \ No newline at end of file +#!/usr/bin/env python3 +# Hi MikroTik Team! Great RSS feeds, thanks! +# Mateusz GruszczyƄski (linuxiarz.pl), contact: zdzichu6969@gmail.com +# Script: https://git.linuxiarz.pl/gru/tools_scripts/src/branch/master/routeros_version_notify.py + +import requests +from bs4 import BeautifulSoup +import json +import os +import re +from datetime import datetime +import time + +PUSHOVER_USER = 'your_user_key' +PUSHOVER_TOKEN = 'your_api_token' +STATE_FILE = 'mikrotik_versions.json' + +RSS_URLS = { + 'stable': 'https://cdn.mikrotik.com/routeros/latest-stable.rss', + 'long-term': 'https://cdn.mikrotik.com/routeros/latest-long-term.rss', + 'development': 'https://cdn.mikrotik.com/routeros/latest-development.rss', + 'testing': 'https://cdn.mikrotik.com/routeros/latest-testing.rss' +} + +def get_latest_versions(): + versions = {} + headers = { + 'User-Agent': 'RSSChecker/1.0 (Hi MikroTik Team! zdzichu6969@gmail.com https://git.linuxiarz.pl/gru/tools_scripts/src/branch/master/routeros_version_notify.py)' + } + for channel, url in RSS_URLS.items(): + print(f"Checking {channel}: {url}") + try: + response = requests.get(url, headers=headers, timeout=10) + response.raise_for_status() + soup = BeautifulSoup(response.content, 'xml') + item = soup.find('item') + if item: + title = item.title.string.strip() + match = re.search(r'(\d+\.\d+(?:\.\d+)?(?:\w+)?)', title) + if match: + versions[channel] = match.group(1) + continue + versions[channel] = 'Not found' + except Exception as e: + print(f"RSS error {url}: {e}") + versions[channel] = 'Error' + time.sleep(0.5) + return versions + +def load_saved_versions(): + if os.path.exists(STATE_FILE): + with open(STATE_FILE, 'r') as f: + return json.load(f) + return {} + +def save_versions(versions): + versions['last_check'] = datetime.now().isoformat() + with open(STATE_FILE, 'w') as f: + json.dump(versions, f, indent=2) + +def send_pushover(title, message): + url = 'https://api.pushover.net/1/messages.json' + data = { + 'token': PUSHOVER_TOKEN, + 'user': PUSHOVER_USER, + 'title': title, + 'message': message, + 'timestamp': int(datetime.now().timestamp()) + } + requests.post(url, data=data).raise_for_status() + +current_versions = get_latest_versions() +saved_versions = load_saved_versions() + +new_versions = False +message_parts = [] + +for channel, ver in current_versions.items(): + saved_ver = saved_versions.get(channel, '0.0') + if ver != 'Not found' and ver != 'Error' and ver > saved_ver: + new_versions = True + message_parts.append(f"{channel}: {saved_ver} -> {ver}") + +if new_versions and PUSHOVER_USER != 'your_user_key': + message = "New RouterOS versions:\n" + "\n".join(message_parts) + send_pushover("MikroTik Update", message) + print("Pushover sent!") + +save_versions(current_versions) +print("Checked:", current_versions)