A first run migration tool
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
firstrunmigrate/scripts/users_groups_quotas_export.py

71 lines
2.5 KiB

from json import loads, dump
from subprocess import run, PIPE
from argparse import ArgumentParser
from pathlib import Path
from datetime import datetime, timedelta, timezone
from re import compile as re_compile
def main(path : str, php :str, days: int, output_groups : str, output_quotas : str,
exclude_group: str):
output_groups = Path(output_groups)
output_quotas = Path(output_quotas)
if days != 0:
last_seen_limit = datetime.now(timezone.utc)\
.replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(days=days)
else:
last_seen_limit = None
if exclude_group:
exclude_group = re_compile(exclude_group)
users = {}
offset = 0
while True:
out = run([php, "occ", "user:list", "--info", "--offset", str(offset), "--output", "json"],
cwd=path, check=True, stdout=PIPE, stderr=PIPE)
new_users = loads(out.stdout.decode().strip())
if not new_users:
break
users.update(new_users)
offset = len(users)
print(f"Got {offset} users")
users = {k: v for k, v in users.items() if v["email"]}
print(f"Got {len(users)} email filtered users")
if last_seen_limit:
users = {k: v for k, v in users.items()
if datetime.fromisoformat(v["last_seen"]) >= last_seen_limit}
print(f"Got {len(users)} time filtered users")
if exclude_group:
for user in users:
users[user]["groups"] = list(filter(lambda g: not exclude_group.findall(g),
users[user]["groups"]))
print("Groups filtered")
with output_groups.open("w", encoding="UTF-8") as file:
dump({v["email"]: v["groups"] for (k, v) in users.items()}, file)
with output_quotas.open("w", encoding="UTF-8") as file:
dump({v["email"]: v["quota"] for (k, v) in users.items()}, file)
if __name__ == '__main__':
parser = ArgumentParser(prog="users_groups_quotas_export")
parser.add_argument("--path", "-p", default="/var/www/nextcloud")
parser.add_argument("--php", "-P", default="php7.4")
parser.add_argument("--output-groups", "-g", default="groups.json")
parser.add_argument("--output-quotas", "-q", default="quotas.json")
parser.add_argument("--days", "-d", type=int, default="0")
parser.add_argument("--exclude-group", "-e", default=None)
args = parser.parse_args()
main(args.path, args.php, args.days, args.output_groups, args.output_quotas, args.exclude_group)