def fetch_instances(domain: str, origin: str, software: str, command: str, path: str = None):
global _DEPTH
logger.debug("domain='%s',origin='%s',software='%s',command='%s',path='%s',_DEPTH=%d - CALLED!", domain, origin, software, command, path, _DEPTH)
- _DEPTH = _DEPTH + 1
domain_helper.raise_on(domain)
if not isinstance(origin, str) and origin is not None:
raise ValueError("Parameter 'command' is empty")
elif command in ["fetch_blocks", "fetch_cs", "fetch_bkali", "fetch_relays", "fetch_fedipact", "fetch_joinmobilizon", "fetch_joinmisskey", "fetch_joinfediverse"] and origin is None:
raise ValueError(f"Parameter command='{command}' but origin is None, please fix invoking this function.")
- elif software is None:
+ elif not isinstance(path, str) and path is not None:
+ raise ValueError(f"Parameter path[]='{type(path)}' is not of type 'str'")
+ elif _DEPTH > 0 and instances.is_recent(domain, "last_instance_fetch"):
+ raise ValueError(f"domain='{domain}' has recently been fetched but function was invoked")
+ elif software is None and not instances.is_recent(domain, "last_nodeinfo"):
try:
logger.debug("Software for domain='%s' is not set, determining ...", domain)
software = determine_software(domain, path)
instances.set_last_error(domain, exception)
logger.debug("Determined software='%s' for domain='%s'", software, domain)
+ elif software is None:
+ logger.debug("domain='%s' has unknown software or nodeinfo has recently being fetched", domain)
elif not isinstance(software, str):
raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
- elif not isinstance(path, str) and path is not None:
- raise ValueError(f"Parameter path[]='{type(path)}' is not of type 'str'")
+
+ # Increase depth
+ _DEPTH = _DEPTH + 1
logger.debug("Checking if domain='%s' is registered ...", domain)
if not instances.is_registered(domain):
if instance == "":
logger.warning("Empty instance after tidyup.domain(), domain='%s'", domain)
continue
+ elif ".." in instance:
+ logger.warning("instance='%s' contains double-dot, removing ...", instance)
+ instance = instance.replace("..", ".")
logger.debug("instance='%s' - BEFORE!", instance)
instance = instance.encode("idna").decode("utf-8")
logger.debug("software='%s' has 'powered by' in it", software)
software = version.remove(software_helper.strip_powered_by(software))
+ software = software.strip()
+
logger.debug("software='%s' - EXIT!", software)
return software