From: Roland Häder Date: Fri, 23 Jun 2023 03:36:24 +0000 (+0200) Subject: Continued: X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=601204bdca2349c94a0ed9cb34659edde0769464;p=fba.git Continued: - set_success() sets status_code to 200 and clears last_error_details --- diff --git a/fba/commands.py b/fba/commands.py index bf3f1d4..da62329 100644 --- a/fba/commands.py +++ b/fba/commands.py @@ -640,7 +640,7 @@ def fetch_instances(args: argparse.Namespace) -> int: continue try: - logger.info("Fetching instances for instance domain='%s',software='%s',origin='%s',nodeinfo_url='%s'", row[0], row[2], row[1], row[3]) + logger.info("Fetching instances for domain='%s',software='%s',origin='%s',nodeinfo_url='%s'", row[0], row[2], row[1], row[3]) federation.fetch_instances(row[0], row[1], row[2], inspect.currentframe().f_code.co_name, row[3]) logger.debug("Invoking cookies.clear(%s) ...", row[0]) diff --git a/fba/http/federation.py b/fba/http/federation.py index 5db5e54..d59d63b 100644 --- a/fba/http/federation.py +++ b/fba/http/federation.py @@ -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) diff --git a/fba/models/instances.py b/fba/models/instances.py index c0eb7ab..9a3a273 100644 --- a/fba/models/instances.py +++ b/fba/models/instances.py @@ -250,6 +250,16 @@ def set_last_error(domain: str, error: dict): logger.debug("EXIT!") +def set_success(domain: str): + logger.debug("domain='%s' - CALLED!", domain) + domain_helper.raise_on(domain) + + # Set both to success + _set_data("last_status_code" , domain, 200) + _set_data("last_error_details", domain, None) + + logger.debug("EXIT!") + def is_registered(domain: str) -> bool: logger.debug("domain='%s' - CALLED!", domain) domain_helper.raise_on(domain) diff --git a/fba/networks/lemmy.py b/fba/networks/lemmy.py index 462b1a0..5e55339 100644 --- a/fba/networks/lemmy.py +++ b/fba/networks/lemmy.py @@ -66,7 +66,7 @@ def fetch_peers(domain: str) -> list: elif "federated_instances" in data["json"] and isinstance(data["json"]["federated_instances"], dict): logger.debug("Found federated_instances for domain='%s'", domain) peers = peers + federation.add_peers(data["json"]["federated_instances"]) - logger.debug("Added instance(s) to peers") + instances.set_success(domain) else: logger.warning("JSON response does not contain 'federated_instances', domain='%s'", domain) instances.set_last_error(domain, data) diff --git a/fba/networks/mastodon.py b/fba/networks/mastodon.py index 7312720..78939bd 100644 --- a/fba/networks/mastodon.py +++ b/fba/networks/mastodon.py @@ -171,6 +171,7 @@ def fetch_blocks(domain: str, nodeinfo_url: str) -> list: else: # Getting blocklist rows = data["json"] + instances.set_success(domain) if len(rows) == 0: logger.debug("domain='%s' has returned zero rows, trying /about/more page ...", domain) diff --git a/fba/networks/peertube.py b/fba/networks/peertube.py index 7b210ff..3007d02 100644 --- a/fba/networks/peertube.py +++ b/fba/networks/peertube.py @@ -60,6 +60,8 @@ def fetch_peers(domain: str) -> list: logger.debug("data[]='%s'", type(data)) if "error_message" not in data: logger.debug("Success, data[json]()=%d", len(data['json'])) + instances.set_success(domain) + if "data" in data["json"]: rows = data["json"]["data"]