#!/usr/bin/env bash set -e if [ "$EUID" -ne 0 ]; then echo "Error: This script must be run as root" >&2 exit 1 fi set -x # What user should we use for connecting to the database POSTGRES_USER="${POSTGRES_USER:-postgres}" # What database name and username to use when connecting to the database DATABASE_NAME=$(crudini --get /etc/zulip/zulip.conf postgresql database_name 2>/dev/null || echo zulip) DATABASE_USER=$(crudini --get /etc/zulip/zulip.conf postgresql database_user 2>/dev/null || echo zulip) if [ "$(su "$POSTGRES_USER" -c "cd / && psql -v ON_ERROR_STOP=1 -Atc \"SELECT 1 FROM pg_database WHERE datname='$DATABASE_NAME';\"")" = "1" ]; then records="$(su "$POSTGRES_USER" -c "cd / && psql -v ON_ERROR_STOP=1 -Atc 'SELECT COUNT(*) FROM $DATABASE_NAME.zerver_message;' $DATABASE_USER" || echo 0)" if [ "$records" -gt 200 ]; then set +x echo "WARNING: This will delete your Zulip database which currently contains $records messages." read -p "Do you want to proceed? [y/N] " -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1 fi set -x fi fi # Shut down all services to ensure a quiescent state. if [ -e "/home/zulip/deployments" ]; then su zulip -c "/home/zulip/deployments/current/scripts/stop-server" fi # Drop any open connections to any old database. # Send the script via stdin in case the postgres user lacks permission to read it. su -s /usr/bin/env - -- "$POSTGRES_USER" \ bash -s - zulip zulip_base <"$(dirname "$0")/terminate-psql-sessions" ( cd / # Make sure the current working directory is readable by postgres su "$POSTGRES_USER" -c "psql -v ON_ERROR_STOP=1 -v dbname=$DATABASE_NAME -v dbuser=$DATABASE_USER -e" ) <"$(dirname "$0")/create-db.sql" # Set a postgres password if the postgres username is not "zulip". # When the username is zulip, we rely on running as the zulip system # user for authentication via postgres' peer authentication. if [ "$DATABASE_USER" != "zulip" ]; then PASSWORD=$(crudini --get /etc/zulip/zulip-secrets.conf secrets postgres_password) su "$POSTGRES_USER" -c "psql -v ON_ERROR_STOP=1 -e postgres" <