#!/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)