diff --git a/.gitignore b/.gitignore index 1ae03bd..2bc2328 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .zcompdump* mpv/watch_later .luarc.json +zsh/secrets.sh diff --git a/nvim/spell/ltex.dictionary.en-GB.txt b/nvim/spell/ltex.dictionary.en-GB.txt index 3e91a9f..e6e0c55 100644 --- a/nvim/spell/ltex.dictionary.en-GB.txt +++ b/nvim/spell/ltex.dictionary.en-GB.txt @@ -12,3 +12,4 @@ PointNav DomainNet MiniGrid Spirelli +distill diff --git a/scripts/backup.sh b/scripts/backup.sh new file mode 100755 index 0000000..44cc526 --- /dev/null +++ b/scripts/backup.sh @@ -0,0 +1,189 @@ +#!/bin/bash + +########################################## +# Tokens # +########################################## + +set -o pipefail +source "$XDG_CONFIG_HOME"/zsh/secrets.sh +export XDG_RUNTIME_DIR=/run/user/1000 + +########################################## +# Create sqlite3 backup for Vaultwarden # +########################################## + +rm /home/server/Containers/pw.thomasave.be/data/backup.sqlite3 /home/server/Containers/robbertave.com/data/backup.sqlite3 +sqlite3 /home/server/Containers/pw.thomasave.be/data/db.sqlite3 "VACUUM INTO '/home/server/Containers/pw.thomasave.be/data/backup.sqlite3'" +sqlite3 /home/server/Containers/robbertave.com/data/database.sqlite "VACUUM INTO '/home/server/Containers/robbertave.com/data/backup.sqlite3'" + +########################################## +# Unlock the Vault # +########################################## + +echo "$ZFS_PASSPHRASE" | ssh vault /home/server/Storage/Thomas/Scripts/Mount/borg_unlock.sh + +########################################## +# Run the backups # +########################################## + +echo -e '\n\n\n' +echo "Running Caddy Backups" +borg create -s --progress \ + --exclude /home/server/Containers/Caddy/Data\ + 10.4.0.1:Storage/Thomas/Borg/Containers/caddy::'{hostname}-{now}' \ + /home/server/Containers/Caddy\ + +echo -e '\n\n\n' +echo "Running git.thomasave.be Backups" +borg create -s --progress \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/sessions \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/jwt \ + --exclude /home/server/Containers/git.thomasave.be/gitea/ssh \ + 10.4.0.1:Storage/Thomas/Borg/Containers/git.thomasave.be::'{hostname}-{now}' \ + /home/server/Containers/git.thomasave.be + +echo -e '\n\n\n' +echo "Running pw.thomasave.be Backups" +borg create -s --progress \ + --exclude /home/server/Containers/pw.thomasave.be/data/icon_cache \ + --exclude /home/server/Containers/pw.thomasave.be/data/sends \ + 10.4.0.1:Storage/Thomas/Borg/Containers/pw.thomasave.be::'{hostname}-{now}' \ + /home/server/Containers/pw.thomasave.be + +echo -e '\n\n\n' +echo "Running stats.thomasave.be Backups" +borg create -s --progress \ + --exclude /home/server/Containers/stats.thomasave.be/logs \ + 10.4.0.1:Storage/Thomas/Borg/Containers/stats.thomasave.be::'{hostname}-{now}' \ + /home/server/Containers/stats.thomasave.be + +echo -e '\n\n\n' +echo "Running robbertave.com Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Containers/robbertave.com::'{hostname}-{now}' \ + /home/server/Containers/robbertave.com + +echo -e '\n\n\n' +echo "Running DNS Backups" +borg create -s --progress \ + --exclude /home/server/Containers/adguard.thomasave.be/work \ + 10.4.0.1:Storage/Thomas/Borg/Adguard::'{hostname}-{now}' \ + /home/server/Containers/adguard.thomasave.be + +echo -e '\n\n\n' +echo "Running Workspace Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Workspace::'{hostname}-{now}' \ + /home/server/Workspace/ +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly -1 --save-space 10.4.0.1:Storage/Thomas/Borg/Workspace +borg compact 10.4.0.1:Storage/Thomas/Borg/Workspace + +echo -e '\n\n\n' +echo "Running photos.thomasave.be Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Containers/photos.thomasave.be::'{hostname}-{now}' \ + /home/server/Containers/photos.thomasave.be +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly -1 --save-space 10.4.0.1:Storage/Thomas/Borg/Containers/photos.thomasave.be +borg compact 10.4.0.1:Storage/Thomas/Borg/Containers/photos.thomasave.be + + +echo -e '\n\n\n' +echo "Running Authentik Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Containers/auth.thomasave.be::'{now:%Y-%m-%d}' \ + /home/server/Containers/auth.thomasave.be + + +echo -e '\n\n\n' +echo "Running Yolande Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Yolande::'{hostname}-{now}' \ + /home/server/Storage/Yolande +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly -1 --save-space 10.4.0.1:Storage/Thomas/Borg/Yolande +borg compact 10.4.0.1:Storage/Thomas/Borg/Yolande + + +echo -e '\n\n\n' +echo "Running Thomas Backups" +borg create -s --progress \ + 10.4.0.1:Storage/Thomas/Borg/Thomas::'{hostname}-{now}' \ + /home/server/Storage/Thomas/Documents \ + /home/server/Storage/Thomas/Pictures \ + /home/server/Storage/Thomas/Videos \ + /home/server/Storage/Thomas/Crypt +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly -1 --save-space 10.4.0.1:Storage/Thomas/Borg/Thomas +borg compact 10.4.0.1:Storage/Thomas/Borg/Thomas + + +echo -e '\n\n\n' +echo "Running Niels Backups" +borg create -s --progress \ + --exclude /home/server/Storage/Niels/Backups \ + 10.4.0.1:Storage/Thomas/Borg/Niels::'{now:%Y-%m-%d}' \ + /home/server/Storage/Niels/ +borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --save-space 10.4.0.1:Storage/Thomas/Borg/Niels +borg compact 10.4.0.1:Storage/Thomas/Borg/Niels + + +# echo -e '\n\n\n' +# echo "Running Experiment Backups" +# borg create -s --progress \ +# 10.4.0.1:Storage/Thomas/Borg/Containers/exp.thomasave.be::'{hostname}-{now}' \ +# /home/server/Workspace/Experiments/Backend/data/ + +########################################## +# Perpare Cloud Backup # +########################################## + +echo -e '\n\n\n' +echo "Peparing cloud backup" + +borg create -s --progress \ + --exclude /home/server/Containers/pw.thomasave.be/data/icon_cache \ + --exclude /home/server/Containers/pw.thomasave.be/data/sends \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/sessions \ + --exclude /home/server/Containers/git.thomasave.be/gitea/ssh \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/jwt \ + --exclude /home/server/Containers/Caddy/Data\ + 10.4.0.1:Storage/Thomas/Borg/Cloud::'{hostname}-{now}' \ + /home/server/Containers/pw.thomasave.be\ + /home/server/Containers/robbertave.com\ + /home/server/Containers/auth.thomasave.be\ + /home/server/Containers/git.thomasave.be\ + /home/server/Containers/Boaty \ + /home/server/Containers/Caddy \ + +borg prune -d 365 --save-space 10.4.0.1:Storage/Thomas/Borg/Cloud +borg compact 10.4.0.1:Storage/Thomas/Borg/Cloud +ssh vault /home/server/Storage/Thomas/Borg/Sync.sh + +########################################## +# Lock the Vault # +########################################## + +ssh vault /home/server/Storage/Thomas/Scripts/Mount/borg_lock.sh + +########################################## +# Backups to Oracle Cloud # +########################################## + +echo "Running Oracle Cloud Backup, containing Vaultwarden, robbertave.com, git.thomasave.be, Boaty, Stats, Caddy, and Niels." + +borg create -s --progress \ + --exclude /home/server/Containers/pw.thomasave.be/data/icon_cache \ + --exclude /home/server/Containers/pw.thomasave.be/data/sends \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/sessions \ + --exclude /home/server/Containers/git.thomasave.be/gitea/ssh \ + --exclude /home/server/Containers/git.thomasave.be/gitea/gitea/jwt \ + --exclude /home/server/Containers/stats.thomasave.be/logs \ + --exclude /home/server/Containers/Caddy/Data\ + --exclude /home/server/Storage/Niels/Backups \ + ubuntu@10.0.0.6:~/Backups/Borg::'{hostname}-{now}' \ + /home/server/Containers/pw.thomasave.be\ + /home/server/Containers/robbertave.com\ + /home/server/Containers/git.thomasave.be\ + /home/server/Containers/auth.thomasave.be\ + /home/server/Containers/Boaty \ + /home/server/Containers/Caddy \ + /home/server/Containers/stats.thomasave.be \ + /home/server/Storage/Niels \ diff --git a/scripts/sendmail b/scripts/sendmail new file mode 100755 index 0000000..cc83c6e --- /dev/null +++ b/scripts/sendmail @@ -0,0 +1,2 @@ +#!/bin/sh +tee -a /home/server/mail.log | /usr/sbin/sendmailtelegram diff --git a/scripts/sendmailtelegram b/scripts/sendmailtelegram new file mode 100755 index 0000000..4ea0236 --- /dev/null +++ b/scripts/sendmailtelegram @@ -0,0 +1,18 @@ +#!/usr/bin/python3 +import telegram +import fileinput +import asyncio + +async def run(): + text = "Vault Etienne:\n\n" + for line in fileinput.input(): + text += line + + bot = telegram.Bot(token="381718873:AAElFmI2BDjumCehhWicuksE0vutrPSkoGA") + chat_id = 125754925 + 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() diff --git a/scripts/sync_vault.sh b/scripts/sync_vault.sh new file mode 100755 index 0000000..0d02061 --- /dev/null +++ b/scripts/sync_vault.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +source "$XDG_CONFIG_HOME"/zsh/secrets.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 + exit 0 + fi +done + +echo "Found output instead: $OUTPUT" +echo "Failed to load key: $OUTPUT" | sendmail +exit 1 diff --git a/zsh/.zshrc b/zsh/.zshrc index fd8ac90..61a3592 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -87,36 +87,72 @@ function zvm_after_init() { source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh fi - # Use FZY instead of FZF for ctrl-t - function find_files() { - zle -I - PATHS="" - if [ -d ~/.dotfiles ]; then - PATHS="$PATHS\n$(fd . ~/.dotfiles -t d -d 1)" + function cd_to() { + setopt localoptions pipefail no_aliases 2> /dev/null + local dir=$1 + if [[ -z "$dir" ]]; then + zle redisplay + return 0 fi - if [ -d ~/Workspace ]; then - PATHS="$PATHS\n$(ssh mallorea fdfind . ~/Workspace -t d -d 8)" - fi - if [ -d ~/Containers ]; then - PATHS="$PATHS\n$(fd . ~/Containers -t d -d 2)" - fi - if [ -d ~/Storage/Shared ]; then - PATHS="$PATHS\n~/Storage/Shared" - PATHS="$PATHS\n$(fd . ~/Storage/Shared -t d -d 2)" - fi - if [ -d ~/Storage/Thomas ]; then - PATHS="$PATHS\n~/Storage/Thomas" - PATHS="$PATHS\n$(fd . ~/Storage/Thomas -t d -d 1)" - fi - BUFFER=cd "$(echo $PATHS | fzy -l 20)" + zle push-line # Clear buffer. Auto-restored on next prompt. + cd $dir zle accept-line - clear + local ret=$? + unset dir # ensure this doesn't end up appearing in prompt expansion + zle reset-prompt } - zle -N find_files - bindkey "^T" find_files - bindkey -M emacs "^T" find_files - bindkey -M vicmd "^T" find_files - bindkey -M viins "^T" find_files + + # Use FZY instead of FZF for ctrl-t + function find_global_files() { + zle -I + FZY_CACHE=~/.cache/fzy_paths + if [ -f $FZY_CACHE ]; then + # Check if cache is older than 1 day + if [ $(($(date +%s) - $(date -r $FZY_CACHE +%s))) -gt 86400 ]; then + rm $FZY_CACHE + fi + fi + if [ ! -f $FZY_CACHE ]; then + PATHS="" + if [ -d ~/.dotfiles ]; then + PATHS="$PATHS\n$(fd . ~/.dotfiles -t d -d 2)" + fi + if [ -d ~/Workspace ]; then + PATHS="$PATHS\n$(ssh mallorea fdfind . ~/Workspace -t d -d 8)" + fi + if [ -d ~/Containers ]; then + PATHS="$PATHS\n$(fd . ~/Containers -t d -d 2)" + fi + if [ -d ~/Storage/Shared ]; then + PATHS="$PATHS\n/home/server/Storage/Shared" + PATHS="$PATHS\n$(fd . ~/Storage/Shared -t d -d 2)" + fi + if [ -d ~/Storage/Thomas ]; then + PATHS="$PATHS\n/home/server/Storage/Thomas" + PATHS="$PATHS\n$(fd . ~/Storage/Thomas -t d -d 5)" + fi + echo -e $PATHS > $FZY_CACHE + fi + cd_to "$(cat $FZY_CACHE | fzy -l 20)" + } + + function find_local_files() { + zle -I + cd_to "$(fd . -t d | fzy -l 20)" + } + + zle -N find_global_files + zle -N find_local_files + + bindkey "^T" find_global_files + bindkey -M emacs "^T" find_global_files + bindkey -M vicmd "^T" find_global_files + bindkey -M viins "^T" find_global_files + + bindkey "^Y" find_local_files + bindkey -M emacs "^Y" find_local_files + bindkey -M vicmd "^Y" find_local_files + bindkey -M viins "^Y" find_local_files } zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*' diff --git a/zsh/zsh-vi-mode b/zsh/zsh-vi-mode index 1f28e18..7cf6fd1 160000 --- a/zsh/zsh-vi-mode +++ b/zsh/zsh-vi-mode @@ -1 +1 @@ -Subproject commit 1f28e1886dc8e49f41b817634d5c7695b6abb145 +Subproject commit 7cf6fd19cf2ab38ec5b116eced158377cb3c35f6