From 033f9e6135a259b6e0ded663ec4440872ec871ff Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Thu, 19 Jun 2025 23:02:42 +0200 Subject: [PATCH] Improve borgplom. --- .../desktop/home/plom/.local/bin/borgplom | 123 +++++++++++------- testing/scripts/_setup_secrets_user.sh | 1 - 2 files changed, 75 insertions(+), 49 deletions(-) diff --git a/testing/copy/desktop/home/plom/.local/bin/borgplom b/testing/copy/desktop/home/plom/.local/bin/borgplom index e3db0cca..b0fc653 100755 --- a/testing/copy/desktop/home/plom/.local/bin/borgplom +++ b/testing/copy/desktop/home/plom/.local/bin/borgplom @@ -15,10 +15,30 @@ USAGE_LINES='COMMAND [ARGUMENT]...' PATH_BORG_CONF_SECURITY="${PATH_BORG_CONF}/security" PATH_BORG_CONF_KEYS="${PATH_BORG_CONF}/keys" + +NAME_ARCHIVE_ORG=orgdir + location_from_servername() { printf 'ssh://borg@%s/./borgrepo' "$1"; } servername_from_location() { echo "$1" | cut -d'/' -f3 | cut -d'@' -f2; } path_repo_location() { printf '%s' "${PATH_BORG_CONF_SECURITY}/${1}/location"; } +explore_key_id() { + local KEY_ID=$1 + local PATH_LOC="$(path_repo_location ${KEY_ID})" + if [ ! -f "${PATH_LOC}" ]; then + printf '?' + return + fi + local LOCATION=$(cat "${PATH_LOC}") + local NAME_SERVER=$(servername_from_location "${LOCATION}") + if [ "${LOCATION}" = $(location_from_servername "${NAME_SERVER}") ]; then + local PREFIX='+' + else + local PREFIX='-' + fi + printf '%s %s %s' "${PREFIX} ${NAME_SERVER} ${LOCATION}" +} + # exits export BORG_EXIT_CODES=modern error_exit() { abort "Aborting due to $1"; } @@ -49,23 +69,23 @@ USAGE_ARGS_backup_keys='PATH' USAGE_DESC_backup_keys="copy known keys to PATH/, with their repos' server names as filenames" CMDFNC_backup_keys() { expect_n_args 1 1 "${USAGE_ARGS_backup_keys}" $@ - _PATH_TARGET_DIR=$(realpath "$1") - if [ -e "${_PATH_TARGET_DIR}" ] && [ ! -d "${_PATH_TARGET_DIR}" ]; then - error_exit "non-directory at ${_PATH_TARGET_DIR}" + local PATH_TARGET_DIR=$(realpath "$1") + if [ -e "${PATH_TARGET_DIR}" ] && [ ! -d "${PATH_TARGET_DIR}" ]; then + error_exit "non-directory at ${PATH_TARGET_DIR}" fi - mkdir -p "${_PATH_TARGET_DIR}" + mkdir -p "${PATH_TARGET_DIR}" cd "${PATH_BORG_CONF_KEYS}" ls -1 | while read _FILENAME; do - _KEY_ID=$(_id_from_file "${_FILENAME}") - _PATH_LOC="$(path_repo_location ${_KEY_ID})" - if [ ! -f "${_PATH_LOC}" ]; then - echo "Ignoring ${_FILENAME} due to lack of matching location file." - continue + local KEY_DATA=$(explore_key_id "${KEY_ID}") + local PREFIX=$(echo "${KEY_DATA}" | cut -d' ' -f1) + if [ "${PREFIX}" = '-' ]; then + echo "Ignoring ${KEY_ID}, location doesn't match expected patten." + continue fi - _NAME_SERVER=$(servername_from_location "$(cat ${_PATH_LOC})") - _PATH_TARGET="${_PATH_TARGET_DIR}/${_NAME_SERVER}" - echo "Copying ${_FILENAME} to ${_PATH_TARGET} …" - cp "${_FILENAME}" "${_PATH_TARGET}" + local NAME_SERVER=$(echo "${KEY_DATA}" | cut -d' ' -f2) + local PATH_TARGET="${PATH_TARGET_DIR}/${NAME_SERVER}" + echo "Copying ${_FILENAME} to ${PATH_TARGET} …" + cp "${_FILENAME}" "${PATH_TARGET}" done cd - > /dev/null } @@ -137,70 +157,77 @@ USAGE_DESC_keys='list known repos in ID, key filename, and alleged location' CMDFNC_keys() { expect_n_args 0 0 '' $@ echo "Known keys, as per ${PATH_BORG_CONF_KEYS}:" - _EXIT_OK_PREFIX='(none, since directory' + local EXIT_OK_PREFIX='(none, since directory' if [ ! -d "${PATH_BORG_CONF_KEYS}" ]; then - exit_ok "${_EXIT_OK_PREFIX} non-existant)" + exit_ok "${EXIT_OK_PREFIX} non-existant)" fi - _KEYFILES="$(ls -1 ${PATH_BORG_CONF_KEYS})" - if [ -z "${_KEYFILES}" ]; then - exit_ok "${_EXIT_OK_PREFIX} empty)" + local KEYFILES="$(ls -1 ${PATH_BORG_CONF_KEYS})" + if [ -z "${KEYFILES}" ]; then + exit_ok "${EXIT_OK_PREFIX} empty)" fi - echo "${_KEYFILES}" | while read _FILENAME; do - _KEY_ID=$(_id_from_file "${PATH_BORG_CONF_KEYS}/${_FILENAME}") - _PATH_LOC="$(path_repo_location ${_KEY_ID})" - printf "${_KEY_ID} ${_FILENAME} " - if [ -f "${_PATH_LOC}" ]; then - printf '%s\n' "$(cat ${_PATH_LOC})" - else - printf '?\n' - fi + echo "${KEYFILES}" | while read _FILENAME; do + local KEY_ID=$(_id_from_file "${PATH_BORG_CONF_KEYS}/${_FILENAME}") + local KEY_DATA=$(explore_key_id "${KEY_ID}") + local PREFIX=$(echo "${KEY_DATA}" | cut -d' ' -f1) + local LOCATION=$(echo "${KEY_DATA}" | cut -d' ' -f3) + printf '%s %s %s %s\n' "${PREFIX}" "${KEY_ID}" "${_FILENAME}" "${LOCATION}" done } USAGE_DESC_orgpull='pull most recent org directory available in repos' CMDFNC_orgpull() { expect_n_args 0 0 '' $@ - _NAME_ARCHIVE=orgdir # determine server and repo - _PATH_PIPE="$(path_tmp_timestamped 'pipe')" - mkfifo "${_PATH_PIPE}" - ls -1 "${PATH_BORG_CONF_SECURITY}/" > "${_PATH_PIPE}" & + local PATH_PIPE="$(path_tmp_timestamped 'pipe')" + mkfifo "${PATH_PIPE}" + ls -1 "${PATH_BORG_CONF_SECURITY}/" > "${PATH_PIPE}" & while read _FILENAME; do - _LOCATION="$(cat $(path_repo_location ${_FILENAME}))" - _NAME_SERVER=$(servername_from_location "${_LOCATION}") - if ping -c1 -W2 "${_NAME_SERVER}" > /dev/null 2>&1; then - _REPO="${_LOCATION}" + local KEY_DATA=$(explore_key_id "${_FILENAME}") + local PREFIX=$(echo "${KEY_DATA}" | cut -d' ' -f1) + if [ "${PREFIX}" = '-' ]; then + echo "Ignoring ${_FILENAME}, location doesn't match expected patten." + continue + fi + local NAME_SERVER=$(echo "${KEY_DATA}" | cut -d' ' -f2) + local LOCATION=$(echo "${KEY_DATA}" | cut -d' ' -f3) + if ping -c1 -W2 "${NAME_SERVER}" > /dev/null 2>&1; then + local REPO="${LOCATION}" break else - echo "Cannot reach ${_NAME_SERVER}, skipping." + echo "Cannot reach ${NAME_SERVER}, skipping." fi - done < "${_PATH_PIPE}" - rm "${_PATH_PIPE}" - if [ -z "${_REPO}" ]; then + done < "${PATH_PIPE}" + rm "${PATH_PIPE}" + if [ -z "${REPO}" ]; then error_exit 'no repo being available.' fi # determine passphrase and archive - echo "Checking out ${_REPO} …" - _run_borg_with_passphrase list "${_REPO}" - _ARCHIVE=$(echo "${_OUTPUT}" | grep "${_NAME_ARCHIVE}" | tail -1 | cut -f1 -d' ') + echo "Checking out ${REPO} …" + _run_borg_with_passphrase list "${REPO}" + local ARCHIVE=$(echo "${_OUTPUT}" | grep "${NAME_ARCHIVE_ORG}" | tail -1 | cut -f1 -d' ') # pull archive - echo "Pulling archive: ${_ARCHIVE}" + echo "Pulling archive: ${ARCHIVE}" cd / - borg extract --verbose "${_REPO}::${_ARCHIVE}" + borg extract --verbose "${REPO}::${ARCHIVE}" } USAGE_DESC_orgpush='push org directory to repos' CMDFNC_orgpush() { expect_n_args 0 0 '' $@ - _NAME_ARCHIVE=orgdir for _FILENAME in $(ls "${PATH_BORG_CONF_SECURITY}/"); do - _REPO="$(cat $(path_repo_location ${_FILENAME}))" - _ARCHIVE="${_REPO}::${_NAME_ARCHIVE}-{utcnow:%Y-%m-%dT%H:%M}" - _run_borg_with_passphrase create --verbose "${_ARCHIVE}" "${HOME}/org" + local KEY_DATA=$(explore_key_id "${_FILENAME}") + local PREFIX=$(echo "${KEY_DATA}" | cut -d' ' -f1) + if [ "${PREFIX}" = '-' ]; then + echo "Ignoring ${_FILENAME}, location doesn't match expected patten." + continue + fi + local LOCATION=$(echo "${KEY_DATA}" | cut -d' ' -f3) + local ARCHIVE="${LOCATION}::${NAME_ARCHIVE_ORG}-{utcnow:%Y-%m-%dT%H:%M}" + _run_borg_with_passphrase create --verbose "${ARCHIVE}" "${HOME}/org" done } diff --git a/testing/scripts/_setup_secrets_user.sh b/testing/scripts/_setup_secrets_user.sh index b62746b..b60f591 100644 --- a/testing/scripts/_setup_secrets_user.sh +++ b/testing/scripts/_setup_secrets_user.sh @@ -34,7 +34,6 @@ export BORG_PASSPHRASE="${PASSPHRASE}" prefixed_msg 'Setting up ~/.ssh …' cp -a "${PATH_SECRETS_SSH}" "${PATH_USER_SSH}" -#eval $(ssh-agent) stty -echo trapp stty echo retry_until 1 'echo ""' 'ssh-add -q' 'prefixed_msg "Aborting due to ssh-add error"' -- 2.30.2