diff --git a/uprgade-keycloak.sh b/uprgade-keycloak.sh index 8aaccd5..79380c9 100755 --- a/uprgade-keycloak.sh +++ b/uprgade-keycloak.sh @@ -294,13 +294,26 @@ if [[ -n "$DB_TYPE" ]] ; then DEFAULT_DB_TYPE=mysql else - fatal "Wrong or empty Database Type (DB_TYPE) - must be 'mysql' or 'pgsql'." + DEFAULT_DB_TYPE=pgsql + #fatal "Wrong or empty Database Type (DB_TYPE) - must be 'mysql' or 'pgsql'." fi fi [[ -n "${DB_NAME}" ]] && DEFAULT_DB_NAME="${DB_NAME}" -[[ -n "${DB_USER}" ]] && DEFAULT_DB_NAME="${DB_USER}" -[[ -n "${DB_PASS}" ]] && DEFAULT_DB_PASS="${DB_PASS}" +[[ -n "${DB_USER}" ]] && DEFAULT_DB_USER="${DB_USER}" + +#if [[ -n "${DB_PASS}" ]] ; then +# DEFAULT_DB_PASS="${DB_PASS}" +#else +# fatal "No Password given for ${DB_TYPE} database ${DEFAULT_DB_NAME}" +#fi + +if [[ -n "${DB_PASS}" ]] ; then + DEFAULT_DB_PASS="${DB_PASS}" +else + DEFAULT_DB_PASS="" +fi + [[ -n "${KEYCLOAK_USER}" ]] && DEFAULT_KEYCLOAK_USER="${KEYCLOAK_USER}" if [[ -n "${KEYCLOAK_GROUP}" ]]; then @@ -402,6 +415,103 @@ fi HOSTNAME="${FQHN_HOSTNAME%%.*}" +DB_TYPE= +echo "" +echo -e "\033[32m--\033[m" +echo "" +echo "Specify the database type for the Keycloak database." +echo "" +echo " Accepted values: pgsql, postgresql, postgres (for PostgreSQL)" +echo " mysql (for MySQL)" +echo "" +while [[ "X${DB_TYPE}" = "X" ]]; do + echononl "Database type [${DEFAULT_DB_TYPE}]: " + read DB_TYPE + if [[ "X${DB_TYPE}" = "X" ]]; then + DB_TYPE="${DEFAULT_DB_TYPE}" + fi + if [[ "${DB_TYPE,,}" = "postgres" ]] || [[ "${DB_TYPE,,}" = "postgresql" ]] || [[ "${DB_TYPE,,}" = "pgsql" ]] || [[ "${DB_TYPE,,}" = "psql" ]] ; then + DB_TYPE=pgsql + elif [[ "${DB_TYPE,,}" = "mysql" ]] ; then + DB_TYPE=mysql + else + echo -e "\n\t\033[33m\033[1mInvalid database type '${DB_TYPE}'! Use 'pgsql' or 'mysql'.\033[m\n" + DB_TYPE="" + fi +done + +DB_NAME= +echo "" +echo -e "\033[32m--\033[m" +echo "" +echo "Specify the database name for the Keycloak database." +echo "" +while [[ "X${DB_NAME}" = "X" ]]; do + echononl "Database name [${DEFAULT_DB_NAME}]: " + read DB_NAME + if [[ "X${DB_NAME}" = "X" ]]; then + DB_NAME="${DEFAULT_DB_NAME}" + fi +done + + +DB_NAME= +echo "" +echo -e "\033[32m--\033[m" +echo "" +echo "Specify the database name for the Keycloak database." +echo "" +while [[ "X${DB_NAME}" = "X" ]]; do + echononl "Database name [${DEFAULT_DB_NAME}]: " + read DB_NAME + if [[ "X${DB_NAME}" = "X" ]]; then + DB_NAME="${DEFAULT_DB_NAME}" + fi +done + +DB_USER= +echo "" +echo -e "\033[32m--\033[m" +echo "" +echo "Specify the database user for the Keycloak database." +echo "" +while [[ "X${DB_USER}" = "X" ]]; do + echononl "Database user [${DEFAULT_DB_USER}]: " + read DB_USER + if [[ "X${DB_USER}" = "X" ]]; then + DB_USER="${DEFAULT_DB_USER}" + fi +done + +DB_PASS= +echo "" +echo -e "\033[32m--\033[m" +echo "" +echo "Specify the database password for the Keycloak database." +echo "" +while [[ "X${DB_PASS}" = "X" ]]; do + echononl "Database password" + if [[ -n "${DEFAULT_DB_PASS}" ]]; then + echo -n " [current value from config]: ****************" + else + echo -n ": " + fi + read -s DB_PASS + echo "" + if [[ "X${DB_PASS}" = "X" ]]; then + if [[ -n "${DEFAULT_DB_PASS}" ]]; then + DB_PASS="${DEFAULT_DB_PASS}" + else + echo -e "\n\t\033[33m\033[1mA database password is required!\033[m\n" + fi + fi +done + +#DB_BACKUP_DIR="${working_dir}/backups" +DB_BACKUP_DIR="$(dirname "${KEYCLOAK_INSTALL_DIR}")" +DB_DUMP_FILE="${DB_BACKUP_DIR}/keycloak_db_${backup_date}.sql.gz" + + echo "" echo "" echo -e "\t\033[32mStart upgrade script for Keycloak Service with the following parameters\033[m" @@ -420,6 +530,13 @@ echo "" echo -e "\tKeycloak user...................: ${KEYCLOAK_USER}" echo -e "\tKeycloak group..................: ${KEYCLOAK_GROUP}" echo "" +echo -e "\tKeycloak database type..........: ${DB_TYPE}" +echo -e "\tKeycloak database name..........: ${DB_NAME}" +echo -e "\tKeycloak database user..........: ${DB_USER}" +echo -e "\tKeycloak database password......: ${DB_PASS}" +echo "" +echo -e "\tdatabase dump file..............: ${DB_DUMP_FILE}" +echo "" echo -e "\tKeycloak base install dir.......: ${KEYCLOAK_BASE_INSTALL_PATH}" echo -e "\tKeycloak install dir............: ${KEYCLOAK_INSTALL_DIR}" echo "" @@ -557,6 +674,69 @@ fi blank_line +echo +echo -e "\033[37m\033[1mBackup PostgreSQL database before upgrade..\033[m" +echo + +echononl "Create backup directory '${DB_BACKUP_DIR}' .." +mkdir -p "${DB_BACKUP_DIR}" > "$log_file" 2>&1 +if [[ $? -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + fatal "Cannot create backup directory '${DB_BACKUP_DIR}'" +else + echo_ok +fi + + +if [[ "${DB_TYPE}" = "pgsql" ]] ; then + + echononl "Dump PostgreSQL database '${DB_NAME}' to '$(basename "${DB_DUMP_FILE}")' .." + PGPASSWORD="${DB_PASS}" pg_dump \ + -h localhost \ + -p 5432 \ + -U "${DB_USER}" \ + -d "${DB_NAME}" \ + --format=plain \ + --no-password \ + 2> "$log_file" \ + | gzip > "${DB_DUMP_FILE}" + if [[ ${PIPESTATUS[0]} -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + fatal "PostgreSQL backup failed! Aborting upgrade." + else + echo_ok + info "Database backup: ${DB_DUMP_FILE} ($(du -sh "${DB_DUMP_FILE}" | cut -f1))" + fi + +elif [[ "${DB_TYPE}" = "mysql" ]] ; then + + echononl "Dump MySQL database '${DB_NAME}' to '$(basename "${DB_DUMP_FILE}")' .." + mysqldump \ + --host=localhost \ + --user="${DB_USER}" \ + --password="${DB_PASS}" \ + --single-transaction \ + --routines \ + --triggers \ + "${DB_NAME}" \ + 2> "$log_file" \ + | gzip > "${DB_DUMP_FILE}" + if [[ ${PIPESTATUS[0]} -ne 0 ]]; then + echo_failed + error "$(cat "$log_file")" + fatal "MySQL backup failed! Aborting upgrade." + else + echo_ok + info "Database backup: ${DB_DUMP_FILE} ($(du -sh "${DB_DUMP_FILE}" | cut -f1))" + fi + +fi + +blank_line + + echo echo -e "\033[37m\033[1mInstalling Keycloak Service..\033[m" echo