diff --git a/makefile b/makefile index 6572c9c8522e601ab8710988308c7db5f51cac83..333a76a2663a8c04ea3a07c8f950c68fe013afe4 100644 --- a/makefile +++ b/makefile @@ -38,7 +38,7 @@ test-connection: .PHONY: upgrade upgrade: - @cd patches; ./applyPatches.sh $(MYSQL_CONNECTION) --database=$(DATABASE_NAME) + @cd patches; ./applyPatches.sh --env=../.config .PHONY: install install: _install _grant upgrade diff --git a/patches/applyPatches.sh b/patches/applyPatches.sh index a9928c3772c84ace90871b0a5a3395cbcbd4ffa0..76db457f0c5551351b4da4915002ac452d4eb2a4 100755 --- a/patches/applyPatches.sh +++ b/patches/applyPatches.sh @@ -30,8 +30,8 @@ export UTILSPATH="./utils" for p in $PATCHES do - $p $MYSQL_CONNECTION --database=$DATABASE_NAME --patch=$p + $p "$@" --patch=$p done cd ../ -./update_sql_procedures.sh $MYSQL_CONNECTION --database=$DATABASE_NAME +./update_sql_procedures.sh diff --git a/patches/utils/patch_header.sh b/patches/utils/patch_header.sh index e9ee4311333cb0e09263bd93ca2df52753561314..dc24bf179b1e8393e58320389ae34b1347d043f4 100644 --- a/patches/utils/patch_header.sh +++ b/patches/utils/patch_header.sh @@ -4,6 +4,7 @@ # # Copyright (C) 2018 Research Group Biomedical Physics, # Max-Planck-Institute for Dynamics and Self-Organization Göttingen +# Copyright 2019 Daniel Hornung # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -23,122 +24,107 @@ #header for patch scripts CMD_MYSQL=mysql CMD_MYSQL_DUMP=mysqldump -USAGE="$1 --database=DATABASE_NAME [ --login-path=LOGIN_PATH | --user=USER [ --password=PASSWORD ] ]\n\n" -CMD_OPTIONS="options:\n\n-h, --help\n\tShow brief help.\n-l LOGIN_PATH, --login-path=LOGIN_PATH\n\tA login-path for the mysql connection (see 'man mysql' and 'man mysql-config-editor').\n-u USER, --user=USER\n\tA mysql user.\n-p PASSWORD, --password=PASSWORD\n\tThe password for the mysql user.\n" +USAGE="$1 [ --env=ENV_FILE ] [ --patch=PATCH ] [ --backupdir=BACKUPDIR ]\n\n" +CMD_OPTIONS=cat <<EOF +options: + +-h, --help + Show brief help. +--env=ENV_FILE + A file where variables are stored in the format of shell environment + variables. Content of this file overrides environment variables already + present. +--patch=PATCH + *TODO* Please document this option. +--backupdir=BACKUPDIR + *TODO* Please document this option. + +This script basically uses the same environment variables as the server +configuration make file. Notable examples are: + +- LOGIN_PATH +- MYSQL_HOST +- MYSQL_PORT +- DATABASE_NAME +- DATABASE_USER +- DATABASE_USER_PW + +EOF set -e function _print_help() { - printf -- "$USAGE" - printf -- "$CMD_OPTIONS" + echo -e "$USAGE" + echo -e "$CMD_OPTIONS" if [ -n "$PRINT_HELP" ]; then - printf -- "$PRINT_HELP" + echo -e "$PRINT_HELP" fi if [ -n "$1" ]; then - printf -- "$1" + echo -e "$1" fi } + while test $# -gt 0; do case "$1" in -h|--help) _print_help exit 0 ;; - -p) - shift - if test $# -gt 0; then - MYSQL_USER_PASSWORD=$1 - else - echo "no database specified" - exit 1 - fi - shift - ;; - --password*) - MYSQL_USER_PASSWORD=`echo $1 | sed -e 's/^[^=]*=//g'` - shift - ;; - -u) - shift - if test $# -gt 0; then - MYSQL_USER=$1 - else - echo "no database specified" - exit 1 - fi - shift - ;; - --user*) - MYSQL_USER=`echo $1 | sed -e 's/^[^=]*=//g'` - shift - ;; - -l) - shift - if test $# -gt 0; then - LOGIN_PATH=$1 - else - echo "no database specified" - exit 1 - fi - shift - ;; - --login-path*) - LOGIN_PATH=`echo $1 | sed -e 's/^[^=]*=//g'` - shift - ;; - -d) - shift - if test $# -gt 0; then - DATABASE_NAME=$1 - else - echo "no database specified" - exit 1 - fi - shift - ;; - --database*) - DATABASE_NAME=`echo $1 | sed -e 's/^[^=]*=//g'` + --env*) + ENV_FILE="${1#--*=}" shift ;; --patch*) - PATCH=`echo $1 | sed -e 's/^[^=]*=//g'` + PATCH="${1#--*=}" shift ;; --backupdir*) - BACKUPDIR=`echo $1 | sed -e 's/^[^=]*=//g'` + BACKUPDIR="${1#--*=}" shift ;; *) + echo "Unknown option $1" + exit 1 shift ;; esac done -if [ -z "$DATABASE_NAME" ] +[[ -n "$ENV_FILE" ]] && source "$ENV_FILE" + +if [[ -z "$DATABASE_NAME" && -z "$MYSQL_CONNECTION" ]] then _print_help "Please specify the database." exit 1 fi -if [ "$LOGIN_PATH" ] -then +if [ "$LOGIN_PATH" ]; then MYSQL_CONNECTION="--login-path=$LOGIN_PATH" -else + MYSQL_CONNECTION_NO_DB="$MYSQL_CONNECTION" + MYSQL_CONNECTION="$MYSQL_CONNECTION --database=$DATABASE_NAME" + +elif [[ -z "$MYSQL_CONNECTION" ]]; then MYSQL_CONNECTION="" - if [ "$MYSQL_USER" ] + if [ "$DATABASE_USER" ] then - MYSQL_CONNECTION="--user=$MYSQL_USER" + MYSQL_CONNECTION="--user=$DATABASE_USER" fi - if [ "$MYSQL_USER_PASSWORD" ] + if [ "$DATABASE_USER_PW" ] then - MYSQL_CONNECTION="$MYSQL_CONNECTION --password=$MYSQL_USER_PASSWORD" + MYSQL_CONNECTION="$MYSQL_CONNECTION --password=$DATABASE_USER_PW" fi - if [ "$MYSQL_HOST" != "localhost" ]; then - MYSQL_CONNECTION="$MYSQL_CONNECTION --host $MYSQL_HOST" + if [[ "$MYSQL_HOST" && ( "$MYSQL_HOST" != "localhost" ) ]]; then + MYSQL_CONNECTION="$MYSQL_CONNECTION --host=$MYSQL_HOST" if [ "$MYSQL_PORT" ]; then - MYSQL_CONNECTION="$MYSQL_CONNECTION --port $MYSQL_PORT" + MYSQL_CONNECTION="$MYSQL_CONNECTION --port=$MYSQL_PORT" fi fi + # This option should come last, so we also have one version without the database + MYSQL_CONNECTION_NO_DB="$MYSQL_CONNECTION" + MYSQL_CONNECTION="$MYSQL_CONNECTION --database=$DATABASE_NAME" fi +export MYSQL_CONNECTION +export MYSQL_CONNECTION_NO_DB +export DATABASE_NAME if [ -n "$PATCH" ]; then echo -ne "applying patch $PATCH to $DATABASE_NAME ... " @@ -161,7 +147,7 @@ function uptodate { # @param $1: db version string, e.g. v2.0.0 # @return: 0 on success, 1 on failure function check_version { - local version=$($CMD_MYSQL $MYSQL_CONNECTION -D $DATABASE_NAME -B -e "Select CaosDBVersion();") + local version=$($CMD_MYSQL $MYSQL_CONNECTION -B -e "Select CaosDBVersion();") if [[ "$(echo $version | sed 's/^CaosDBVersion()\s//')" = "$1" ]]; then return 0 fi @@ -174,13 +160,13 @@ function update_version { } function dump_table { - $CMD_MYSQL_DUMP $MYSQL_CONNECTION $DATABASE_NAME $1 > ${DATABASE_NAME}.${1}.${OLD_VERSION}.dump.sql + $CMD_MYSQL_DUMP $MYSQL_CONNECTION_NO_DB $DATABASE_NAME $1 > ${DATABASE_NAME}.${1}.${OLD_VERSION}.dump.sql } function mysql_execute { set +e - $CMD_MYSQL $MYSQL_CONNECTION -D $DATABASE_NAME -e "$1" + $CMD_MYSQL $MYSQL_CONNECTION -e "$1" ret=${PIPESTATUS[0]} if [ "$ret" -ne 0 ]; then failure "MYSQL ERROR" @@ -189,5 +175,5 @@ function mysql_execute { } function redo_table { - $CMD_MYSQL $MYSQL_CONNECTION -D $DATABASE_NAME < ${DATABASE_NAME}.${1}.${OLD_VERSION}.dump.sql + $CMD_MYSQL $MYSQL_CONNECTION < ${DATABASE_NAME}.${1}.${OLD_VERSION}.dump.sql }