]> 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     fba.cursor.execute(
11         "SELECT domain FROM instances WHERE domain = ? LIMIT 1", [domain]
12     )
13
14     if fba.cursor.fetchone() == None:
15         # NOISY-DEBUG: print("DEBUG: Adding new domain:", domain, origin)
16         fba.add_instance(domain, origin, sys.argv[0])
17
18     # NOISY-DEBUG: print("DEBUG: Fetching instances for domain:", domain, software)
19     peerlist = fba.get_peers(domain, software)
20
21     if (peerlist is None):
22         print("ERROR: Cannot fetch peers:", domain)
23         return
24     elif domain in fba.nodeinfos["get_peers_url"]:
25         # NOISY-DEBUG: print(f"DEBUG: domain='{domain}' has pending nodeinfo data, flushing ...")
26         fba.update_nodeinfos(domain)
27
28     print(f"INFO: Checking {len(peerlist)} instances from {domain} ...")
29     for instance in peerlist:
30         # NOISY-DEBUG: print("DEBUG: BEFORE instance:", instance)
31         instance = fba.tidyup(instance)
32         # NOISY-DEBUG: print("DEBUG: AFTER instance:", instance)
33
34         if instance == "":
35             print("WARNING: Empty instance after tidyup(), domain:", domain)
36             continue
37         elif not validators.domain(instance):
38             print("WARNING: Bad instance name,domain:", instance, domain)
39             continue
40         elif fba.is_blacklisted(instance):
41             # NOISY-DEBUG: print("DEBUG: instance is blacklisted:", instance)
42             continue
43
44         # NOISY-DEBUG: print("DEBUG: Handling instance:", instance)
45         try:
46             fba.cursor.execute(
47                 "SELECT domain FROM instances WHERE domain = ? LIMIT 1", [instance]
48             )
49
50             if fba.cursor.fetchone() == None:
51                 # NOISY-DEBUG: print("DEBUG: Adding new instance:", instance, domain)
52                 fba.add_instance(instance, domain, sys.argv[0])
53
54             fba.connection.commit()
55
56         except Exception as e:
57             print("ERROR:", e, instance)
58             continue
59
60 instance = sys.argv[1]
61
62 # Initial fetch
63 fetch_instances(instance, None, None)
64
65 # Loop through some instances
66 fba.cursor.execute(
67     "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"]]
68 )
69
70 for row in fba.cursor.fetchall():
71     # NOISY-DEBUG: print("DEBUG: domain:", row[0])
72     if fba.is_blacklisted(row[0]):
73         print("WARNING: domain is blacklisted:", row[0])
74         continue
75
76     print("INFO: Fetching instances for instance:", row[0])
77     fetch_instances(row[0], None, row[1])
78
79 fba.connection.close()