summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-01-24 13:21:01 -0600
committerCraig Jennings <c@cjennings.net>2026-01-24 13:21:01 -0600
commit6011f90328d88a2c449442d6a31fef3614926ec9 (patch)
tree0d278c1a7ca11d232a7293bae5b2b95a0dad1f01 /scripts
parent27595e0dc40c2e8daa78d2f057f6f64dc229adc5 (diff)
fix(archsetup): bug fixes, locale support, and code improvements
Bug fixes: - Initialize errors_encountered at script start (not in intro) - Capture correct exit code in retry_install loop - Add missing error_fatal parameters - Fix unclosed quote in error message - Quote variables in pacman_install/aur_install commands - Standardize done statements (remove trailing semicolons) New features: - Locale selection prompt with 8 common options + custom entry - Auto-derive wireless region from locale - Extract zfs-replicate to separate script file - Make archsetup repo URL configurable - Add MulticastDNS=no to avoid avahi conflict Code improvements: - Single STEPS array for show_status and main execution loop - Document security note for config file sourcing - Add explanatory comment for UFW VM behavior - Silence update-desktop-database warnings Config updates: - Add LOCALE and ARCHSETUP_REPO to example config Also adds Wayland/Hyprland desktop alternative to V2MOM roadmap.
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/zfs-replicate72
1 files changed, 72 insertions, 0 deletions
diff --git a/scripts/zfs-replicate b/scripts/zfs-replicate
new file mode 100755
index 0000000..cf946f1
--- /dev/null
+++ b/scripts/zfs-replicate
@@ -0,0 +1,72 @@
+#!/bin/bash
+# zfs-replicate - Replicate ZFS datasets to TrueNAS
+#
+# Usage:
+# zfs-replicate # Replicate all configured datasets
+# zfs-replicate [dataset] # Replicate specific dataset
+
+set -e
+
+# TrueNAS Configuration
+# Try local network first, fall back to tailscale
+TRUENAS_LOCAL="truenas.local"
+TRUENAS_TAILSCALE="truenas"
+TRUENAS_USER="root"
+TRUENAS_POOL="vault"
+BACKUP_PATH="backups" # TODO: Configure actual path
+
+# Datasets to replicate
+DATASETS="zroot/ROOT/default zroot/home zroot/media zroot/vms"
+
+# Colors
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+RED='\033[0;31m'
+NC='\033[0m'
+
+info() { echo -e "${GREEN}[INFO]${NC} $1"; }
+warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
+error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
+
+command -v syncoid >/dev/null 2>&1 || error "syncoid not found. Install sanoid package."
+
+# Determine which host to use
+determine_host() {
+ if ping -c 1 -W 2 "$TRUENAS_LOCAL" &>/dev/null; then
+ echo "$TRUENAS_LOCAL"
+ elif ping -c 1 -W 2 "$TRUENAS_TAILSCALE" &>/dev/null; then
+ echo "$TRUENAS_TAILSCALE"
+ else
+ error "Cannot reach TrueNAS at $TRUENAS_LOCAL or $TRUENAS_TAILSCALE"
+ fi
+}
+
+TRUENAS_HOST=$(determine_host)
+info "Using TrueNAS host: $TRUENAS_HOST"
+
+# Single dataset mode
+if [[ -n "$1" ]]; then
+ dataset="$1"
+ dest="$TRUENAS_USER@$TRUENAS_HOST:$TRUENAS_POOL/$BACKUP_PATH/${dataset#zroot/}"
+ info "Replicating $dataset -> $dest"
+ syncoid --recursive "$dataset" "$dest"
+ exit 0
+fi
+
+# Full replication
+info "Starting ZFS replication to $TRUENAS_HOST"
+echo ""
+
+for dataset in $DATASETS; do
+ dest="$TRUENAS_USER@$TRUENAS_HOST:$TRUENAS_POOL/$BACKUP_PATH/${dataset#zroot/}"
+ info "Replicating $dataset -> $dest"
+
+ if syncoid --recursive "$dataset" "$dest"; then
+ info " Success"
+ else
+ warn " Failed (will retry next run)"
+ fi
+ echo ""
+done
+
+info "Replication complete."