]> git.mxchange.org Git - fba.git/commitdiff
Continued:
authorRoland Häder <roland@mxchange.org>
Sat, 3 Jun 2023 05:50:29 +0000 (07:50 +0200)
committerRoland Häder <roland@mxchange.org>
Sat, 3 Jun 2023 05:52:28 +0000 (07:52 +0200)
- inter-process locking added, prevents nasty stuff

fba.py
fetch_bkali.py
fetch_blocks.py
fetch_fba_rss.py
fetch_instances.py

diff --git a/fba.py b/fba.py
index 612bc03af1d58c14fb1910878ccacb1f86a08e3b..c8a088c587d7a2fde0ff2e7371641ad5b5224b0d 100644 (file)
--- a/fba.py
+++ b/fba.py
@@ -19,10 +19,13 @@ import hashlib
 import re
 import reqto
 import json
+import os
 import sqlite3
 import sys
+import tempfile
 import time
 import validators
+import zc.lockfile
 
 with open("config.json") as f:
     config = json.loads(f.read())
@@ -143,6 +146,10 @@ patterns = [
     re.compile("^[a-f0-9]{7}$"),
 ]
 
+# Lock file
+lockfile = tempfile.gettempdir() + '/.' + __name__ + '.lock'
+LOCK = None
+
 ##### Cache #####
 
 def is_cache_initialized(key: str) -> bool:
@@ -1544,3 +1551,23 @@ def tidyup(string: str) -> str:
     string = re.sub("(.+)\@", "", string)
 
     return string
+
+def lock_process():
+    global LOCK
+    try:
+        print(f"DEBUG: Acquiring lock: '{lockfile}'")
+        LOCK = zc.lockfile.LockFile(lockfile)
+        print("DEBUG: Lock obtained.")
+
+    except zc.lockfile.LockError:
+        print(f"ERROR: Cannot aquire lock: '{lockfile}'")
+        sys.exit(100)
+
+def shutdown():
+    print("DEBUG: Closing database connection ...")
+    connection.close()
+    print("DEBUG: Releasing lock ...")
+    LOCK.close()
+    print(f"DEBUG: Deleting lockfile='{lockfile}' ...")
+    os.remove(lockfile)
+    print("DEBUG: Shutdown completed.")
index acfe7c6057ee8f2f6eb58f7fba3f3a62440d3a2d..01aea5a2a62401cf30b083fb53910ec4f6646178 100755 (executable)
@@ -22,6 +22,8 @@ import sys
 import validators
 import fba
 
+fba.lock_process()
+
 domains = list()
 try:
     fetched = fba.post_json_api("gql.api.bka.li", "/v1/graphql", json.dumps({
@@ -66,4 +68,4 @@ if len(domains) > 0:
         print(f"INFO: Fetching instances from domain='{domain}' ...")
         fba.fetch_instances(domain, None, None, sys.argv[0])
 
-fba.connection.close()
+fba.shutdown()
index 86e51621afa021410f10ce9bbde5939b2c8645a4..b5a49c4f98814f797b22446506a4e015a1ea8c2f 100755 (executable)
@@ -25,6 +25,8 @@ import re
 import validators
 import fba
 
+fba.lock_process()
+
 fba.cursor.execute(
     "SELECT domain, software, origin, nodeinfo_url FROM instances WHERE software IN ('pleroma', 'mastodon', 'friendica', 'misskey', 'gotosocial', 'bookwyrm', 'takahe') AND (last_blocked IS NULL OR last_blocked < ?) ORDER BY rowid DESC", [time.time() - fba.config["recheck_block"]]
 )
@@ -546,4 +548,4 @@ for blocker, software, origin, nodeinfo_url in rows:
 
     blockdict = []
 
-fba.connection.close()
+fba.shutdown()
index 6745531fa8206338d8a473ec00ea4b6609a1ccd6..7e888e20e5281f6e361f1d2de04d3fff7d913791 100755 (executable)
@@ -22,6 +22,8 @@ import rss_parser
 import sys
 import fba
 
+fba.lock_process()
+
 feed = sys.argv[1]
 
 domains = list()
@@ -61,4 +63,4 @@ if len(domains) > 0:
         print(f"INFO: Fetching instances from domain='{domain}' ...")
         fba.fetch_instances(domain, None, None, sys.argv[0])
 
-fba.connection.close()
+fba.shutdown()
index 5dabad008e02db0f849f11ceb9fa3989593de438..e20bb755b90e9896a6757e64949882a13e907021 100755 (executable)
@@ -24,6 +24,8 @@ import time
 import validators
 import fba
 
+fba.lock_process()
+
 instance = sys.argv[1]
 
 # Initial fetch
@@ -45,4 +47,4 @@ for row in rows:
     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()
+fba.shutdown()