diff options
author | genofire <geno+dev@fireorbit.de> | 2020-06-10 07:22:42 +0200 |
---|---|---|
committer | genofire <geno+dev@fireorbit.de> | 2020-06-10 07:24:35 +0200 |
commit | 38a7b171808c5a1525da5452b338fac0a9bf2c6b (patch) | |
tree | 45f64e59e4d433efb2a4b1d4172e6ad7fe341fee /cleanup.py | |
parent | 893f68497de1ace6abfede0de4f70d11f6801a8b (diff) |
add cleanup.py
Diffstat (limited to 'cleanup.py')
-rwxr-xr-x | cleanup.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/cleanup.py b/cleanup.py new file mode 100755 index 0000000..63947bd --- /dev/null +++ b/cleanup.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import logging +import datetime +from control import EjabberdCtl + + +class EjabberdCleanup(EjabberdCtl): + def __init__(self, url, login, api): + super().__init__(url, login, api) + self.ignore_hosts = [] + self.ignore_usernames = [] + self.dry = False + self.skip_by_roster_roster = True + self.delete_not_login = True + self.offline_since_days = None + + def delete_user(self, host, user, reason=""): + if self.dry: + logging.warning(f"{user}@{host}: dry delete : {reason}") + else: + self.cmd("unregister", {"host": host, "user": user}) + logging.warning(f"{user}@{host}: deleted - {reason}") + + def run_user(self, host, user): + if self.skip_by_roster: + roster = self.cmd("get_roster",{"host": host, "user": user}) + if len(roster) > 0: + logging.debug(f"{user}@{host}: skipped it has a roster") + return + last = self.cmd("get_last",{"host": host, "user": user}) + if self.delete_not_login and last["status"] == "Registered but didn't login": + self.delete_user(host, user, "not login") + return + if self.offline_since_days is not None: + last_stamp = last["timestamp"] + lastdate = None + try: + lastdate = datetime.datetime.strptime(last_stamp,"%Y-%m-%dT%H:%M:%SZ") + except: + try: + lastdate = datetime.datetime.strptime(last_stamp,"%Y-%m-%dT%H:%M:%S.%fZ") + except: + logging.error(f"{user}@{host}: not able to parse '{last_stamp}'") + return + if lastdate != None and lastdate-datetime.datetime.now() > datetime.timedelta(days=self.offline_since_days): + self.delete_user(host, user, f"last seen @ {lastdate}") + return + + + def run(self): + for host in self.fetch_vhosts(): + if host in self.ignore_hosts: + continue + logging.info(f"run cleanup for host: {host}") + for user in self.cmd("registered_users",{"host": host}): + if user in self.ignore_usernames: + continue + self.run_user(host, user) + +if __name__ == "__main__": + import json + from config import Config + + # load config + config = Config() + if config.get('debug', default=False): + logging.getLogger().setLevel(logging.DEBUG) + + # credentials and parameters + url = config.get('url', default='http://localhost:5280/api') + login = config.get('login', default=None) + api = config.get('api', default='rest') + + # init handler + cleaner = EjabberdCleanup(url, login, api) + cleaner.dry = config.get('cleaner_dry',default=False) + cleaner.ignore_hosts = config.get('cleaner_ignore_hosts',default=[]) + cleaner.ignore_usernames = config.get('cleaner_ignore_usernames',default=[]) + cleaner.skip_by_roster = config.get('cleaner_skip_by_roster',default=True) + cleaner.delete_not_login = config.get('cleaner_delete_not_login',default=True) + cleaner.offline_since_days = config.get('cleaner_offline_since_days', default=None) + cleaner.run() |