Assorted shell and Python scripts
1#!/usr/bin/env -S uv run --script
2# /// script
3# dependencies = [
4# "resend",
5# ]
6# ///
7
8import socket
9import subprocess
10from pathlib import Path
11
12import resend
13
14
15def send_email(program: str, log: str):
16 resend.api_key = Path("/usr/local/etc/resend_api_key.txt").read_text().strip("\n")
17
18 match log:
19 case "ok":
20 subj = f"[{socket.getfqdn()}] {program} OK ✅"
21 msg = f"{program} on {socket.getfqdn()} ran successfully!"
22 case "err":
23 subj = f"[{socket.getfqdn()}] {program} Error ❌"
24 msg = f"There was an error running {program} on {socket.getfqdn()}. Please investigate."
25 case _:
26 subj = ""
27 msg = ""
28
29 params: resend.Emails.SendParams = {
30 "from": "Admin <admin@hyperreal.coffee>",
31 "to": ["hyperreal@moonshadow.dev"],
32 "subject": subj,
33 "text": msg,
34 }
35
36 email = resend.Emails.send(params)
37 print(email)
38
39
40def sync_from_remotes(src: str, dest: str):
41 rsync_cmd = ["rsync", "-avz", "--delete", src, dest]
42
43 try:
44 subprocess.run(rsync_cmd, check=True, text=True)
45 print(f"Successful sync from {src} to {dest}")
46 except subprocess.CalledProcessError as e:
47 print(f"Error during sync from {src} to {dest}: {e}")
48 send_email("sync_from_remotes", "err")
49 exit(1)
50
51
52if __name__ == "__main__":
53 remotes = [
54 (
55 "root@hyperreal.lyrebird-marlin.ts.net:/srv/borgbackup/hyperreal/",
56 "/naspool/borgbackup/hyperreal",
57 ),
58 ]
59
60 for remote in remotes:
61 sync_from_remotes(remote[0], remote[1])
62
63 send_email("sync_from_remotes", "ok")