]> git.mxchange.org Git - fba.git/blob - fetch_instances.py
Continued:
[fba.git] / fetch_instances.py
1 import sqlite3
2 import sys
3 import json
4 import time
5 import validators
6 import fba
7
8 def fetch_instances(domain: str, origin: str, software: str):
9     # NOISY-DEBUG: print("DEBUG: domain,origin,software:", domain, origin, software)
10     if not fba.is_instance_registered(domain):
11         # NOISY-DEBUG: print("DEBUG: Adding new domain:", domain, origin)
12         fba.add_instance(domain, origin, sys.argv[0])
13
14     # NOISY-DEBUG: print("DEBUG: Fetching instances for domain:", domain, software)
15     peerlist = fba.get_peers(domain, software)
16
17     if (peerlist is None):
18         print("ERROR: Cannot fetch peers:", domain)
19         return
20     elif domain in fba.nodeinfos["get_peers_url"]:
21         # NOISY-DEBUG: print(f"DEBUG: domain='{domain}' has pending nodeinfo data, flushing ...")
22         fba.update_nodeinfos(domain)
23
24     print(f"INFO: Checking {len(peerlist)} instances from {domain} ...")
25     for instance in peerlist:
26         # NOISY-DEBUG: print("DEBUG: BEFORE instance:", instance)
27         instance = fba.tidyup(instance)
28         # NOISY-DEBUG: print("DEBUG: AFTER instance:", instance)
29
30         if instance == "":
31             print("WARNING: Empty instance after tidyup(), domain:", domain)
32             continue
33         elif not validators.domain(instance.split("/")[0]):
34             print(f"WARNING: Bad instance='{domain} from domain='{domain}',origin='{origin}',software='{software}'")
35             continue
36         elif fba.is_blacklisted(instance):
37             # NOISY-DEBUG: print("DEBUG: instance is blacklisted:", instance)
38             continue
39
40         # NOISY-DEBUG: print("DEBUG: Handling instance:", instance)
41         try:
42             if not fba.is_instance_registered(instance):
43                 # NOISY-DEBUG: print("DEBUG: Adding new instance:", instance, domain)
44                 fba.add_instance(instance, domain, sys.argv[0])
45         except BaseException as e:
46             print(f"ERROR: instance='{instance}',exception:'{e}'")
47             continue
48
49 instance = sys.argv[1]
50
51 # Initial fetch
52 fetch_instances(instance, None, None)
53
54 # Loop through some instances
55 fba.cursor.execute(
56     "SELECT domain,software FROM instances WHERE software IN ('pleroma', 'mastodon', 'friendica', 'misskey', 'gotosocial', 'bookwyrm', 'takahe', 'lemmy') AND (last_nodeinfo IS NULL OR last_nodeinfo < ?) ORDER BY rowid DESC", [time.time() - fba.config["recheck_instance"]]
57 )
58
59 rows = fba.cursor.fetchall()
60 print(f"INFO: Checking {len(rows)} entries ...")
61 for row in rows:
62     # NOISY-DEBUG: print("DEBUG: domain:", row[0])
63     if fba.is_blacklisted(row[0]):
64         print("WARNING: domain is blacklisted:", row[0])
65         continue
66
67     print("INFO: Fetching instances for instance:", row[0])
68     fetch_instances(row[0], None, row[1])
69
70 fba.connection.close()