diff options
| author | alex <alex@pdp7.net> | 2025-09-07 15:51:09 +0000 |
|---|---|---|
| committer | alexpdp7 <alex@corcoles.net> | 2025-09-07 19:48:23 +0200 |
| commit | ad8667c28db6ea061c3787e9a39cbb6ce41e4bdf (patch) | |
| tree | f160a38aab391a688c5e5e039c91c2a510132371 /scripts/p7s/mail/__init__.py | |
| parent | 7eae7d5d055526affb0f94476a464a62d73dd265 (diff) | |
Add setup-imapfilter
Diffstat (limited to 'scripts/p7s/mail/__init__.py')
| -rw-r--r-- | scripts/p7s/mail/__init__.py | 105 |
1 files changed, 73 insertions, 32 deletions
diff --git a/scripts/p7s/mail/__init__.py b/scripts/p7s/mail/__init__.py index 71675c70..e663d65c 100644 --- a/scripts/p7s/mail/__init__.py +++ b/scripts/p7s/mail/__init__.py @@ -1,14 +1,20 @@ import pathlib -import subprocess -import textwrap +from p7s import assert_single +from p7s import multiline_string as _ from p7s import bitwarden +from p7s.mail import imapfilter from p7s.mail import mbsync +from p7s import systemd + + +MOM = "5c4d9e3b-121d-45f5-bab6-03b42d291326" +GMAIL = "f9bba940-769d-430a-82f4-5da10990e8fd" def setup_mbsync(): - gmail = bitwarden.get_item("https://vaultwarden.pdp7.net", "alex@corcoles.net", "f9bba940-769d-430a-82f4-5da10990e8fd")["login"] - yahoo = bitwarden.get_item("https://vaultwarden.pdp7.net", "alex@corcoles.net", "5c4d9e3b-121d-45f5-bab6-03b42d291326")["login"] + gmail = bitwarden.get_item("https://vaultwarden.pdp7.net", "alex@corcoles.net", GMAIL)["login"] + yahoo = bitwarden.get_item("https://vaultwarden.pdp7.net", "alex@corcoles.net", MOM)["login"] (pathlib.Path.home() / (".mbsyncrc")).write_text( mbsync.mbsync_gmail(gmail["username"], gmail["password"], "~/Mail") + "\n" + @@ -18,31 +24,66 @@ def setup_mbsync(): for username in [gmail["username"], yahoo["username"]]: (pathlib.Path.home() / "Mail" / username).mkdir(exist_ok=True, parents=True) - user_units = pathlib.Path.home() / ".config" / "systemd" / "user" - user_units.mkdir(exist_ok=True, parents=True) - (user_units / "mbsync.service").write_text(textwrap.dedent(""" - [Unit] - Description=Mail synchronization - - [Service] - Type=oneshot - ExecStart=/usr/bin/touch /home/alex/Mail/.lock ; /usr/bin/mbsync -qa ; /usr/bin/rm -f /home/alex/Mail/.lock - """).lstrip()) - - (user_units / "mbsync.timer").write_text(textwrap.dedent(""" - [Unit] - Description=Mail synchronization - - [Install] - WantedBy=timers.target - - [Timer] - OnBootSec=1m - OnActiveSec=0s - OnUnitInactiveSec=30s - Unit=mbsync.service - """).lstrip()) - - subprocess.run(["systemctl", "--user", "daemon-reload"], check=True) - subprocess.run(["systemctl", "--user", "enable", "--now", "mbsync.timer"], check=True) - subprocess.run(["sudo", "loginctl", "enable-linger", "alex"], check=True) + systemd.create_user_unit("mbsync.service", _(""" + [Unit] + Description=Mail synchronization + + [Service] + Type=oneshot + ExecStart=/usr/bin/touch /home/alex/Mail/.lock ; /usr/bin/mbsync -qa ; /usr/bin/rm -f /home/alex/Mail/.lock + """)) + + systemd.create_user_unit("mbsync.timer", _(""" + [Unit] + Description=Mail synchronization + + [Install] + WantedBy=timers.target + + [Timer] + OnBootSec=1m + OnActiveSec=0s + OnUnitInactiveSec=30s + Unit=mbsync.service + """)) + + systemd.reload() + systemd.enable_now("mbsync.timer") + systemd.enable_linger() + + +def setup_imapfilter(): + create_forward( + "mom_to_gmail", + _bitwarden_item_to_imapfilterserver("mom", bitwarden.get_item("https://vaultwarden.pdp7.net", "alex@corcoles.net", MOM)), + _bitwarden_item_to_imapfilterserver("gmail", bitwarden.get_item("https://vaultwarden.pdp7.net", "alex@corcoles.net", GMAIL)), + ) + + +def _bitwarden_item_to_imapfilterserver(name, i): + return imapfilter.ImapServer( + name=name, + server=assert_single([f for f in i["fields"] if f["name"] == "imap_server"])["value"], + username=i["login"]["username"], + password=i["login"]["password"], + ) + + +def create_forward(name, from_server, to_server): + config = pathlib.Path.home() / ".imapfilter" / f"{name}.lua" + config.write_text( + imapfilter.Sync(from_server=from_server, to_server=to_server).lua() + ) + + unit = f"imapfilter-{name}.service" + systemd.create_user_unit(unit, _(f""" + [Service] + ExecStart=/usr/bin/imapfilter -c {config} -v + + [Install] + WantedBy=default.target + """)) + + systemd.reload() + systemd.enable_now(unit) + systemd.enable_linger() |
