+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+
# Fedi API Block - An aggregator for fetching blocking data from fediverse nodes
# Copyright (C) 2023 Free Software Foundation
#
import json
import time
import validators
-import fba
-
-def fetch_instances(domain: str, origin: str, software: str, path: str = None):
- # NOISY-DEBUG: print("DEBUG: domain,origin,software,path:", domain, origin, software, path)
- if not fba.is_instance_registered(domain):
- # NOISY-DEBUG: print("DEBUG: Adding new domain:", domain, origin)
- fba.add_instance(domain, origin, sys.argv[0], path)
-
- # NOISY-DEBUG: print("DEBUG: Fetching instances for domain:", domain, software)
- peerlist = fba.get_peers(domain, software)
-
- if (peerlist is None):
- print("ERROR: Cannot fetch peers:", domain)
- return
- elif fba.has_pending_nodeinfos(domain):
- # NOISY-DEBUG: print(f"DEBUG: domain='{domain}' has pending nodeinfo data, flushing ...")
- fba.update_nodeinfos(domain)
-
- print(f"INFO: Checking {len(peerlist)} instances from {domain} ...")
- for instance in peerlist:
- # NOISY-DEBUG: print("DEBUG: BEFORE instance:", instance)
- instance = fba.tidyup(instance)
- # NOISY-DEBUG: print("DEBUG: AFTER instance:", instance)
-
- if instance == "":
- print("WARNING: Empty instance after tidyup(), domain:", domain)
- continue
- elif not validators.domain(instance.split("/")[0]):
- print(f"WARNING: Bad instance='{instance}' from domain='{domain}',origin='{origin}',software='{software}'")
- continue
- elif fba.is_blacklisted(instance):
- # NOISY-DEBUG: print("DEBUG: instance is blacklisted:", instance)
- continue
+from fba import *
- # NOISY-DEBUG: print("DEBUG: Handling instance:", instance)
- try:
- if not fba.is_instance_registered(instance):
- # NOISY-DEBUG: print("DEBUG: Adding new instance:", instance, domain)
- fba.add_instance(instance, domain, sys.argv[0])
- except BaseException as e:
- print(f"ERROR: instance='{instance}',exception:'{str(e)}'")
- continue
+boot.acquire_lock()
instance = sys.argv[1]
# Initial fetch
-fetch_instances(instance, None, None)
+fba.fetch_instances(instance, None, None, sys.argv[0])
# Loop through some instances
fba.cursor.execute(
- "SELECT domain, origin, software, nodeinfo_url FROM instances WHERE software IN ('pleroma', 'mastodon', 'friendica', 'misskey', 'gotosocial', 'bookwyrm', 'takahe', 'lemmy') AND (last_instance_fetch IS NULL OR last_instance_fetch < ?) ORDER BY rowid DESC", [time.time() - fba.config["recheck_instance"]]
+ "SELECT domain, origin, software, nodeinfo_url FROM instances WHERE software IN ('pleroma', 'mastodon', 'friendica', 'misskey', 'gotosocial', 'bookwyrm', 'takahe', 'lemmy') AND (last_instance_fetch IS NULL OR last_instance_fetch < ?) ORDER BY rowid DESC", [time.time() - config.get("recheck_instance")]
)
rows = fba.cursor.fetchall()
print(f"INFO: Checking {len(rows)} entries ...")
for row in rows:
- # NOISY-DEBUG: print("DEBUG: domain:", row[0])
+ # DEBUG: print("DEBUG: domain:", row[0])
if fba.is_blacklisted(row[0]):
print("WARNING: domain is blacklisted:", row[0])
continue
- print(f"INFO: Fetching instances for instance '{row[0]}'('{row[2]}') of origin '{row[1]}',nodeinfo_url='{row[3]}'")
- fetch_instances(row[0], row[1], row[2], row[3])
+ print(f"INFO: Fetching instances for instance '{row[0]}' ('{row[2]}') of origin='{row[1]}',nodeinfo_url='{row[3]}'")
+ fba.fetch_instances(row[0], row[1], row[2], sys.argv[0], row[3])
-fba.connection.close()
+boot.shutdown()