diff --git a/files/initrd/opt/arc/include/functions.py b/files/initrd/opt/arc/include/functions.py index a9d43c2e..ab43a19d 100755 --- a/files/initrd/opt/arc/include/functions.py +++ b/files/initrd/opt/arc/include/functions.py @@ -99,32 +99,46 @@ def getmodels(platforms=None): """ Get Syno Models. """ - import re, json - import requests + import json, requests, urllib3 + from requests.adapters import HTTPAdapter + from requests.packages.urllib3.util.retry import Retry # type: ignore + adapter = HTTPAdapter(max_retries=Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])) + session = requests.Session() + session.mount('http://', adapter) + session.mount('https://', adapter) + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + if platforms is not None and platforms != "": PS = platforms.lower().replace(",", " ").split() else: PS = [] models = [] - req = requests.get("https://autoupdate.synology.com/os/v2") - req.encoding = "utf-8" - data = json.loads(req.text) + if len(models) == 0: + try: + req = session.get("https://autoupdate.synology.com/os/v2", timeout=10, verify=False) + req.encoding = "utf-8" + data = json.loads(req.text) - for I in data["channel"]["item"]: - if not I["title"].startswith("DSM"): - continue - for J in I["model"]: - arch = J["mUnique"].split("_")[1] - name = J["mLink"].split("/")[-1].split("_")[1].replace("%2B", "+") - if len(PS) > 0 and arch.lower() not in PS: - continue - if any(name == B["name"] for B in models): - continue - models.append({"name": name, "arch": arch}) + for I in data["channel"]["item"]: + if not I["title"].startswith("DSM"): + continue + for J in I["model"]: + arch = J["mUnique"].split("_")[1] + name = J["mLink"].split("/")[-1].split("_")[1].replace("%2B", "+") + if len(PS) > 0 and arch.lower() not in PS: + continue + if any(name == B["name"] for B in models): + continue + models.append({"name": name, "arch": arch}) - models = sorted(models, key=lambda k: (k["arch"], k["name"])) + models = sorted(models, key=lambda k: (k["arch"], k["name"])) + + except: + pass + + models.sort(key=lambda x: (x["arch"], x["name"])) print(json.dumps(models, indent=4)) @cli.command()