Skip to content

Instantly share code, notes, and snippets.

@ffflorian
Last active May 14, 2022 14:52
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ffflorian/bb35c4defedcc72052e5d2a327479a81 to your computer and use it in GitHub Desktop.
Save ffflorian/bb35c4defedcc72052e5d2a327479a81 to your computer and use it in GitHub Desktop.
Update (or install) the latest Bitwarden
#!/usr/bin/env bash
# Update (or install) the latest Bitwarden
# Optimized for Debian/Ubuntu + GNOME
# ffflorian 2019
set -e
SCRIPT_NAME="${0##*/}"
INSTALL_DIR="/opt/Bitwarden"
EXEC_BIN="${INSTALL_DIR}/bitwarden"
TEMP_DIR="$(mktemp -d)"
DEB_FILE="${TEMP_DIR}/bitwarden.deb"
CONFIG_FILE="${HOME}/.config/Bitwarden/data.json"
RELEASE_URL="https://api.github.com/repos/bitwarden/desktop/releases/latest"
USE_CURL="yes"
FORCE="no"
_cleanup() {
rm -rf "${TEMP_DIR}"
}
trap _cleanup EXIT
_compare_version() {
printf "%03d%03d%03d%03d" $(echo "${1}" | tr '.' ' ')
}
get_latest_release() {
if [ "${USE_CURL}" = "yes" ]; then
curl -sL "${RELEASE_URL}" | grep '"tag_name":' | sed -E 's/.*"v?([^"]+)".*/\1/'
else
wget -qO- "${RELEASE_URL}" | grep '"tag_name":' | sed -E 's/.*"v?([^"]+)".*/\1/'
fi
}
_print_usage() {
cat <<EOF
Usage: ${SCRIPT_NAME} [option]
Options:
--force (-f) Reinstall Bitwarden if it is already installed.
Commands:
--help (-h) Display this help message
EOF
}
while :
do
case "${1}" in
-f|--force )
FORCE="force"
shift
;;
-h|--help )
_print_usage
exit 0
;;
* )
break
;;
esac
done
if [ -d "${INSTALL_DIR}" ]; then
if [ -r "${EXEC_BIN}" ] && [ -r "${CONFIG_FILE}" ]; then
CURRENT_VERSION="$(sed -n 's/.*"installedVersion": "\(.*\)",/\1/p' "${CONFIG_FILE}")"
else
read -r -p "The current Bitwarden installation seems to be broken. Would you like to reinstall the latest version? [y/N] " RESPONSE
case "${RESPONSE}" in
[nN][oO]|[nN]|"" ) exit 0 ;;
esac
FORCE="force"
fi
else
read -r -p "Bitwarden is not installed yet. Would you like to install it? [y/N] " RESPONSE
case "${RESPONSE}" in
[nN][oO]|[nN]|"" ) exit 0 ;;
esac
FORCE="force"
fi
if ! command -v "curl" > /dev/null; then
USE_CURL="no"
fi
LATEST_VERSION="$(get_latest_release)"
if [ "${FORCE}" != "force" ]; then
if [ "$(_compare_version "${LATEST_VERSION}")" -le "$(_compare_version "${CURRENT_VERSION}")" ]; then
echo "No update needed, ${CURRENT_VERSION} is the latest Bitwarden version available."
echo "Run this script with --force to reinstall this Bitwarden version."
exit 0
fi
fi
DOWNLOAD_URL="https://github.com/bitwarden/desktop/releases/download/v${LATEST_VERSION}/Bitwarden-${LATEST_VERSION}-amd64.deb"
echo "Downloading Bitwarden ${LATEST_VERSION} from ${DOWNLOAD_URL} ... "
if [ "${USE_CURL}" = "yes" ]; then
curl -o "${DEB_FILE}" -L "${DOWNLOAD_URL}"
else
wget -O "${DEB_FILE}" "${DOWNLOAD_URL}"
fi
printf "OK\\n\\n"
if [ ! -r "${DEB_FILE}" ]; then
echo "Error: could not find downloaded file \"${DEB_FILE}\"".
exit 1
fi
echo "Installing Bitwarden ... "
sudo dpkg -i "${DEB_FILE}"
echo "All done!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment