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"; }
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
}
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
}