2018-02-03 20:40:17 +00:00
|
|
|
#!/usr/bin/env python3
|
2018-02-03 00:36:08 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
2018-02-03 20:40:17 +00:00
|
|
|
# pylint: disable=C0111,C0326,C0103
|
|
|
|
|
2018-02-03 21:25:26 +00:00
|
|
|
"""Tools to manage saved device databases."""
|
|
|
|
|
2018-02-03 00:36:08 +00:00
|
|
|
import json
|
|
|
|
import os
|
|
|
|
import time
|
2018-02-03 20:24:36 +00:00
|
|
|
|
|
|
|
import requests
|
|
|
|
|
2018-02-03 00:36:08 +00:00
|
|
|
from . import ansi
|
|
|
|
|
2018-02-03 20:24:36 +00:00
|
|
|
|
2018-02-03 00:36:08 +00:00
|
|
|
DEVICELIST_URL = "https://tclota.birth-online.de/json_lastupdates.php"
|
|
|
|
DEVICELIST_FILE = "prds.json"
|
|
|
|
DEVICELIST_CACHE_SECONDS = 86400
|
|
|
|
|
2018-02-03 20:24:36 +00:00
|
|
|
|
2018-02-05 17:14:33 +00:00
|
|
|
def load_local_devicelist():
|
|
|
|
"""Load local devicelist and return decoded JSON (or None) and need_download status."""
|
2018-02-05 15:32:26 +00:00
|
|
|
need_download = True
|
|
|
|
try:
|
|
|
|
filestat = os.stat(DEVICELIST_FILE)
|
|
|
|
filemtime = filestat.st_mtime
|
|
|
|
if filemtime > time.time() - DEVICELIST_CACHE_SECONDS:
|
|
|
|
need_download = False
|
|
|
|
with open(DEVICELIST_FILE, "rt") as dlfile:
|
2018-02-05 17:14:33 +00:00
|
|
|
return json.load(dlfile), need_download
|
2018-02-05 15:32:26 +00:00
|
|
|
except FileNotFoundError:
|
2018-02-05 17:14:33 +00:00
|
|
|
return None, True
|
|
|
|
|
2018-02-06 18:27:36 +00:00
|
|
|
|
2018-02-09 20:41:12 +00:00
|
|
|
def get_devicelist(force=False, output_diff=True, local=False):
|
2018-02-05 17:14:33 +00:00
|
|
|
"""Return device list from saved database."""
|
|
|
|
old_prds, need_download = load_local_devicelist()
|
2018-02-03 00:36:08 +00:00
|
|
|
|
2018-02-09 20:41:12 +00:00
|
|
|
if local:
|
|
|
|
return old_prds
|
|
|
|
|
2018-02-05 15:32:26 +00:00
|
|
|
if need_download or force:
|
|
|
|
prds_json = requests.get(DEVICELIST_URL).text
|
|
|
|
with open(DEVICELIST_FILE, "wt") as dlfile:
|
|
|
|
dlfile.write(prds_json)
|
2018-02-03 00:36:08 +00:00
|
|
|
|
2018-02-05 15:32:26 +00:00
|
|
|
with open(DEVICELIST_FILE, "rt") as dlfile:
|
|
|
|
prds = json.load(dlfile)
|
2018-02-03 00:36:08 +00:00
|
|
|
|
2018-02-05 15:32:26 +00:00
|
|
|
if old_prds and output_diff:
|
|
|
|
print_prd_diff(old_prds, prds)
|
2018-02-03 00:36:08 +00:00
|
|
|
|
2018-02-05 15:32:26 +00:00
|
|
|
return prds
|
2018-02-03 00:36:08 +00:00
|
|
|
|
2018-02-06 18:27:36 +00:00
|
|
|
|
2018-02-05 17:14:33 +00:00
|
|
|
def print_versions_diff(old_data, new_data):
|
2018-02-06 18:27:36 +00:00
|
|
|
"""Print version changes between old and new databases."""
|
2018-02-05 17:14:33 +00:00
|
|
|
prd = new_data["curef"]
|
|
|
|
if new_data["last_full"] != old_data["last_full"] and new_data["last_ota"] != old_data["last_ota"]:
|
|
|
|
print("> {}: {} ⇨ {} (OTA: {} ⇨ {})".format(
|
|
|
|
prd,
|
|
|
|
ansi.CYAN_DARK + str(old_data["last_full"]) + ansi.RESET,
|
|
|
|
ansi.CYAN + str(new_data["last_full"]) + ansi.RESET,
|
|
|
|
ansi.YELLOW_DARK + str(old_data["last_ota"]) + ansi.RESET,
|
|
|
|
ansi.YELLOW + str(new_data["last_ota"]) + ansi.RESET
|
|
|
|
))
|
|
|
|
elif new_data["last_full"] != old_data["last_full"]:
|
|
|
|
print("> {}: {} ⇨ {} (FULL)".format(prd, ansi.CYAN_DARK + str(old_data["last_full"]) + ansi.RESET, ansi.CYAN + str(new_data["last_full"]) + ansi.RESET))
|
|
|
|
elif new_data["last_ota"] != old_data["last_ota"]:
|
|
|
|
print("> {}: {} ⇨ {} (OTA)".format(prd, ansi.YELLOW_DARK + str(old_data["last_ota"]) + ansi.RESET, ansi.YELLOW + str(new_data["last_ota"]) + ansi.RESET))
|
|
|
|
|
2018-02-06 18:27:36 +00:00
|
|
|
|
2018-02-05 15:32:26 +00:00
|
|
|
def print_prd_diff(old_prds, new_prds):
|
2018-02-06 18:27:36 +00:00
|
|
|
"""Print PRD changes between old and new databases."""
|
2018-02-05 15:32:26 +00:00
|
|
|
added_prds = [prd for prd in new_prds if prd not in old_prds]
|
|
|
|
removed_prds = [prd for prd in old_prds if prd not in new_prds]
|
|
|
|
for prd in removed_prds:
|
|
|
|
print("> Removed device {} (was at {} / OTA: {}).".format(ansi.RED + prd + ansi.RESET, old_prds[prd]["last_full"], old_prds[prd]["last_ota"]))
|
|
|
|
for prd in added_prds:
|
|
|
|
print("> New device {} ({} / OTA: {}).".format(ansi.GREEN + prd + ansi.RESET, new_prds[prd]["last_full"], new_prds[prd]["last_ota"]))
|
|
|
|
for prd, pdata in new_prds.items():
|
|
|
|
if prd in added_prds:
|
|
|
|
continue
|
|
|
|
odata = old_prds[prd]
|
2018-02-05 17:14:33 +00:00
|
|
|
print_versions_diff(odata, pdata)
|