瀏覽代碼

contrib: Add script for periodic purging of weechat logs.

parazyd 3 年之前
父節點
當前提交
39d47cc35b
共有 1 個文件被更改,包括 71 次插入0 次删除
  1. 71 0
      contrib/privacy/purge_weechat_logs.py

+ 71 - 0
contrib/privacy/purge_weechat_logs.py

@@ -0,0 +1,71 @@
+#!/usr/bin/env python3
+#
+# This script is supposed to be executed with cron
+# (https://en.wikipedia.org/wiki/Cron)
+#
+# This script also assumes that your weechat logfile mask is:
+# /set logger.mask.irc "irc/$server/%Y-%m/%d-$channel.weechatlog"
+#
+# Once you're set up, remember to change dryrun=True to False to
+# actually make the script remove files.
+import os
+import re
+import sys
+from datetime import datetime, timedelta
+from os.path import join, isfile
+
+# Full path to your weechat IRC log directory
+LOG_BASE = "/home/user/.local/share/weechat/logs/irc"
+pattern = re.compile(r'(\d{4}-\d{2})/(\d{2})-(.+).weechatlog$')
+
+# Delete logs older than this many days
+# In your crontab, you can set it to run every day at 2pm:
+# 0 14 * * * /usr/bin/python3 /full/path/to/this/script.py
+PURGE_END = datetime.now() - timedelta(days=7)
+
+# Map of "server": ["#channel0", "#channel1", "user"] to purge.
+PURGE_MAP = {
+    "darkfi": ["#dev", "#math", "god"],
+    "libera": ["##rust"],
+}
+
+
+def main(dryrun=True):
+    to_delete = []
+
+    for server, channels in PURGE_MAP.items():
+        for dirpath, _dirnames, filenames in os.walk(join(LOG_BASE, server)):
+            for filename in filenames:
+                full_path = join(dirpath, filename)
+
+                match = pattern.search(full_path)
+                if match:
+                    date_str = "-".join(match.groups()[:-1])
+                    channel = match.groups()[-1]
+
+                    if channel not in channels:
+                        continue
+
+                    file_date = datetime.strptime(date_str, "%Y-%m-%d")
+
+                    if file_date < PURGE_END:
+                        to_delete.append(full_path)
+
+    if dryrun:
+        for fname in to_delete:
+            print(f"[DRYRUN] Deleting: {fname}")
+        return 0
+
+    for fname in to_delete:
+        if isfile(fname):
+            try:
+                os.remove(fname)
+            except:
+                print(f"[WARNING] Failed to remove {fname}")
+                continue
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())