home · contact · privacy
Improve borgplom. master
authorChristian Heller <c.heller@plomlompom.de>
Thu, 19 Jun 2025 21:02:42 +0000 (23:02 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 19 Jun 2025 21:02:42 +0000 (23:02 +0200)
testing/copy/desktop/home/plom/.local/bin/borgplom
testing/scripts/_setup_secrets_user.sh

index e3db0ccac2d14facdb77b850f70d1b0fd87814db..b0fc653c5596686a37500bb14d9d4c9900c341c9 100755 (executable)
@@ -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
 }
 
index b62746b7ba92962db5e24e20c54123482a0eec91..b60f5914130903991d29fb90d22fcfae6759ad4a 100644 (file)
@@ -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"'