commit 85d23732d8b689a261c9ff6b28ab8b35c41c35c6
parent bf207e049ddcfc76ba88373adf53e17d20eda2ef
Author: 8go <cccc@tuta.io>
Date: Wed, 10 Apr 2019 10:23:39 +0000
implements the pass backup extension, a 142-line bash script
Diffstat:
| A | backup.bash | | | 142 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 142 insertions(+), 0 deletions(-)
diff --git a/backup.bash b/backup.bash
@@ -0,0 +1,142 @@
+#!/usr/bin/env bash
+# pass backup - Password Store Extension (https://www.passwordstore.org/)
+# Copyright (C) 2019
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# []
+
+VERSION="1.1.1"
+PASSWORD_STORE_BACKUP_DEBUG=false # true or false, prints debugging messages
+PASSWORD_STORE_BACKUP_DIR=".backups" # default backup directory is $PASSWORD_STORE_BACKUP_DIR; if it is a relative path it becomes $PASSWORD_STORE_DIR/$PASSWORD_STORE_BACKUP_DIR
+PASSWORD_STORE_BACKUP_BASENAME="passwordstore" # to create backup filenames like passwordstore.190407.123423.tar.gz2
+TAR=$(which tar)
+
+cmd_backup_usage() {
+ cat <<-_EOF
+Usage:
+ $PROGRAM backup [backuplocation]
+ On the first run it creates a directory ".backups" in \$PASSWORD_STORE_DIR.
+ By default this is ~/.password-store/.backups".
+ It creates a backup of the complete password store by creating a
+ compressed tar-file with extension .tar.bz2.
+ Backups themselves are excluded from the backup.
+ Without argument the backup file will receive the default name "passwordstore.DATE.TIME.tar.bz2"
+ where DATE and TIME are the current date and time.
+ If an argument is given and it is a directory, the backup file will be placed
+ into the specified directory instead of the default ".backups" directory.
+ If an argument is given and it is not a directory, it is used as a file
+ name and the backup is stored with this filename with .at.gz2 appended.
+ $PROGRAM backup help
+ Prints this help message.
+ $PROGRAM backup version
+ Prints the version number.
+
+Example: $PROGRAM backup
+ this is the typical usage
+ creates a backup and places it into \$PASSWORD_STORE_DIR/.backups
+ e.g. ~/.password-store/.backups/passwordstore.190407.122034.tar.gz2
+Example: $PROGRAM backup Documents/Backups/
+ creates a backup and places it into Documents/Backups/
+ i.e. Documents/Backups/passwordstore.190407.122034.tar.gz2
+Example: $PROGRAM backup Documents/Backups/mypassbackup
+ creates a backup and places it into
+ Documents/Backups/mypassbackup.tar.gz2
+
+For installation place this bash script file "backup.bash" into
+the passwordstore extension directory specified with \$PASSWORD_STORE_EXTENSIONS_DIR.
+By default this is ~/.password-store/.extensions.
+E.g. cp backup.bash ~/.password-store/.extensions
+Give the file execution permissions:
+E.g. chmod 700 ~/.password-store/.extensions/backup.bash
+Set the variable PASSWORD_STORE_ENABLE_EXTENSIONS to true to enable extensions.
+E.g. export PASSWORD_STORE_ENABLE_EXTENSIONS=true
+Source the bash completion file "pass-backup.bash.completion" for bash completion.
+E.g. source ~/.password-store/.bash-completions/pass-backup.bash.completion
+Type "pass backup" to create your first backup.
+E.g. pass backup
+_EOF
+ exit 0
+}
+
+cmd_backup_version() {
+ echo $VERSION
+ exit 0
+}
+
+cmd_backup_createbackup() {
+ [[ $# -gt 1 ]] && die "Too many arguments. At most 1 argument allowed."
+
+ [[ -z "$TAR" ]] && die "Failed to generate backup: tar is not installed."
+ TODAYTIME=$(date "+%Y%m%d.%H%M%S") # e.g. 20190409.212327
+
+ # expect 0 or 1 argument
+ # ignore 2nd argument and higher
+ if [ $# -eq 0 ]; then
+ PASSWORD_STORE_BACKUP_PATH="$PASSWORD_STORE_BACKUP_DIR/${PASSWORD_STORE_BACKUP_BASENAME}.${TODAYTIME}.tar.bz2" # path includes filename
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "No arguments supplied. That is okay."
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "Setting backup directory to $PASSWORD_STORE_BACKUP_DIR"
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "Setting backup file to $PASSWORD_STORE_BACKUP_PATH"
+ else
+ ARG1="$1"
+ case "$ARG1" in
+ /*)
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "$ARG1 is an absolute path"
+ ;;
+ *)
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "$ARG1 is a relative path"
+ ARG1="$(pwd)/$ARG1"
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "Now $ARG1 is an absolute path"
+ ;;
+ esac
+
+ if [[ -d "$ARG1" ]]; then
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "Argument $ARG1 is a directory"
+ PASSWORD_STORE_BACKUP_PATH="$ARG1/${PASSWORD_STORE_BACKUP_BASENAME}.${TODAYTIME}.tar.bz2" # path includes filename
+ else
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "Argument $ARG1 treated as a filename"
+ PASSWORD_STORE_BACKUP_PATH="${ARG1}.tar.bz2"
+ fi
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "Setting exclusion directory to $PASSWORD_STORE_BACKUP_DIR"
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "Setting backup file to $PASSWORD_STORE_BACKUP_PATH"
+ fi
+
+ [[ -f "$PASSWORD_STORE_BACKUP_PATH" ]] && yesno "File $PASSWORD_STORE_BACKUP_PATH already exists. Overwrite it?"
+
+ if [ -z "$PASSWORD_STORE_DIR" ]; then # var is empty
+ PASSWORD_STORE_DIR="${HOME}/.password-store"
+ fi
+ $PASSWORD_STORE_BACKUP_DEBUG && echo "Password storage directory is $PASSWORD_STORE_DIR"
+
+ pushd "${PASSWORD_STORE_DIR}" >/dev/null || die "Could not cd into directory $PASSWORD_STORE_DIR. Aborting."
+ mkdir -p "${PASSWORD_STORE_BACKUP_DIR}" >/dev/null || die "Could not create directory $PASSWORD_STORE_BACKUP_DIR. Aborting."
+ tar --exclude="${PASSWORD_STORE_BACKUP_DIR}" -cjf "${PASSWORD_STORE_BACKUP_PATH}" . # add v for debugging if need be
+ chmod 400 "${PASSWORD_STORE_BACKUP_PATH}" >/dev/null || die "Could not change permissions to read-only on file $PASSWORD_STORE_BACKUP_PATH. Aborting."
+ BZ2SIZE=$(wc -c <"${PASSWORD_STORE_BACKUP_PATH}") # returns size in bytes
+ BZ2ENTRIES=$(tar -tf "${PASSWORD_STORE_BACKUP_PATH}" | wc -l)
+ echo "Created backup file \"${PASSWORD_STORE_BACKUP_PATH}\" of size ${BZ2SIZE} bytes with ${BZ2ENTRIES} entries."
+ popd >/dev/null || die "Could not change directory. Aborting."
+}
+
+case "$1" in
+help | --help | -h)
+ shift
+ cmd_backup_usage "$@"
+ ;;
+version | --version | -v)
+ shift
+ cmd_backup_version "$@"
+ ;;
+*) cmd_backup_createbackup "$@" ;;
+esac
+exit 0