Compare commits

...

3 Commits

Author SHA1 Message Date
kris b800aafe51 testing 2026-05-10 14:50:56 -04:00
kris 884ccd32a7 Add license headers to bwexport and tmux config 2026-05-09 12:22:41 -04:00
kris aaa42182e3 Add bwexport for encrypted Bitwarden backups 2026-04-07 21:38:51 -04:00
3 changed files with 109 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
#!/usr/bin/env bash
# SPDX-FileCopyrightText: 2026 Kris Lamoureux <kris@lamoureux.io>
# SPDX-License-Identifier: 0BSD
set -o pipefail
msg() {
printf '[%s]: %s\n' "$1" "$2"
}
for cmd in bw gpg gzip; do
if ! command -v "$cmd" >/dev/null; then
msg 'ERROR' "'$cmd' not found"
exit 1
fi
done
read -srp "Vault password: " bw_pw
echo
if ! bw_session="$(printf '%s' "$bw_pw" | bw unlock --raw 2>/dev/null)"; then
msg 'ERROR' "Couldn't unlock vault"
exit 1
fi
unset bw_pw
read -srp "GPG passphrase: " gpg_pw
echo
read -srp "Confirm GPG passphrase: " gpg_pw2
echo
if [ "$gpg_pw" != "$gpg_pw2" ]; then
msg 'ERROR' "Passphrases don't match"
exit 1
fi
unset gpg_pw2
bw_date="$(TZ='America/New_York' date +%Y%m%dT%H%M)"
: "${BW_BACKUP:="./bw-export-$bw_date.json.gz.gpg"}"
if [ -e "$BW_BACKUP" ]; then
msg 'ERROR' "Existing file at $BW_BACKUP"
exit 1
fi
if ! bw export --format json --raw --session "$bw_session" | gzip |
gpg --symmetric --cipher-algo AES256 --pinentry-mode loopback \
--passphrase-fd 3 --batch -q \
-o "$BW_BACKUP" 3<<<"$gpg_pw"; then
msg 'ERROR' "Export failed"
unset gpg_pw
exit 1
fi
unset gpg_pw
bw lock --session "$bw_session" >/dev/null 2>&1
unset bw_session
msg 'INFO' "Exported to '$BW_BACKUP'"
+55
View File
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
# SPDX-FileCopyrightText: 2026 Kris Lamoureux <kris@lamoureux.io>
# SPDX-License-Identifier: 0BSD
prog=${0##*/}
err() {
printf '%s: %s\n' "$prog" "$1" >&2
logger -t "$prog" -p user.err "$1"
exit 1
}
usage() {
printf 'usage: %s <zensical-semver> <repo-dir> [selinux-context]\n' "$prog" >&2
}
if (($# != 2 && $# != 3)); then
usage
exit 1
fi
tag=$1
dir=$2
label=$3
if [[ ! $tag =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
err "tag must be a version like 1.2.3 (got: $tag)"
fi
[[ ! -d $dir ]] && err "not a directory: $dir"
cd "$dir" || err "failed to enter directory: $dir"
git rev-parse --is-inside-work-tree &>/dev/null ||
err "not a git repository: $(pwd)"
branch=$(git branch --show-current) || err "failed to get current branch"
[[ -n $branch ]] || err "not on a branch"
[[ $branch == main ]] || err "not on main branch: $branch"
status=$(git status --porcelain) || err "git status failed at: $(pwd)"
[[ -n $status ]] && err "working tree is dirty"
old=$(git rev-parse HEAD) || err "git rev-parse failed at: $(pwd)"
git pull -q --ff-only || err "failed to update repo"
new=$(git rev-parse HEAD) || err "git rev-parse failed after pull at: $(pwd)"
if [[ $old != "$new" || ! -d site ]]; then
if ! docker run --rm -v "$PWD:/docs" "zensical/zensical:$tag" build; then
err "build failed"
fi
fi
[[ -d site ]] || err "build did not produce site directory"
if [[ -n $label ]]; then
chcon -R -- "$label" site || err "failed to change SELinux context: $label"
fi
+3
View File
@@ -1,3 +1,6 @@
# SPDX-FileCopyrightText: 2026 Kris Lamoureux <kris@lamoureux.io>
# SPDX-License-Identifier: 0BSD
# prefix+r to reload
bind r source-file ~/.tmux.conf \; display "Config reloaded!"