unify chatmail-fsreport and chatmail-expire to both just require a chatmail.ini file

This commit is contained in:
holger krekel
2025-10-20 13:43:40 +02:00
parent e6a2906e82
commit 8b81d5b5d6
4 changed files with 19 additions and 20 deletions

View File

@@ -121,15 +121,12 @@ class Expiry:
) )
def main(args): def main(args=None):
"""Expire mailboxes and messages according to chatmail config""" """Expire mailboxes and messages according to chatmail config"""
parser = ArgumentParser(description=main.__doc__) parser = ArgumentParser(description=main.__doc__)
parser.add_argument( parser.add_argument(
"chatmail_ini", action="store", help="path pointing to chatmail.ini file" "chatmail_ini", action="store", help="path pointing to chatmail.ini file"
) )
parser.add_argument(
"mailboxes_dir", action="store", help="path to directory of mailboxes"
)
parser.add_argument( parser.add_argument(
"--days", action="store", help="assume date to be days older than now" "--days", action="store", help="assume date to be days older than now"
) )
@@ -153,7 +150,7 @@ def main(args):
action="store_true", action="store_true",
help="actually remove all expired files and dirs", help="actually remove all expired files and dirs",
) )
args = parser.parse_args([str(x) for x in args]) args = parser.parse_args(args)
config = read_config(args.chatmail_ini) config = read_config(args.chatmail_ini)
now = datetime.utcnow().timestamp() now = datetime.utcnow().timestamp()
@@ -162,7 +159,7 @@ def main(args):
maxnum = int(args.maxnum) if args.maxnum else None maxnum = int(args.maxnum) if args.maxnum else None
exp = Expiry(config, dry=not args.remove, now=now, verbose=args.verbose) exp = Expiry(config, dry=not args.remove, now=now, verbose=args.verbose)
for mailbox in iter_mailboxes(os.path.abspath(args.mailboxes_dir), maxnum=maxnum): for mailbox in iter_mailboxes(str(config.mailboxes_dir), maxnum=maxnum):
exp.process_mailbox_stat(mailbox) exp.process_mailbox_stat(mailbox)
print(exp.get_summary()) print(exp.get_summary())

View File

@@ -3,15 +3,15 @@ command line tool to analyze mailbox message storage
example invocation: example invocation:
python -m chatmaild.fsreport /home/vmail/mail/example.org python -m chatmaild.fsreport /path/to/chatmail.ini
to show storage summaries for all "cur" folders to show storage summaries for all "cur" folders
python -m chatmaild.fsreport /home/vmail/mail/example.org --mdir cur python -m chatmaild.fsreport /path/to/chatmail.ini --mdir cur
to show storage summaries only for first 1000 mailboxes to show storage summaries only for first 1000 mailboxes
python -m chatmaild.fsreport /home/vmail/mail/example.org --maxnum 1000 python -m chatmaild.fsreport /path/to/chatmail.ini --maxnum 1000
""" """
@@ -19,6 +19,7 @@ import os
from argparse import ArgumentParser from argparse import ArgumentParser
from datetime import datetime from datetime import datetime
from chatmaild.config import read_config
from chatmaild.expire import iter_mailboxes from chatmaild.expire import iter_mailboxes
DAYSECONDS = 24 * 60 * 60 DAYSECONDS = 24 * 60 * 60
@@ -125,7 +126,7 @@ def main(args=None):
"""Report about filesystem storage usage of all mailboxes and messages""" """Report about filesystem storage usage of all mailboxes and messages"""
parser = ArgumentParser(description=main.__doc__) parser = ArgumentParser(description=main.__doc__)
parser.add_argument( parser.add_argument(
"mailboxes_dir", action="store", help="path to directory of mailboxes" "chatmail_ini", action="store", help="path pointing to chatmail.ini file"
) )
parser.add_argument( parser.add_argument(
"--days", "--days",
@@ -155,13 +156,15 @@ def main(args=None):
args = parser.parse_args(args) args = parser.parse_args(args)
config = read_config(args.chatmail_ini)
now = datetime.utcnow().timestamp() now = datetime.utcnow().timestamp()
if args.days: if args.days:
now = now - 86400 * int(args.days) now = now - 86400 * int(args.days)
maxnum = int(args.maxnum) if args.maxnum else None maxnum = int(args.maxnum) if args.maxnum else None
rep = Report(now=now, min_login_age=int(args.min_login_age), mdir=args.mdir) rep = Report(now=now, min_login_age=int(args.min_login_age), mdir=args.mdir)
for mbox in iter_mailboxes(os.path.abspath(args.mailboxes_dir), maxnum=maxnum): for mbox in iter_mailboxes(str(config.mailboxes_dir), maxnum=maxnum):
rep.process_mailbox_stat(mbox) rep.process_mailbox_stat(mbox)
rep.dump_summary() rep.dump_summary()

View File

@@ -49,7 +49,6 @@ def test_delete_inactive_users(example_config):
args=[ args=[
"--remove", "--remove",
str(example_config._inipath), str(example_config._inipath),
str(example_config.mailboxes_dir),
] ]
) )

View File

@@ -11,9 +11,8 @@ from chatmaild.expire import main as expiry_main
from chatmaild.fsreport import main as report_main from chatmaild.fsreport import main as report_main
@pytest.fixture def fill_mbox(basedir):
def basedir1(tmp_path): basedir1 = basedir.joinpath("mailbox1@example.org")
basedir1 = tmp_path.joinpath("mailbox1@example.org")
basedir1.mkdir() basedir1.mkdir()
password = basedir1.joinpath("password") password = basedir1.joinpath("password")
password.write_text("xxx") password.write_text("xxx")
@@ -39,7 +38,8 @@ def create_new_messages(basedir, relpaths, size=1000, days=0):
@pytest.fixture @pytest.fixture
def mbox1(basedir1): def mbox1(example_config):
basedir1 = fill_mbox(example_config.mailboxes_dir)
return MailboxStat(basedir1) return MailboxStat(basedir1)
@@ -73,8 +73,8 @@ def test_stats_mailbox(mbox1):
assert mbox3.last_login is None assert mbox3.last_login is None
def test_report(mbox1): def test_report(mbox1, example_config):
args = (str(Path(mbox1.basedir).parent),) args = (str(example_config._inipath),)
report_main(args) report_main(args)
args = list(args) + "--days 1".split() args = list(args) + "--days 1".split()
report_main(args) report_main(args)
@@ -85,7 +85,7 @@ def test_report(mbox1):
def test_expiry_cli_basic(example_config, mbox1): def test_expiry_cli_basic(example_config, mbox1):
args = example_config._inipath, Path(mbox1.basedir).parent args = (example_config._inipath,)
expiry_main(args) expiry_main(args)
@@ -102,7 +102,7 @@ def test_expiry_cli_old_files(capsys, example_config, mbox1):
create_new_messages(mbox1.basedir, ["cur/shouldstay"], size=1000 * 300, days=1) create_new_messages(mbox1.basedir, ["cur/shouldstay"], size=1000 * 300, days=1)
args = example_config._inipath, Path(mbox1.basedir).parent, "--remove", "-v" args = str(example_config._inipath), "--remove", "-v"
expiry_main(args) expiry_main(args)
out, err = capsys.readouterr() out, err = capsys.readouterr()