Files
dotfiles/dot_local/bin/executable_backup-menu

88 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# backup-menu — interactive resticprofile menu
set -euo pipefail
PROFILES=(dotfiles projects vaults files pictures)
STATE_FILE="${XDG_STATE_HOME:-$HOME/.local/state}/backup-last-run"
_profile_label() {
local profile=$1
local last
last=$(resticprofile -n "$profile" snapshots --json 2>/dev/null \
| python3 -c "
import sys, json
try:
snaps = json.load(sys.stdin)
if snaps:
t = snaps[-1]['time'][:16].replace('T', ' ')
print(f'last: {t}')
else:
print('no snapshots')
except:
print('?')
" 2>/dev/null || echo "?")
printf "%-16s %s" "$profile" "$last"
}
_run_backup() {
local profile=$1
echo "▶ resticprofile -n $profile backup"
resticprofile -n "$profile" backup
mkdir -p "$(dirname "$STATE_FILE")"
date +%s > "$STATE_FILE"
}
_run_forget() {
local profile=$1
echo "▶ resticprofile -n $profile forget"
resticprofile -n "$profile" forget
}
_show_snapshots() {
local profile=$1
resticprofile -n "$profile" snapshots 2>&1 | less
}
_run_all() {
for p in "${PROFILES[@]}"; do
_run_backup "$p"
done
}
main() {
if [[ "${1:-}" == "--all" ]]; then
_run_all
return
fi
if ! command -v fzf &>/dev/null; then
echo "fzf not found"
exit 1
fi
local lines=()
for p in "${PROFILES[@]}"; do
lines+=("$(_profile_label "$p")")
done
local selected
selected=$(printf '%s\n' "${lines[@]}" | fzf \
--prompt "backup > " \
--header "Enter — запустить бэкап | Ctrl-F — forget | Ctrl-S — снапшоты" \
--bind "ctrl-f:become(echo '__forget__'$(echo {} | awk '{print $1}'))" \
--bind "ctrl-s:become(echo '__snaps__'$(echo {} | awk '{print $1}'))" \
--no-sort) || exit 0
local profile
profile=$(echo "$selected" | awk '{print $1}')
case "$selected" in
__forget__*) _run_forget "${selected#__forget__}" ;;
__snaps__*) _show_snapshots "${selected#__snaps__}" ;;
*) _run_backup "$profile" ;;
esac
}
main "$@"