108 lines
3.5 KiB
Python
108 lines
3.5 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import subprocess
|
|
import requests
|
|
import re
|
|
import argparse
|
|
import os
|
|
import sys
|
|
|
|
PUSHOVER_USER_KEY = ""
|
|
PUSHOVER_API_TOKEN = ""
|
|
|
|
|
|
def get_installed_version():
|
|
try:
|
|
result = subprocess.run(["dpkg", "-l"], capture_output=True, text=True, check=True)
|
|
for line in result.stdout.splitlines():
|
|
if "unifi" in line and line.startswith("ii"):
|
|
match = re.search(r"\bunifi\s+([\d\.]+)", line)
|
|
if match:
|
|
return match.group(1)
|
|
except Exception as e:
|
|
print(f"Błąd przy sprawdzaniu wersji dpkg: {e}")
|
|
return None
|
|
|
|
def get_latest_version():
|
|
url = "https://raw.githubusercontent.com/trexx/docker-unifi-controller/refs/heads/main/Dockerfile"
|
|
try:
|
|
response = requests.get(url)
|
|
if response.status_code == 200:
|
|
match = re.search(r'UNIFI_CONTROLLER_VERSION="([\d\.]+)', response.text)
|
|
if match:
|
|
return match.group(1)
|
|
except Exception as e:
|
|
print(f"Błąd przy pobieraniu Dockerfile: {e}")
|
|
return None
|
|
|
|
def send_pushover(message, title="Aktualizacja UniFi"):
|
|
try:
|
|
r = requests.post("https://api.pushover.net/1/messages.json", data={
|
|
"token": PUSHOVER_API_TOKEN,
|
|
"user": PUSHOVER_USER_KEY,
|
|
"message": message,
|
|
"title": title,
|
|
"priority": 0
|
|
})
|
|
return r.status_code == 200
|
|
except Exception as e:
|
|
print(f"Błąd przy wysyłaniu powiadomienia: {e}")
|
|
return False
|
|
|
|
def download_and_install(version):
|
|
deb_url = f"https://dl.ui.com/unifi/{version}/unifi_sysvinit_all.deb"
|
|
local_file = f"/tmp/unifi_{version}.deb"
|
|
print(f"Pobieranie: {deb_url}")
|
|
try:
|
|
r = requests.get(deb_url, stream=True)
|
|
if r.status_code != 200:
|
|
print(f"Nie udało się pobrać pakietu. Kod: {r.status_code}")
|
|
return False
|
|
with open(local_file, 'wb') as f:
|
|
for chunk in r.iter_content(chunk_size=8192):
|
|
f.write(chunk)
|
|
print("Instalowanie pakietu...")
|
|
subprocess.run(["sudo", "dpkg", "-i", local_file], check=True)
|
|
print("Instalacja zakończona.")
|
|
return True
|
|
except Exception as e:
|
|
print(f"Błąd przy instalacji: {e}")
|
|
return False
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Sprawdza i aktualizuje UniFi Controller")
|
|
parser.add_argument('--install', nargs='?', const='latest', help="Zainstaluj konkretną wersję lub najnowszą")
|
|
args = parser.parse_args()
|
|
|
|
if args.install:
|
|
version = args.install
|
|
if version == 'latest':
|
|
version = get_latest_version()
|
|
if not version:
|
|
print("Nie można pobrać najnowszej wersji.")
|
|
sys.exit(1)
|
|
print(f"Instalacja wersji: {version}")
|
|
success = download_and_install(version)
|
|
sys.exit(0 if success else 1)
|
|
|
|
# Tryb sprawdzania i ewentualnego alertowania
|
|
installed = get_installed_version()
|
|
latest = get_latest_version()
|
|
|
|
if not installed or not latest:
|
|
print("Nie udało się pobrać wersji.")
|
|
return
|
|
|
|
print(f"Zainstalowana wersja: {installed}")
|
|
print(f"Najnowsza wersja : {latest}")
|
|
|
|
if installed != latest:
|
|
msg = f"Dostępna nowa wersja UniFi Controller: {latest} (obecna: {installed})"
|
|
print(msg)
|
|
send_pushover(msg)
|
|
else:
|
|
print("UniFi Controller jest aktualny.")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|