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")