{ inputs, config, pkgs, ... }: let notify_script = (pkgs.writers.writePython3Bin "telegram-notify.py" { libraries = [ pkgs.python3Packages.python-telegram-bot ]; } '' import telegram import asyncio import sys import subprocess async def run(): text = subprocess.check_output( ["journalctl", "--user", "-u", sys.argv[1], "-b"] ).decode("utf-8") with open("/home/server/mail.log", "a") as f: f.write("===========================================") f.write(text) bot = telegram.Bot(token="381718873:AAElFmI2BDjumCehhWicuksE0vutrPSkoGA") chat_id = 125754925 await bot.send_message( chat_id, "Mallorea encountered an error in the service: " + sys.argv[1] ) await bot.send_message(chat_id, text) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait([loop.create_task(run())])) loop.close() ''); mkTimer = name: cfg: { Install.WantedBy = [ "timers.target" ]; Timer = { Persistent = true; OnCalendar = cfg.when; Unit = "${name}.service"; }; }; mkService = name: cfg: { Unit.Description = name; Unit.OnFailure = "status_notify@%n.service"; Install = { WantedBy = [ "default.target" ]; }; Service = { ExecStart = cfg.script; }; }; scripts = { disk_check = { when = "*-*-* *:00:00"; script = toString (pkgs.writeShellScript "script" '' REPORT_EMAIL=email@thomasave.be ZPOOL_STATUS=$(zpool status -x) if [ "$ZPOOL_STATUS" = "all pools are healthy" ] || [ "$ZPOOL_STATUS" = "no pools available" ] then printf 0 > /var/db/zpool.status else if [ "$(cat /var/db/zpool.status)" -eq 0 ] then zpool status | mail -s "ZPOOL NOT HEALTHY" $REPORT_EMAIL printf 1 > /var/db/zpool.status fi fi ''); }; vdirsyncer = { when = "*:0/15"; script = toString (pkgs.writeShellScript "script" '' ${pkgs.vdirsyncer}/bin/vdirsyncer sync imec/pair ''); }; mbsync = { when = "*-*-* 00:00:00"; script = toString (pkgs.writeShellScript "script" '' BASEDIR=/home/server/Containers/mbsync # python3 $BASEDIR/config/oauth2/mutt_oauth2.py $BASEDIR/data/oauth2/credentials.json docker exec --user "1000:1000" mbsync-container /home/user/.config/mbsync/run.sh -a ${pkgs.notmuch}/bin/notmuch new ''); }; sync_vault = { when = "*-*-* 02:00:00"; script = toString (pkgs.writeShellScript "script" '' source $HOME/.secrets/Backup/env.sh for _ in {1..2}; do OUTPUT=$(echo "$ZFS_PASSPHRASE" | ssh 10.4.0.1 zfs load-key Vault/Thomas/Encrypted 2>&1); if [ "$OUTPUT" == "Key load error: Key already loaded for 'Vault/Thomas/Encrypted'." ]; then echo "Key successfully loaded, starting syncoid" syncoid --no-privilege-elevation --no-sync-snap tank/Storage/Thomas/Workspace 10.4.0.1:Vault/Thomas/Encrypted/Storage/Workspace syncoid --no-privilege-elevation --no-sync-snap tank/Storage/Thomas 10.4.0.1:Vault/Thomas/Encrypted/Storage/T syncoid --no-privilege-elevation --no-sync-snap tank/Storage/Niels 10.4.0.1:Vault/Thomas/Encrypted/Storage/N syncoid --no-privilege-elevation --no-sync-snap tank/Storage/Yolande 10.4.0.1:Vault/Thomas/Encrypted/Storage/Y syncoid --no-privilege-elevation --no-sync-snap tank/Containers 10.4.0.1:Vault/Thomas/Encrypted/Containers ssh 10.4.0.1 zfs unload-key Vault/Thomas/Encrypted ${pkgs.curl}/bin/curl https://uptime.thomasave.be/api/push/s39pIIrB0R exit 0 fi done echo "Found output instead: $OUTPUT" echo "Failed to load key: $OUTPUT" | sendmail exit 1 ''); }; backup = { when = "*-*-* 04:00:00"; script = toString (pkgs.writeShellScript "script" '' ${./scripts/files/backup.sh} ${pkgs.curl}/bin/curl https://uptime.thomasave.be/api/push/R6iJcWqGp0 ''); }; }; in { home.username = "server"; home.homeDirectory = "/home/server"; nix = { package = pkgs.nix; settings.use-xdg-base-directories = true; }; xdg.enable = true; # home.profileDirectory = "${config.xdg.stateHome}/nix/profile"; imports = [ (import ./common.nix { inherit inputs config pkgs; }) ./ssh ]; programs.ssh.matchBlocks."*".identityFile = "/home/server/.secrets/SSH/Mallorea/id_ed25519"; home.sessionVariables = { NIX_PATH = "${config.xdg.stateHome}/nix/profiles/channels/"; LANG = "en_US.UTF-8"; XDG_RUNTIME_DIR = "/run/user/$(id -u)"; }; systemd.user.services = pkgs.lib.mapAttrs mkService scripts // (pkgs.lib.mapAttrs mkService { "status_notify@" = { script = "${notify_script}/bin/telegram-notify.py %i"; }; }); systemd.user.timers = pkgs.lib.mapAttrs mkTimer scripts; # Don't forget to enable these timers! Or reboot, after which it should also be activated automatically # systemctl --user enable --now backup.timer # systemctl --user enable --now sync_vault.timer # systemctl --user enable --now mbsync.timer # systemctl --user enable --now vdirsyncer.timer # systemctl --user enable --now disk_check.timer }