# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
-from fba import config
-from fba import csrf
-from fba import network
+import logging
+
+from fba.helpers import blacklist
+from fba.helpers import config
+from fba.helpers import domain as domain_helper
+
+from fba.http import csrf
+from fba.http import network
from fba.models import instances
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger(__name__)
+
def fetch_peers(domain: str) -> list:
- # DEBUG: print(f"DEBUG: domain({len(domain)})={domain},software='peertube' - CALLED!")
- if not isinstance(domain, str):
- raise ValueError(f"Parameter domain[]='{type(domain)}' is not 'str'")
- elif domain == "":
- raise ValueError("Parameter 'domain' is empty")
+ logger.debug("domain='%s' - CALLED!", domain)
+ domain_helper.raise_on(domain)
- # DEBUG: print(f"DEBUG: domain='{domain}' is a PeerTube, fetching JSON ...")
- peers = list()
- start = 0
+ if blacklist.is_blacklisted(domain):
+ raise Exception(f"domain='{domain}' is blacklisted but function is invoked.")
+ elif not instances.is_registered(domain):
+ raise Exception(f"domain='{domain}' is not registered but function is invoked.")
- # No CSRF by default, you don't have to add network.api_headers by yourself here
+ # Init variables
+ peers = list()
headers = tuple()
+ start = 0
try:
- # DEBUG: print(f"DEBUG: Checking CSRF for domain='{domain}'")
+ logger.debug("Checking CSRF for domain='%s' ...", domain)
headers = csrf.determine(domain, dict())
except network.exceptions as exception:
- print(f"WARNING: Exception '{type(exception)}' during checking CSRF (fetch_peers,{__name__}) - EXIT!")
+ logger.warning("Exception '%s' during checking CSRF (fetch_peers,%s)", type(exception), __name__)
instances.set_last_error(domain, exception)
- return peers
+
+ logger.debug("Returning empty list ... - EXIT!")
+ return list()
for mode in ["followers", "following"]:
- # DEBUG: print(f"DEBUG: domain='{domain}',mode='{mode}'")
+ logger.debug("domain='%s',mode='%s'", domain, mode)
while True:
data = network.get_json_api(
domain,
(config.get("connection_timeout"), config.get("read_timeout"))
)
- # DEBUG: print(f"DEBUG: data[]='{type(data)}'")
- if "error_message" not in data:
- # DEBUG: print(f"DEBUG: Success, data[json]()={len(data['json'])}")
- if "data" in data["json"]:
- rows = data["json"]["data"]
-
- # DEBUG: print(f"DEBUG: Found {len(rows)} record(s).")
- for record in rows:
- # DEBUG: print(f"DEBUG: record()={len(record)}")
- for mode2 in ["follower", "following" ]:
- # DEBUG: print(f"DEBUG: mode2='{mode2}'")
- if mode2 in record and "host" in record[mode2]:
- # DEBUG: print(f"DEBUG: Found host='{record[mode2]['host']}', adding ...")
- peers.append(record[mode2]["host"])
- else:
- print(f"WARNING: record from '{domain}' has no '{mode2}' or 'host' record: {record}")
-
- if len(rows) < 100:
- # DEBUG: print(f"DEBUG: Reached end of JSON response, domain='{domain}'")
- break
+ logger.debug("data[]='%s'", type(data))
+ if "error_message" in data:
+ logger.warning("domain='%s' causes error during API query: '%s' - SKIPPED!", domain, data["error_message"])
+ break
+ elif "data" not in data["json"]:
+ logger.warning("domain='%s' has no 'data' element returned - SKIPPED!", domain)
+ break
+ else:
+ logger.debug("Success, data[json]()=%d", len(data["json"]))
+ instances.set_success(domain)
+
+ rows = data["json"]["data"]
+
+ logger.debug("Found %d record(s).", len(rows))
+ for record in rows:
+ logger.debug("record()=%d", len(record))
+ for mode2 in ["follower", "following"]:
+ logger.debug("mode=%s,mode2='%s'", mode, mode2)
+ if mode2 not in record:
+ logger.debug("Array record does not contain element mode2='%s' - SKIPPED", mode2)
+ continue
+ elif "host" not in record[mode2]:
+ logger.debug("record[%s] does not contain element 'host' - SKIPPED", mode2)
+ continue
+ elif record[mode2]["host"] == domain:
+ logger.debug("record[%s]='%s' matches domain='%s' - SKIPPED!", mode2, record[mode2]["host"], domain)
+ continue
+ elif not domain_helper.is_wanted(record[mode2]["host"]):
+ logger.debug("record[%s][host]='%s' is not wanted - SKIPPED!", mode2, record[mode2]["host"])
+ continue
+
+ logger.debug("Appending mode2='%s',host='%s' ...", mode2, record[mode2]["host"])
+ peers.append(record[mode2]["host"])
+
+ if len(rows) < 100:
+ logger.debug("Reached end of JSON response, domain='%s'", domain)
+ break
# Continue with next row
start = start + 100
- else:
- print(f"WARNING: domain='{domain}' causes error during API query: '{data['error_message']}' - SKIPPED!")
- break
-
- # DEBUG: print(f"DEBUG: Adding '{len(peers)}' for domain='{domain}'")
- instances.set_total_peers(domain, peers)
- # DEBUG: print(f"DEBUG: Returning peers[]='{type(peers)}'")
+ logger.debug("peers[%s]()=%d - EXIT!", type(peers), len(peers))
return peers