91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
#!/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)
|