| #!/usr/bin/env bash |
| |
| DB_NAME='vim_db' |
| DB_ADMIN_USER="root" |
| DB_USER="vim" |
| DB_PASS="vimpw" |
| DB_ADMIN_PASSWD="" |
| DB_PORT="3306" |
| DB_HOST="" |
| DB_HOST_PARAM="" |
| QUIET_MODE="" |
| FORCEDB="" |
| UPDATEDB="" |
| NO_PACKAGES="" |
| UNINSTALL="" |
| |
| |
| function usage(){ |
| echo -e "usage: sudo $0 [OPTIONS]" |
| echo -e "Install openvim database server and the needed packages" |
| echo -e " OPTIONS" |
| echo -e " -U USER: database admin user. '$DB_ADMIN_USER' by default. Prompts if needed" |
| echo -e " -P PASS: database admin password to be used or installed. Prompts if needed" |
| echo -e " -d: database name, '$DB_NAME' by default" |
| echo -e " -u: database user, '$DB_USER' by default" |
| echo -e " -p: database pass, '$DB_PASS' by default" |
| echo -e " -H: HOST database host. 'localhost' by default" |
| echo -e " -T: PORT database port. '$DB_PORT' by default" |
| echo -e " -q --quiet: install in unattended mode" |
| echo -e " -h --help: show this help" |
| echo -e " --forcedb: if database exists, it is dropped and a new one is created" |
| echo -e " --updatedb: if database exists, it preserves the content and it is updated to the needed version" |
| echo -e " --no-install-packages: use this option to skip updating and installing the requires packages. This avoid wasting time if you are sure requires packages are present e.g. because of a previous installation" |
| echo -e " --unistall: delete database" |
| } |
| |
| function ask_user(){ |
| # ask to the user and parse a response among 'y', 'yes', 'n' or 'no'. Case insensitive |
| # Params: $1 text to ask; $2 Action by default, can be 'y' for yes, 'n' for no, other or empty for not allowed |
| # Return: true(0) if user type 'yes'; false (1) if user type 'no' |
| read -e -p "$1" USER_CONFIRMATION |
| while true ; do |
| [ -z "$USER_CONFIRMATION" ] && [ "$2" == 'y' ] && return 0 |
| [ -z "$USER_CONFIRMATION" ] && [ "$2" == 'n' ] && return 1 |
| [ "${USER_CONFIRMATION,,}" == "yes" ] || [ "${USER_CONFIRMATION,,}" == "y" ] && return 0 |
| [ "${USER_CONFIRMATION,,}" == "no" ] || [ "${USER_CONFIRMATION,,}" == "n" ] && return 1 |
| read -e -p "Please type 'yes' or 'no': " USER_CONFIRMATION |
| done |
| } |
| |
| function install_packages(){ |
| [ -x /usr/bin/apt-get ] && apt-get install -y $* |
| [ -x /usr/bin/yum ] && yum install -y $* |
| |
| #check properly installed |
| for PACKAGE in $* |
| do |
| PACKAGE_INSTALLED="no" |
| [ -x /usr/bin/apt-get ] && dpkg -l $PACKAGE &>> /dev/null && PACKAGE_INSTALLED="yes" |
| [ -x /usr/bin/yum ] && yum list installed $PACKAGE &>> /dev/null && PACKAGE_INSTALLED="yes" |
| if [ "$PACKAGE_INSTALLED" = "no" ] |
| then |
| echo "failed to install package '$PACKAGE'. Revise network connectivity and try again" >&2 |
| exit 1 |
| fi |
| done |
| } |
| |
| function _install_mysql_package(){ |
| echo ' |
| ################################################################# |
| ##### INSTALL REQUIRED PACKAGES ##### |
| #################################################################' |
| [ "$_DISTRO" == "Ubuntu" ] && ! install_packages "mysql-server" && exit 1 |
| [ "$_DISTRO" == "CentOS" -o "$_DISTRO" == "Red" ] && ! install_packages "mariadb mariadb-server" && exit 1 |
| |
| if [[ "$_DISTRO" == "Ubuntu" ]] |
| then |
| #start services. By default CentOS does not start services |
| service mysql start >> /dev/null |
| # try to set admin password, ignore if fails |
| [[ -n $DBPASSWD ]] && mysqladmin -u $DB_ADMIN_USER -s password $DB_ADMIN_PASSWD |
| fi |
| |
| if [ "$_DISTRO" == "CentOS" -o "$_DISTRO" == "Red" ] |
| then |
| #start services. By default CentOS does not start services |
| service mariadb start |
| service httpd start |
| systemctl enable mariadb |
| systemctl enable httpd |
| ask_user "Do you want to configure mariadb (recommended if not done before) (Y/n)? " y && |
| mysql_secure_installation |
| |
| ask_user "Do you want to set firewall to grant web access port 80,443 (Y/n)? " y && |
| firewall-cmd --permanent --zone=public --add-service=http && |
| firewall-cmd --permanent --zone=public --add-service=https && |
| firewall-cmd --reload |
| fi |
| } |
| |
| function _create_db(){ |
| echo ' |
| ################################################################# |
| ##### CREATE AND INIT DATABASE ##### |
| #################################################################' |
| echo "mysqladmin --defaults-extra-file="$TEMPFILE" -s create ${DB_NAME}" |
| mysqladmin --defaults-extra-file="$TEMPFILE" -s create ${DB_NAME} \ |
| || ! echo "Error creating ${DB_NAME} database" >&2 \ |
| || exit 1 |
| echo "CREATE USER $DB_USER@'localhost' IDENTIFIED BY '$DB_PASS';" | mysql --defaults-extra-file="$TEMPFILE" -s 2>/dev/null \ |
| || echo "Warning: User '$DB_USER' cannot be created at database. Probably exist" >&2 |
| echo "GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '$DB_USER'@'localhost';" | mysql --defaults-extra-file="$TEMPFILE" -s \ |
| || ! echo "Error: Granting privileges to user '$DB_USER' at database" >&2 \ |
| || exit 1 |
| echo " Database '${DB_NAME}' created, user '$DB_USER' password '$DB_PASS'" |
| DIRNAME=$(dirname $(readlink -f ${BASH_SOURCE[0]})) |
| ${DIRNAME}/init_vim_db.sh -u"$DB_USER" -p"$DB_PASS" -d"$DB_NAME" -P"$DB_PORT" $DB_HOST_PARAM \ |
| || ! echo "Error initializing database '$DB_NAME'" >&2 \ |
| || exit 1 |
| } |
| |
| function _delete_db(){ |
| mysqladmin --defaults-extra-file="$TEMPFILE" -s drop "${DB_NAME}" $DBDELETEPARAM \ |
| || ! echo "Error: Could not delete '${DB_NAME}' database" >&2 \ |
| || exit 1 |
| } |
| |
| function _update_db(){ |
| echo ' |
| ################################################################# |
| ##### UPDATE DATABASE ##### |
| #################################################################' |
| echo "CREATE USER $DB_USER@'localhost' IDENTIFIED BY '$DB_PASS';" | mysql --defaults-extra-file="$TEMPFILE" -s 2>/dev/null \ |
| || echo "Warning: User '$DB_USER' cannot be created at database. Probably exist" >&2 |
| echo "GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '$DB_USER'@'localhost';" | mysql --defaults-extra-file="$TEMPFILE" -s \ |
| || ! echo "Error: Granting privileges to user '$DB_USER' at database" >&2 \ |
| || exit 1 |
| echo " Granted privileges to user '$DB_USER' password '$DB_PASS' to existing database '${DB_NAME}'" |
| DIRNAME=$(dirname $(readlink -f ${BASH_SOURCE[0]})) |
| ${DIRNAME}/migrate_vim_db.sh -u"$DB_USER" -p"$DB_PASS" -d"$DB_NAME" -P"$DB_PORT" $DB_HOST_PARAM \ |
| || ! echo "Error updating database '$DB_NAME'" >&2 \ |
| || exit 1 |
| } |
| |
| function _uninstall_db(){ |
| echo ' |
| ################################################################# |
| ##### DELETE DATABASE ##### |
| #################################################################' |
| DBDELETEPARAM="" |
| [[ -n $QUIET_MODE ]] && DBDELETEPARAM="-f" |
| _delete_db |
| } |
| |
| function db_exists(){ # (db_name, credential_file) |
| # check credentials |
| mysqlshow --defaults-extra-file="$2" >/dev/null || exit 1 |
| RESULT=`mysqlshow --defaults-extra-file="$2" | grep -v Wildcard | grep -w $1` |
| if [ "$RESULT" == "$1" ]; then |
| # echo " DB $1 exists" |
| return 0 |
| fi |
| # echo " DB $1 does not exist" |
| return 1 |
| } |
| |
| while getopts ":U:P:d:u:p:H:T:hiq-:" o; do |
| case "${o}" in |
| U) |
| export DB_ADMIN_USER="$OPTARG" |
| ;; |
| P) |
| export DB_ADMIN_PASSWD="$OPTARG" |
| ;; |
| d) |
| export DB_NAME="$OPTARG" |
| ;; |
| u) |
| export DB_USER="$OPTARG" |
| ;; |
| p) |
| export DB_PASS="$OPTARG" |
| ;; |
| H) |
| export DB_HOST="$OPTARG" |
| export DB_HOST_PARAM="-h$DB_HOST" |
| ;; |
| T) |
| export DB_PORT="$OPTARG" |
| ;; |
| q) |
| export QUIET_MODE=yes |
| export DEBIAN_FRONTEND=noninteractive |
| ;; |
| h) |
| usage && exit 0 |
| ;; |
| -) |
| [ "${OPTARG}" == "help" ] && usage && exit 0 |
| [ "${OPTARG}" == "forcedb" ] && FORCEDB="y" && continue |
| [ "${OPTARG}" == "updatedb" ] && UPDATEDB="y" && continue |
| [ "${OPTARG}" == "quiet" ] && export QUIET_MODE=yes && export DEBIAN_FRONTEND=noninteractive && continue |
| [ "${OPTARG}" == "no-install-packages" ] && export NO_PACKAGES=yes && continue |
| [ "${OPTARG}" == "uninstall" ] && UNINSTALL="y" && continue |
| echo -e "Invalid option: '--$OPTARG'\nTry $0 --help for more information" >&2 |
| exit 1 |
| ;; |
| \?) |
| echo -e "Invalid option: '-$OPTARG'\nTry $0 --help for more information" >&2 |
| exit 1 |
| ;; |
| :) |
| echo -e "Option '-$OPTARG' requires an argument\nTry $0 --help for more information" >&2 |
| exit 1 |
| ;; |
| *) |
| usage >&2 |
| exit 1 |
| ;; |
| esac |
| done |
| if [ -n "$FORCEDB" ] && [ -n "$UPDATEDB" ] ; then |
| echo "Error: options --forcedb and --updatedb are mutually exclusive" >&2 |
| exit 1 |
| fi |
| |
| # Discover Linux distribution |
| # try redhat type |
| [ -f /etc/redhat-release ] && _DISTRO=$(cat /etc/redhat-release 2>/dev/null | cut -d" " -f1) |
| # if not assuming ubuntu type |
| [ -f /etc/redhat-release ] || _DISTRO=$(lsb_release -is 2>/dev/null) |
| |
| # Creating temporary file for MYSQL installation and initialization" |
| TEMPFILE="$(mktemp -q --tmpdir "installdb.XXXXXX")" |
| trap 'rm -f "$TEMPFILE"' EXIT |
| chmod 0600 "$TEMPFILE" |
| echo -e "[client]\n user='${DB_ADMIN_USER}'\n password='$DB_ADMIN_PASSWD'\n host='$DB_HOST'\n port='$DB_PORT'" > "$TEMPFILE" |
| |
| #check and ask for database user password. Must be done after database installation |
| if [[ -z $QUIET_MODE ]] |
| then |
| echo -e "\nCheking database connection and ask for credentials" |
| # echo "mysqladmin --defaults-extra-file=$TEMPFILE -s status >/dev/null" |
| while ! mysqladmin --defaults-extra-file="$TEMPFILE" -s status >/dev/null |
| do |
| [ -n "$logintry" ] && echo -e "\nInvalid database credentials!!!. Try again (Ctrl+c to abort)" |
| [ -z "$logintry" ] && echo -e "\nProvide database credentials" |
| read -e -p "database admin user? ($DB_ADMIN_USER) " DBUSER_ |
| [ -n "$DBUSER_" ] && DB_ADMIN_USER=$DBUSER_ |
| read -e -s -p "database admin password? (Enter for not using password) " DBPASSWD_ |
| [ -n "$DBPASSWD_" ] && DB_ADMIN_PASSWD="$DBPASSWD_" |
| [ -z "$DBPASSWD_" ] && DB_ADMIN_PASSWD="" |
| echo -e "[client]\n user='${DB_ADMIN_USER}'\n password='$DB_ADMIN_PASSWD'\n host='$DB_HOST'\n port='$DB_PORT'" > "$TEMPFILE" |
| logintry="yes" |
| done |
| fi |
| |
| if [[ ! -z "$UNINSTALL" ]] |
| then |
| _uninstall_db |
| exit |
| fi |
| |
| if [[ -z "$NO_PACKAGES" ]] |
| then |
| [ "$USER" != "root" ] && echo "Needed root privileges" >&2 && exit 1 |
| _install_mysql_package || exit 1 |
| fi |
| |
| # Create or update database |
| if db_exists $DB_NAME $TEMPFILE ; then |
| if [[ -n $FORCEDB ]] ; then |
| # DBDELETEPARAM="" |
| # [[ -n $QUIET_MODE ]] && DBDELETEPARAM="-f" |
| DBDELETEPARAM="-f" |
| _delete_db |
| _create_db |
| elif [[ -n $UPDATEDB ]] ; then |
| _update_db |
| elif [[ -z $QUIET_MODE ]] ; then |
| echo "database '$DB_NAME' exist. Reinstall it?" |
| if ask_user "Type 'y' to drop and reinstall existing database (content will be lost), Type 'n' to update existing database (y/N)? " n ; then |
| _delete_db |
| _create_db |
| else |
| _update_db |
| fi |
| else |
| echo "Database '$DB_NAME' exists. Use option '--forcedb' to force the deletion of the existing one, or '--updatedb' to use existing one and update it" |
| exit 1 |
| fi |
| else |
| _create_db |
| fi |
| |