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.
71 lines
2.5 KiB
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)
|
|
|