]> git.mxchange.org Git - fba.git/blobdiff - fba/http/federation.py
Continued:
[fba.git] / fba / http / federation.py
index 5db5e5493cfe86650b5d30b8b60d8258b2788051..d59d63bed6e19872ef430bc94499b2ecb98ec030 100644 (file)
@@ -52,11 +52,15 @@ nodeinfo_identifier = [
 ]
 
 def fetch_instances(domain: str, origin: str, software: str, command: str, path: str = None):
-    logger.debug("domain='%s',origin='%s',software='%s',path='%s' - CALLED!", domain, origin, software, path)
+    logger.debug("domain='%s',origin='%s',software='%s',command='%s',path='%s' - CALLED!", domain, origin, software, command, path)
     domain_helper.raise_on(domain)
 
     if not isinstance(origin, str) and origin is not None:
         raise ValueError(f"Parameter origin[]='{type(origin)}' is not 'str'")
+    elif not isinstance(command, str):
+        raise ValueError(f"Parameter command[]='{type(command)}' is not 'str'")
+    elif command == "":
+        raise ValueError("Parameter 'command' is empty")
     elif software is None:
         logger.debug("Updating last_instance_fetch for domain='%s' ...", domain)
         instances.set_last_instance_fetch(domain)
@@ -71,10 +75,6 @@ def fetch_instances(domain: str, origin: str, software: str, command: str, path:
         logger.debug("Determined software='%s' for domain='%s'", software, domain)
     elif not isinstance(software, str):
         raise ValueError(f"Parameter software[]='{type(software)}' is not 'str'")
-    elif not isinstance(command, str):
-        raise ValueError(f"Parameter command[]='{type(command)}' is not 'str'")
-    elif command == "":
-        raise ValueError("Parameter 'command' is empty")
 
     if not instances.is_registered(domain):
         logger.debug("Adding new domain='%s',origin='%s',command='%s',path='%s',software='%s'", domain, origin, command, path, software)
@@ -136,9 +136,6 @@ def fetch_peers(domain: str, software: str) -> list:
         logger.debug("Invoking peertube.fetch_peers(%s) ...", domain)
         return peertube.fetch_peers(domain)
 
-    # Init peers variable
-    peers = list()
-
     # No CSRF by default, you don't have to add network.api_headers by yourself here
     headers = tuple()
 
@@ -148,44 +145,37 @@ def fetch_peers(domain: str, software: str) -> list:
     except network.exceptions as exception:
         logger.warning("Exception '%s' during checking CSRF (fetch_peers,%s) - EXIT!", type(exception), __name__)
         instances.set_last_error(domain, exception)
-        return peers
+        return list()
 
-    logger.debug("Fetching peers from domain='%s',software='%s' ...", domain, software)
-    data = network.get_json_api(
-        domain,
+    paths = {
         "/api/v1/instance/peers",
-        headers,
-        (config.get("connection_timeout"), config.get("read_timeout"))
-    )
+        "/api/v3/site",
+    }
 
-    logger.debug("data[]='%s'", type(data))
-    if "error_message" in data:
-        logger.debug("Was not able to fetch peers, trying alternative ...")
+    # Init peers variable
+    peers = list()
+
+    logger.debug("Checking %d paths ...", len(paths))
+    for path in paths:
+        logger.debug("Fetching path='%s' from domain='%s',software='%s' ...", path, domain, software)
         data = network.get_json_api(
             domain,
-            "/api/v3/site",
+            path,
             headers,
             (config.get("connection_timeout"), config.get("read_timeout"))
         )
 
         logger.debug("data[]='%s'", type(data))
         if "error_message" in data:
-            logger.warning("Could not reach any JSON API at domain='%s',status_code='%d',error_message='%s'", domain, data['status_code'], data['error_message'])
-        elif "federated_instances" in data["json"]:
-            logger.debug("Found federated_instances for domain='%s'", domain)
-            peers = peers + add_peers(data["json"]["federated_instances"])
-            logger.debug("Added instance(s) to peers")
-        else:
-            message = "JSON response does not contain 'federated_instances' or 'error_message'"
-            logger.warning("message='%s',domain='%s'", message, domain)
-            instances.set_last_error(domain, message)
-    elif isinstance(data["json"], list):
-        logger.debug("Querying API was successful: domain='%s',data[json]()=%d", domain, len(data['json']))
-        peers = data["json"]
-    else:
-        logger.warning("Cannot parse data[json][]='%s'", type(data['json']))
-
-    logger.debug("Adding %d for domain='%s'", len(peers), domain)
+            logger.debug("Was not able to fetch peers from path='%s',domain='%s' ...", path, domain)
+            instances.set_last_error(domain, data)
+        elif "json" in data and len(data["json"]) > 0:
+            logger.debug("Querying API path='%s' was successful: domain='%s',data[json]()=%d", path, domain, len(data['json']))
+            peers = data["json"]
+            instances.set_success(domain)
+            break
+
+    logger.debug("Invoking instances.set_total_peers(%s,%d) ...", domain, len(peers))
     instances.set_total_peers(domain, peers)
 
     logger.debug("peers()=%d - EXIT!", len(peers))
@@ -288,6 +278,8 @@ def fetch_wellknown_nodeinfo(domain: str) -> dict:
 
     if "error_message" not in data:
         nodeinfo = data["json"]
+        instances.set_success(domain)
+
         logger.debug("Found entries: nodeinfo()=%d,domain='%s'", len(nodeinfo), domain)
         if "links" in nodeinfo:
             logger.debug("Found nodeinfo[links]()=%d record(s)", len(nodeinfo["links"]))
@@ -318,9 +310,10 @@ def fetch_wellknown_nodeinfo(domain: str) -> dict:
 
                     logger.debug("link[href]='%s',data[]='%s'", link["href"], type(data))
                     if "error_message" not in data and "json" in data:
-                        logger.debug("Found JSON nodeinfo()=%d", len(data))
+                        logger.debug("Found JSON data()=%d", len(data))
                         instances.set_detection_mode(domain, "AUTO_DISCOVERY")
                         instances.set_nodeinfo_url(domain, link["href"])
+                        instances.set_success(domain)
                         break
                     else:
                         instances.set_last_error(domain, data)