403Webshell
Server IP : 147.79.79.112  /  Your IP : 216.73.217.88
Web Server : LiteSpeed
System : Linux in-mum-web1677.main-hosting.eu 5.14.0-611.55.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue May 19 15:19:29 EDT 2026 x86_64
User : u635632881 ( 635632881)
PHP Version : 8.2.31
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /proc/self/root/proc/self/root/opt/releem/conf/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /proc/self/root/proc/self/root/opt/releem/conf/install.sh
#!/usr/bin/env bash
# install.sh - Version 1.23.6.1
# (C) Releem, Inc 2022
# All rights reserved

export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
set -e -E

# Releem installation script: install and set up the Releem Agent on supported Linux distributions
# using the package manager.

# Set defaults.
install_script_version=1.23.6.1
logfile="/var/log/releem-install.log"
npipe=""

RELEEM_WORKDIR="${RELEEM_WORKDIR:-/opt/releem}"
RELEEM_CONF_FILE="$RELEEM_WORKDIR/releem.conf"
RELEEM_COMMAND="/bin/bash $RELEEM_WORKDIR/mysqlconfigurer.sh"
RELEEM_AGENT_BINARY_URL="https://releem.s3.amazonaws.com/v2/releem-agent-$(arch)"
RELEEM_AGENT_SCRIPT_URL="https://releem.s3.amazonaws.com/v2/mysqlconfigurer.sh"

# Root user detection
if [ "$(echo "$UID")" = "0" ]; then
    sudo_cmd=''
else
    sudo_cmd='sudo'
fi

function on_exit() {  
    if [[ "${RELEEM_REGION}" == "EU" ]]; then
        API_DOMAIN="api.queries.eu.releem.com"
    else
        API_DOMAIN="api.queries.releem.com"
    fi    
    curl -s -L -d @"$logfile" -H "x-releem-api-key: $apikey" -H "Content-Type: application/json" -X POST "https://${API_DOMAIN}/v2/events/saving_log"
    [ -n "$npipe" ] && rm -f "$npipe"
}
if [ -z "$RELEEM_TEST_MODE" ]; then
    trap on_exit EXIT
fi

function on_error() {
    printf "\033[31m $ERROR_MESSAGE\n"
    printf "\033[31m It looks like you encountered an issue while installing the Releem.\n"
    printf "\033[31m If you are still experiencing problems, please send an email to hello@releem.com \n"
    printf "\033[31m with the contents of the $logfile. We will do our best to resolve the issue.\n"
    printf "\033[0m\n"
}
if [ -z "$RELEEM_TEST_MODE" ]; then
    trap on_error ERR
fi

function setup_logging() {
    # Set up a named pipe for logging 
    npipe=/tmp/$$.install.tmp
    mknod "$npipe" p
    # Log all output to a log for error checking
    tee <"$npipe" "$logfile" &
    exec 1>&-
    exec 1>"$npipe" 2>&1
}
if [ -z "$RELEEM_TEST_MODE" ]; then
    setup_logging
fi

function releem_set_cron() {
    ($sudo_cmd crontab -l 2>/dev/null | grep -v "$RELEEM_WORKDIR/mysqlconfigurer.sh" || true; echo "$RELEEM_CRON") | $sudo_cmd crontab -
}

function releem_update() {
    detect_releem_api_key
    printf "\033[37m\n * Downloading latest version of Releem Agent.\033[0m\n"

    $sudo_cmd curl -w "%{http_code}" -L -o $RELEEM_WORKDIR/releem-agent.new $RELEEM_AGENT_BINARY_URL
    $sudo_cmd curl -w "%{http_code}" -L -o $RELEEM_WORKDIR/mysqlconfigurer.sh.new $RELEEM_AGENT_SCRIPT_URL
    $sudo_cmd $RELEEM_WORKDIR/releem-agent  stop || true
    $sudo_cmd mv $RELEEM_WORKDIR/releem-agent.new $RELEEM_WORKDIR/releem-agent
    $sudo_cmd mv $RELEEM_WORKDIR/mysqlconfigurer.sh.new $RELEEM_WORKDIR/mysqlconfigurer.sh
    $sudo_cmd chmod 755 $RELEEM_WORKDIR/mysqlconfigurer.sh   $RELEEM_WORKDIR/releem-agent
    $sudo_cmd $RELEEM_WORKDIR/releem-agent start || true
    $sudo_cmd $RELEEM_WORKDIR/releem-agent -f
    
    echo
    echo
    echo -e "Releem Agent updated successfully."
    echo
    echo -e "To check Releem Performance Score please visit https://app.releem.com/dashboard?menu=metrics"
    echo

    exit 0
}

# Detect instance type based on environment variables
function detect_instance_type() {
    instance_type="local"
    if [ -n "$RELEEM_INSTANCE_TYPE" ]; then
        instance_type=$RELEEM_INSTANCE_TYPE 
    fi
}

# Detect database type based on environment variables
function detect_database_type() {
    printf "\033[37m\n * Detecting database type based on environment variables.\033[0m\n"
    # Database type detection
    database_type="mysql"  # Default to MySQL for backward compatibility
    
    # Check for PostgreSQL environment variables
    if [[ -n "${RELEEM_PG_HOST+x}" ]] || [[ -n "${RELEEM_PG_LOGIN+x}" ]] || [[ -n "${RELEEM_PG_PASSWORD+x}" ]] || [[ -n "${RELEEM_PG_ROOT_PASSWORD+x}" ]]; then
        database_type="postgresql"
        printf "\033[37m   Detected PostgreSQL configuration.\033[0m\n"
    # Check for MySQL environment variables (fallback)
    elif [[ -n "${RELEEM_MYSQL_HOST+x}" ]] || [[ -n "${RELEEM_MYSQL_LOGIN+x}" ]] || [[ -n "${RELEEM_MYSQL_PASSWORD+x}" ]] || [[ -n "${RELEEM_MYSQL_ROOT_PASSWORD+x}" ]]; then
        database_type="mysql"
        printf "\033[37m   Detected MySQL configuration.\033[0m\n"
    else
        # Default to MySQL for backward compatibility
        database_type="mysql"
        printf "\033[37m   No specific database configuration detected, defaulting to MySQL.\033[0m\n"
    fi
}

# ================================================================================
# FUNCTIONS FOR LOCAL INSTANCE CONFIGURATION
# ================================================================================

function detect_mysql_commands() {
    local mysqladmin_cmd=""
    local mysql_cmd=""
    
    printf "\033[37m\n * Detecting MySQL/MariaDB commands.\033[0m\n"
    
    # Detect mysqladmin/mariadb-admin
    mysqladmin_cmd=$(which mariadb-admin 2>/dev/null || which mysqladmin 2>/dev/null || true)
    if [ -z "$mysqladmin_cmd" ]; then
        printf "\033[31m Couldn't find mysqladmin/mariadb-admin in your \$PATH. Correct the path to mysqladmin/mariadb-admin in a \$PATH variable \033[0m\n"
        on_error
        exit 1
    fi
    
    # Detect mysql/mariadb
    mysql_cmd=$(which mariadb 2>/dev/null || which mysql 2>/dev/null || true)
    if [ -z "$mysql_cmd" ]; then
        printf "\033[31m Couldn't find mysql/mariadb in your \$PATH. Correct the path to mysql/mariadb in a \$PATH variable \033[0m\n"
        on_error
        exit 1
    fi
    
    # Export as global variables
    mysqladmincmd="$mysqladmin_cmd"
    mysqlcmd="$mysql_cmd"
}

function detect_postgresql_commands() {
    local psql_cmd=""
    local pg_isready_cmd=""
    
    printf "\033[37m\n * Detecting PostgreSQL commands.\033[0m\n"
    
    # Detect psql
    psql_cmd=$(which psql 2>/dev/null || true)
    if [ -z "$psql_cmd" ]; then
        printf "\033[31m Couldn't find psql in your \$PATH. Please install PostgreSQL client tools or correct the \$PATH variable \033[0m\n"
        on_error
        exit 1
    fi

    # Detect pg_isready
    pg_isready_cmd=$(which pg_isready 2>/dev/null || true)
    # if [ -z "$pg_isready_cmd" ]; then
    #     printf "\033[31m Couldn't find pg_isready in your \$PATH. Please install PostgreSQL client tools \033[0m\n"
    #     on_error
    #     exit 1
    # fi    

    # Export as global variables
    psqlcmd="$psql_cmd"
    pg_isreadycmd="$pg_isready_cmd"

    printf "\033[37m   Found psql: %s\033[0m\n" "$psql_cmd"
    printf "\033[37m   Found pg_isready: %s\033[0m\n" "$pg_isready_cmd"
}

function setup_mysql_connection_string() {
    printf "\033[37m\n * Setting up MySQL connection parameters.\033[0m\n"
    
    connection_string=""  
    root_connection_string=""
    
    if [ -n "$RELEEM_MYSQL_HOST" ]; then
        if [ -S "$RELEEM_MYSQL_HOST" ]; then
            mysql_user_host="localhost"
            connection_string="${connection_string} --socket=${RELEEM_MYSQL_HOST}"
            root_connection_string="${root_connection_string} --socket=${RELEEM_MYSQL_HOST}"
            printf "\033[37m   Using socket: %s\033[0m\n" "$RELEEM_MYSQL_HOST"
        else
            if [ "$RELEEM_MYSQL_HOST" == "127.0.0.1" ]; then
                mysql_user_host="127.0.0.1"
            else
                mysql_user_host="%"
            fi
            connection_string="${connection_string} --host=${RELEEM_MYSQL_HOST}"
            
            if [ -n "$RELEEM_MYSQL_PORT" ]; then
                connection_string="${connection_string} --port=${RELEEM_MYSQL_PORT}"
            else
                connection_string="${connection_string} --port=3306"
            fi
            printf "\033[37m   Using host: %s, port: %s\033[0m\n" "$RELEEM_MYSQL_HOST" "${RELEEM_MYSQL_PORT:-3306}"
        fi
    else
        mysql_user_host="127.0.0.1"
        connection_string="${connection_string} --host=127.0.0.1"
        
        if [ -n "$RELEEM_MYSQL_PORT" ]; then
            connection_string="${connection_string} --port=${RELEEM_MYSQL_PORT}"
        else
            connection_string="${connection_string} --port=3306"
        fi
        printf "\033[37m   Using default: 127.0.0.1:%s\033[0m\n" "${RELEEM_MYSQL_PORT:-3306}"
    fi
}

function setup_postgresql_connection_string() {
    printf "\033[37m\n * Setting up PostgreSQL connection parameters.\033[0m\n"
    
    pg_connection_string=""
    pg_root_connection_string=""
    pg_root_peer_connection=""

    # Set PostgreSQL host
    if [ -z "$RELEEM_PG_ROOT_PASSWORD" ]; then
        pg_root_connection_string="${pg_root_connection_string}"
        pg_root_peer_connection="sudo -u postgres "
    else
        pg_root_connection_string="${pg_root_connection_string} -h ${RELEEM_PG_HOST:-127.0.0.1}"            
    fi
    pg_connection_string="${pg_connection_string} -h ${RELEEM_PG_HOST:-127.0.0.1}"            


    # Set PostgreSQL port
    pg_connection_string="${pg_connection_string} -p ${RELEEM_PG_PORT:-5432}"
    pg_root_connection_string="${pg_root_connection_string} -p ${RELEEM_PG_PORT:-5432}"

    printf "\033[37m   Using connection params: admin - '%s psql %s', user - '%s'\033[0m\n" "$pg_root_peer_connection" "$pg_root_connection_string" "$pg_connection_string"

    # Set database name (default to postgres)
    pg_database="${RELEEM_PG_DATABASE:-postgres}"
    pg_connection_string="${pg_connection_string} -d ${pg_database}"
    pg_root_connection_string="${pg_root_connection_string} -d ${pg_database}"
}

function detect_mysql_service() {
    printf "\033[37m\n * Detecting MySQL service name for database server restart.\033[0m\n"

    local systemctl_cmd
    systemctl_cmd=$(which systemctl 2>/dev/null || true)

    if [ -n "$systemctl_cmd" ]; then
        # Check if MySQL is running
        if $sudo_cmd $systemctl_cmd status mariadb >/dev/null 2>&1; then
            service_name_cmd="$sudo_cmd $systemctl_cmd restart mariadb"
        elif $sudo_cmd $systemctl_cmd status mysql >/dev/null 2>&1; then
            service_name_cmd="$sudo_cmd $systemctl_cmd restart mysql"
        elif $sudo_cmd $systemctl_cmd status mysqld >/dev/null 2>&1; then
            service_name_cmd="$sudo_cmd $systemctl_cmd restart mysqld"
        else
            printf "\033[31m\n * Failed to determine systemd service to restart.\033[0m"
        fi
    else
        # Check if MySQL is running
        if [ -f /etc/init.d/mysql ]; then
            service_name_cmd="$sudo_cmd /etc/init.d/mysql restart"
        elif [ -f /etc/init.d/mysqld ]; then
            service_name_cmd="$sudo_cmd /etc/init.d/mysqld restart"
        elif [ -f /etc/init.d/mariadb ]; then
            service_name_cmd="$sudo_cmd /etc/init.d/mariadb restart"
        else
            printf "\033[31m\n * Failed to determine init.d service to restart.\033[0m"
        fi
    fi
    
    if [ -z "$service_name_cmd" ]; then
        printf "\033[31m\n   The automatic applying configuration will not work. \n\033[0m"
    fi
}

function detect_postgresql_service() {
    printf "\033[37m\n * Detecting PostgreSQL service name for database server restart.\033[0m\n"

    local systemctl_cmd
    systemctl_cmd=$(which systemctl 2>/dev/null || true)

    if [ -n "$systemctl_cmd" ]; then
        # Check if PostgreSQL is running
        if $sudo_cmd $systemctl_cmd status postgresql >/dev/null 2>&1; then
            pg_service_name_cmd="$sudo_cmd $systemctl_cmd restart postgresql"
        elif $sudo_cmd $systemctl_cmd status postgresql-* >/dev/null 2>&1; then
            # Try to find versioned PostgreSQL service
            pg_service=$(systemctl list-units --type=service | grep -o 'postgresql-[0-9][0-9]*\.service' | head -n1 | sed 's/\.service//')
            if [ -n "$pg_service" ]; then
                pg_service_name_cmd="$sudo_cmd $systemctl_cmd restart $pg_service"
            else
                printf "\033[31m\n * Failed to determine PostgreSQL systemd service to restart.\033[0m"
            fi
        else
            printf "\033[31m\n * Failed to determine PostgreSQL systemd service to restart.\033[0m"
        fi
    else
        # Check if PostgreSQL is running with init.d
        if [ -f /etc/init.d/postgresql ]; then
            pg_service_name_cmd="$sudo_cmd /etc/init.d/postgresql restart"
        else
            printf "\033[31m\n * Failed to determine PostgreSQL init.d service to restart.\033[0m"
        fi
    fi
    
    if [ -z "$pg_service_name_cmd" ]; then
        printf "\033[31m\n   The automatic applying PostgreSQL configuration will not work. \n\033[0m"
    else
        printf "\033[37m   PostgreSQL restart command: %s\033[0m\n" "$pg_service_name_cmd"
    fi
}

function setup_mysql_config_directory() {
    MYSQL_CONF_DIR="/etc/mysql/releem.conf.d"

    printf "\033[37m\n * Setting up MySQL configuration directory.\033[0m\n"
    if [ -n "$RELEEM_MYSQL_MY_CNF_PATH" ]; then
        MYSQL_MY_CNF_PATH=$RELEEM_MYSQL_MY_CNF_PATH
        printf "\033[37m   Using provided my.cnf path: %s\033[0m\n" "$MYSQL_MY_CNF_PATH"
    else
        if [ -f "/etc/my.cnf" ]; then
            MYSQL_MY_CNF_PATH="/etc/my.cnf"
        elif [ -f "/etc/mysql/my.cnf" ]; then
            MYSQL_MY_CNF_PATH="/etc/mysql/my.cnf"
        else
            read -p "File my.cnf not found in default path. Please set the current location of the configuration file: " -r
            echo    # move to a new line
            MYSQL_MY_CNF_PATH=$REPLY
        fi
    fi
    if [ ! -f "$MYSQL_MY_CNF_PATH" ]; then
        printf "\033[31m * File $MYSQL_MY_CNF_PATH not found. The automatic applying configuration is disabled. Please, reinstall the Releem Agent.\033[0m\n"
    else
        printf "\033[37m\n * The $MYSQL_MY_CNF_PATH file is being used to apply Releem is recommended settings.\n\033[0m"
        printf "\033[37m\n * Adding directive includedir to the MySQL configuration $MYSQL_MY_CNF_PATH.\n\033[0m"
        $sudo_cmd mkdir -p $MYSQL_CONF_DIR
        $sudo_cmd chmod 755 $MYSQL_CONF_DIR
        #Исключить дублирование
        if [ `$sudo_cmd grep -cE "!includedir $MYSQL_CONF_DIR" $MYSQL_MY_CNF_PATH` -eq 0 ];
        then
            echo -e "\n!includedir $MYSQL_CONF_DIR" | $sudo_cmd tee -a $MYSQL_MY_CNF_PATH >/dev/null
        fi
    fi    
}

function setup_postgresql_config_directory() {
    printf "\033[37m\n * Setting up PostgreSQL configuration directory.\033[0m\n"
    
    # Find PostgreSQL configuration file
    if [ -n "$RELEEM_PG_CONF_DIR" ]; then
        PG_CONF_DIR="$RELEEM_PG_CONF_DIR"
        printf "\033[37m   Using provided conf.d directory: %s\033[0m\n" "$PG_CONF_DIR"
    else
        # Try common PostgreSQL configuration paths
        for pg_version in 18 17 16 15 14 13 12 11 10 9.6 9.5; do
            if [ -f "/etc/postgresql/${pg_version}/main/postgresql.conf" ]; then
                PG_CONF_DIR="/etc/postgresql/${pg_version}/main/conf.d"
                break
            elif [ -f "/var/lib/pgsql/${pg_version}/data/postgresql.conf" ]; then
                PG_CONF_DIR="/var/lib/pgsql/${pg_version}/data/conf.d"
                break
            fi
        done
        
        # Try generic paths
        if [ -z "$PG_CONF_DIR" ]; then
            if [ -f "/etc/postgresql/postgresql.conf" ]; then
                PG_CONF_DIR="/etc/postgresql/conf.d"
            elif [ -f "/var/lib/pgsql/data/postgresql.conf" ]; then
                PG_CONF_DIR="/var/lib/pgsql/data/conf.d"
            else
                printf "\033[33m Warning: PostgreSQL configuration directory not found in standard locations.\033[0m\n"
                printf "\033[33m Please set RELEEM_PG_CONF_DIR environment variable.\033[0m\n"
                return
            fi
        fi
    fi
    
    if [ ! -d "$PG_CONF_DIR" ]; then
        printf "\033[31m * File $PG_CONF_DIR not found. The automatic applying PostgreSQL configuration is disabled.\033[0m\n"
    else
        printf "\033[37m   Using PostgreSQL configuration directory: %s\033[0m\n" "$PG_CONF_DIR"
    fi
}

function create_mysql_user() {
    printf "\033[37m\n * Configuring the MySQL user for metrics collection.\033[0m\n"
    FLAG_SUCCESS=0
    if [ -n "$RELEEM_MYSQL_PASSWORD" ] && [ -n "$RELEEM_MYSQL_LOGIN" ]; then
        printf "\033[37m\n * Using MySQL login and password from environment variables\033[0m\n"
        FLAG_SUCCESS=1
    #elif [ -n "$RELEEM_MYSQL_ROOT_PASSWORD" ]; then
    else
        printf "\033[37m\n * Using MySQL root user.\033[0m\n"
        if [[ $($mysqladmincmd ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} ping 2>/dev/null || true) == "mysqld is alive" ]];
        then
            printf "\033[37m\n MySQL connection successful.\033[0m\n"
            RELEEM_MYSQL_LOGIN="releem"
            RELEEM_MYSQL_PASSWORD=$(cat /dev/urandom | tr -cd '%*)?@#~' | head -c2 ; cat /dev/urandom | tr -cd '%*)?@#~A-Za-z0-9%*)?@#~' | head -c16 ; cat /dev/urandom | tr -cd '%*)?@#~' | head -c2 )
            $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "DROP USER '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}' ;" 2>/dev/null || true
            $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "CREATE USER '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}' identified by '${RELEEM_MYSQL_PASSWORD}';"
            $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT PROCESS ON *.* TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';"
            $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT REPLICATION CLIENT ON *.* TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';"
            $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT SHOW VIEW ON *.* TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';"        
            $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT SELECT ON mysql.* TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';"        

            if $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT SELECT ON performance_schema.events_statements_summary_by_digest TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';" 
            then
                echo "Successfully GRANT" > /dev/null
            else
                printf "\033[31m\n This database version is too old, and it doesn't collect SQL Queries Latency metrics. You will not see Latency on the Dashboard.\033[0m\n"
            fi
            if $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT SELECT ON performance_schema.table_io_waits_summary_by_index_usage TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';" 
            then
                echo "Successfully GRANT" > /dev/null
            else
                printf "\033[31m\n This database version is too old.\033[0m\n"
            fi   

            if $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT SELECT ON performance_schema.file_summary_by_instance TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';" 
            then
                echo "Successfully GRANT" > /dev/null
            else
                printf "\033[31m\n This database version is too old.\033[0m\n"
            fi      

            if $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';" 2>/dev/null
            then
                echo "Successfully GRANT" > /dev/null
            else
                if $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT SUPER ON *.* TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';" 
                then
                    echo "Successfully GRANT" > /dev/null
                else
                    printf "\033[31m\n Error granting privileges to apply without restarting.\033[0m\n"
                fi         
            fi 

            if [ -n $RELEEM_QUERY_OPTIMIZATION ]; 
            then
                $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT SELECT ON *.* TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';"
            fi        

            #$mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "GRANT SELECT, PROCESS,EXECUTE, REPLICATION CLIENT,SHOW DATABASES,SHOW VIEW ON *.* TO '${RELEEM_MYSQL_LOGIN}'@'${mysql_user_host}';"
            printf "\033[32m\n Created new user \`${RELEEM_MYSQL_LOGIN}\`\033[0m\n"
            FLAG_SUCCESS=1
        else
            printf "\033[31m\n%s\n%s\033[0m\n" "MySQL connection failed with user root." "Check that the password is correct, the execution of the command \`${mysqladmincmd} ${root_connection_string} --user=root --password=<MYSQL_ROOT_PASSWORD> ping\` and reinstall the agent."
            $mysqladmincmd ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} ping || true
            on_error
            exit 1
        fi
    fi
    if [ "$FLAG_SUCCESS" == "1" ]; then
        if [[ $($mysqladmincmd ${connection_string} --user=${RELEEM_MYSQL_LOGIN} --password=${RELEEM_MYSQL_PASSWORD} ping 2>/dev/null || true) == "mysqld is alive" ]];
        then
            printf "\033[32m\n MySQL connection with user \`${RELEEM_MYSQL_LOGIN}\` - successful. \033[0m\n"
            MYSQL_LOGIN=$RELEEM_MYSQL_LOGIN
            MYSQL_PASSWORD=$RELEEM_MYSQL_PASSWORD
        else
            printf "\033[31m\n%s\n%s\033[0m\n" "MySQL connection failed with user \`${RELEEM_MYSQL_LOGIN}\`." "Check that the user and password is correct, the execution of the command \`${mysqladmincmd} ${connection_string} --user=${RELEEM_MYSQL_LOGIN} --password='${RELEEM_MYSQL_PASSWORD}' ping\` and reinstall the agent."
            $mysqladmincmd ${connection_string} --user=${RELEEM_MYSQL_LOGIN} --password=${RELEEM_MYSQL_PASSWORD} ping || true
            on_error
            exit 1
        fi
    fi
}

function create_postgresql_user() {
    printf "\033[37m\n * Configuring the PostgreSQL user for metrics collection.\033[0m\n"
    FLAG_SUCCESS=0
    
    if [ -n "$RELEEM_PG_PASSWORD" ] && [ -n "$RELEEM_PG_LOGIN" ]; then
        printf "\033[37m - Using PostgreSQL login and password from environment variables\033[0m\n"
        FLAG_SUCCESS=1
    else
        printf "\033[37m - Using PostgreSQL superuser for user creation.\033[0m\n"        
        # Test connection with superuser (usually postgres)
        pg_superuser="${RELEEM_PG_ROOT_LOGIN:-postgres}"            
        if PGPASSWORD=${RELEEM_PG_ROOT_PASSWORD} ${pg_root_peer_connection} $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "SELECT VERSION()" >/dev/null 2>&1; then

            printf "\033[37m - PostgreSQL connection successful.\033[0m\n"
            
            # Set default user and generate password
            RELEEM_PG_LOGIN="releem"
            RELEEM_PG_PASSWORD=$(cat /dev/urandom | tr -cd '%*)?@#~' | head -c2 ; cat /dev/urandom | tr -cd '%*)?@#~A-Za-z0-9%*)?@#~' | head -c16 ; cat /dev/urandom | tr -cd '%*)?@#~' | head -c2 )
            
            # Update the password for an existing role, otherwise create it.
            if PGPASSWORD=${RELEEM_PG_ROOT_PASSWORD} ${pg_root_peer_connection} $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -tAc "SELECT 1 FROM pg_roles WHERE rolname = '${RELEEM_PG_LOGIN}';" 2>/dev/null | grep -q "1"; then
                PGPASSWORD=${RELEEM_PG_ROOT_PASSWORD} ${pg_root_peer_connection} $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "ALTER USER ${RELEEM_PG_LOGIN} WITH PASSWORD '${RELEEM_PG_PASSWORD}';" 2>/dev/null
                printf "\033[32m   Updated password for existing PostgreSQL user \`${RELEEM_PG_LOGIN}\`\033[0m\n"
            else
                PGPASSWORD=${RELEEM_PG_ROOT_PASSWORD} ${pg_root_peer_connection} $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "CREATE USER ${RELEEM_PG_LOGIN} WITH PASSWORD '${RELEEM_PG_PASSWORD}';" 2>/dev/null
                printf "\033[32m   Created new PostgreSQL user \`${RELEEM_PG_LOGIN}\`\033[0m\n"
            fi
            
            # Grant necessary permissions
            PGPASSWORD=${RELEEM_PG_ROOT_PASSWORD} ${pg_root_peer_connection} $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "GRANT pg_monitor TO ${RELEEM_PG_LOGIN};" 2>/dev/null 
            PGPASSWORD=${RELEEM_PG_ROOT_PASSWORD} ${pg_root_peer_connection} $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "GRANT SELECT ON pg_hba_file_rules TO ${RELEEM_PG_LOGIN};" 2>/dev/null 
            PGPASSWORD=${RELEEM_PG_ROOT_PASSWORD} ${pg_root_peer_connection} $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "GRANT EXECUTE ON FUNCTION pg_hba_file_rules TO ${RELEEM_PG_LOGIN};" 2>/dev/null 


            # # Try to grant access to pg_stat_statements if available
            # if $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "SELECT 1 FROM pg_extension WHERE extname = 'pg_stat_statements';" | grep -q 1; then
            #     $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "GRANT SELECT ON pg_stat_statements TO ${RELEEM_PG_LOGIN};" 2>/dev/null || true
            #     printf "\033[37m   Granted access to pg_stat_statements extension.\033[0m\n"
            # fi
            # Check if pg_stat_statements extension is available
            FLAG_PG_STAT_STATEMENTS=1
            if PGPASSWORD=${RELEEM_PG_ROOT_PASSWORD} ${pg_root_peer_connection} $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "SELECT 1 FROM pg_extension WHERE extname = 'pg_stat_statements';" 2>/dev/null  | grep -q "1" 2>/dev/null; then
                printf "\033[32m - pg_stat_statements extension is available for query performance monitoring.\033[0m\n"
            else
                printf "\033[37m - Installing pg_stat_statements extension.\033[0m\n"
                
                if PGPASSWORD=${RELEEM_PG_ROOT_PASSWORD} ${pg_root_peer_connection} $psqlcmd ${pg_root_connection_string} -U ${pg_superuser} -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;" 2>/dev/null; then
                    printf "\033[32m   Successfully installed pg_stat_statements extension.\033[0m\n"
                else
                    FLAG_PG_STAT_STATEMENTS=0
                    printf "\033[33m   Warning: Failed to install pg_stat_statements extension. Query performance monitoring may be limited.\033[0m\n"
                fi
            fi            
            FLAG_SUCCESS=1
        else
            printf "\033[31m\n%s\n%s\033[0m\n" "PostgreSQL connection failed with superuser ${pg_superuser}." "Check that PostgreSQL is running and accessible, or set RELEEM_PG_ROOT_PASSWORD if authentication is required."
            on_error
            exit 1        
        fi
    fi
    
    # Test connection with the monitoring user
    if [ "$FLAG_SUCCESS" == "1" ]; then
        if PGPASSWORD=${RELEEM_PG_PASSWORD} $psqlcmd ${pg_connection_string} -U ${RELEEM_PG_LOGIN} -c "SELECT VERSION()" >/dev/null 2>&1; then
            printf "\033[32m\n   PostgreSQL connection with user \`${RELEEM_PG_LOGIN}\` - successful. \033[0m\n"
            PG_LOGIN=$RELEEM_PG_LOGIN
            PG_PASSWORD=$RELEEM_PG_PASSWORD

            if [ -z "${FLAG_PG_STAT_STATEMENTS+x}" ]; then
                FLAG_PG_STAT_STATEMENTS=1
                if PGPASSWORD=${RELEEM_PG_PASSWORD} $psqlcmd ${pg_connection_string} -U ${RELEEM_PG_LOGIN} -tAc "SELECT 1 FROM pg_extension WHERE extname = 'pg_stat_statements';" 2>/dev/null | grep -q "1" 2>/dev/null; then
                    printf "\033[32m   pg_stat_statements extension is available for query performance monitoring.\033[0m\n"
                else
                    FLAG_PG_STAT_STATEMENTS=0
                    printf "\033[33m   Warning: pg_stat_statements extension is unavailable. Query performance monitoring may be limited.\033[0m\n"
                fi
            fi

            printf "\033[37m - Validating PostgreSQL access required for security collectors.\033[0m\n"

            if PGPASSWORD=${RELEEM_PG_PASSWORD} $psqlcmd ${pg_connection_string} -U ${RELEEM_PG_LOGIN} -t -c "SELECT 1 FROM pg_extension LIMIT 1;" >/dev/null 2>&1; then
                printf "\033[32m   Access to pg_extension is available.\033[0m\n"
            else
                printf "\033[33m   Warning: access to pg_extension is unavailable. Extension-based security checks may be incomplete.\033[0m\n"
            fi

            if PGPASSWORD=${RELEEM_PG_PASSWORD} $psqlcmd ${pg_connection_string} -U ${RELEEM_PG_LOGIN} -t -c "SELECT 1 FROM pg_roles LIMIT 1;" >/dev/null 2>&1; then
                printf "\033[32m   Access to pg_roles is available.\033[0m\n"
            else
                printf "\033[33m   Warning: access to pg_roles is unavailable. Role-based security checks may be incomplete.\033[0m\n"
            fi

            if PGPASSWORD=${RELEEM_PG_PASSWORD} $psqlcmd ${pg_connection_string} -U ${RELEEM_PG_LOGIN} -t -c "SELECT 1 FROM pg_auth_members LIMIT 1;" >/dev/null 2>&1; then
                printf "\033[32m   Access to pg_auth_members is available.\033[0m\n"
            else
                printf "\033[33m   Warning: access to pg_auth_members is unavailable. Role membership checks may be incomplete.\033[0m\n"
            fi

            if PGPASSWORD=${RELEEM_PG_PASSWORD} $psqlcmd ${pg_connection_string} -U ${RELEEM_PG_LOGIN} -t -c "SELECT * FROM pg_hba_file_rules LIMIT 1;" >/dev/null 2>&1; then
                printf "\033[32m   Access to pg_hba_file_rules is available.\033[0m\n"
            else
                printf "\033[33m   Warning: access to pg_hba_file_rules is unavailable. pg_hba-based security checks may be incomplete.\033[0m\n"
            fi

            if PGPASSWORD=${RELEEM_PG_PASSWORD} $psqlcmd ${pg_connection_string} -U ${RELEEM_PG_LOGIN} -t -c "SELECT has_schema_privilege('public', 'public', 'USAGE');" >/dev/null 2>&1; then
                printf "\033[32m   Access to schema privilege inspection is available.\033[0m\n"
            else
                printf "\033[33m   Warning: schema privilege inspection is unavailable. PUBLIC schema permission checks may be incomplete.\033[0m\n"
            fi

            if PGPASSWORD=${RELEEM_PG_PASSWORD} $psqlcmd ${pg_connection_string} -U ${RELEEM_PG_LOGIN} -t -c "SELECT EXISTS (SELECT 1 FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('r', 'p') AND n.nspname NOT IN ('pg_catalog', 'information_schema') AND c.relrowsecurity);" >/dev/null 2>&1; then
                printf "\033[32m   Access to RLS metadata is available.\033[0m\n"
            else
                printf "\033[33m   Warning: access to RLS metadata is unavailable. RLS reporting may be incomplete.\033[0m\n"
            fi
        else
            printf "\033[31m\n%s\n%s\033[0m\n" "PostgreSQL connection failed with user \`${RELEEM_PG_LOGIN}\`." "Check that the host, user and password are correct and the user has necessary permissions."
            PGPASSWORD=${RELEEM_PG_PASSWORD} $psqlcmd ${pg_connection_string} -U ${RELEEM_PG_LOGIN} -c "SELECT VERSION()" || true
            on_error
            exit 1
        fi
    fi
}

function configure_connection_parameters() {
    # Setting up local instance using dedicated function
    if [ "$instance_type" == "local" ]; then
        if [ "$database_type" == "postgresql" ]; then
            configure_local_postgresql_instance
        elif [ "$database_type" == "mysql" ]; then
            configure_local_mysql_instance
        fi
    fi
}

function configure_local_mysql_instance() {   
    # Step 1: Detect MySQL commands
    detect_mysql_commands
    
    # Step 2: Setup connection parameters
    setup_mysql_connection_string
}

function configure_local_postgresql_instance() {   
    # Step 1: Detect PostgreSQL commands
    detect_postgresql_commands
    
    # Step 2: Setup connection parameters
    setup_postgresql_connection_string
}

function setting_up_database_instance() {
    # Setting up local instance using dedicated function
    if [ "$instance_type" == "local" ]; then
        if [ "$database_type" == "postgresql" ]; then
            setting_up_local_postgresql_instance
        elif [ "$database_type" == "mysql" ]; then
            setting_up_local_mysql_instance
        fi
    else
        printf "\033[37m\n * Using login and password from environment variables\033[0m\n"
        if [ "$database_type" == "postgresql" ]; then
            PG_LOGIN=$RELEEM_PG_LOGIN
            PG_PASSWORD=$RELEEM_PG_PASSWORD
        elif [ "$database_type" == "mysql" ]; then
            MYSQL_LOGIN=$RELEEM_MYSQL_LOGIN
            MYSQL_PASSWORD=$RELEEM_MYSQL_PASSWORD
        fi
    fi
}

function setting_up_local_mysql_instance() {
    # Step 3: Detect MySQL service
    detect_mysql_service
    
    # Step 4: Setup configuration directory
    setup_mysql_config_directory
    
    # Step 5: Create MySQL user
    create_mysql_user    
}

function setting_up_local_postgresql_instance() {
    # Step 3: Detect PostgreSQL service
    detect_postgresql_service
    
    # Step 4: Setup configuration directory
    setup_postgresql_config_directory
    
    # Step 5: Create PostgreSQL user
    create_postgresql_user    
}

function restart_service_releem_agent() {
    printf "\033[37m\n * Starting Releem Agent service to collect metrics..\033[0m\n"
    set +e
    trap - ERR
    releem_agent_stop=$($sudo_cmd $RELEEM_WORKDIR/releem-agent  stop)
    releem_agent_start=$($sudo_cmd $RELEEM_WORKDIR/releem-agent  start)
    if [ $? -eq 0 ]; then
        printf "\033[32m\n Restarting Releem Agent - successful\033[0m\n"
    else
        echo $releem_agent_stop
        echo $releem_agent_start
        printf "\033[31m\n Restarting Releem Agent - failed\033[0m\n"
    fi
    trap on_error ERR
    set -e
    sleep 3
    releem_agent_pid=$(pgrep releem-agent || true)
    if [ -z "$releem_agent_pid" ]; then
        printf "\033[31m\n The releem-agent process was not found! Check the system log for an error.\033[0m\n"
        on_error
        exit 1;
    fi
}

function reinstall_service_releem_agent() {
    printf "\033[37m\n * Installing Releem Agent service to collect metrics..\033[0m\n"
    set +e
    trap - ERR    
    releem_agent_remove=$($sudo_cmd $RELEEM_WORKDIR/releem-agent remove)
    releem_agent_install=$($sudo_cmd $RELEEM_WORKDIR/releem-agent install)
    if [ $? -eq 0 ]; then
        printf "\033[32m\n The Releem Agent installation successful.\033[0m\n"
    else
        echo $releem_agent_remove
        echo $releem_agent_install
        printf "\033[31m\n The Releem Agent installation failed.\033[0m\n"
    fi
    trap on_error ERR
    set -e    
}    

function configure_crontab() {
    printf "\033[37m\n * Configuring crontab.\033[0m\n"
    RELEEM_CRON="00 00 * * * PATH=/bin:/sbin:/usr/bin:/usr/sbin $RELEEM_COMMAND -u"
    if [ -z "$RELEEM_CRON_ENABLE" ]; then
        printf "\033[37m Please add the following string in crontab to get recommendations:\033[0m\n"
        printf "\033[32m$RELEEM_CRON\033[0m\n\n"
        read -p "Can we do it automatically? (Y/N) " -n 1 -r
        echo    # move to a new line
        if [[ $REPLY =~ ^[Yy]$ ]]
        then
            releem_set_cron
        fi
    elif [ "$RELEEM_CRON_ENABLE" -gt 0 ]; then
        releem_set_cron
        if [ `$sudo_cmd crontab -l 2>/dev/null | grep -c "$RELEEM_WORKDIR/mysqlconfigurer.sh" || true` -eq 0 ]; then
            printf "\033[31m   Crontab configuration failed. Automatic updates are disabled.\033[0m\n"
        else
            printf "\033[32m   Crontab configuration complete. Automatic updates are enabled.\033[0m\n"
        fi
    else
        printf "\033[31m   Crontab isn't configured. Automatic updates are disabled.\033[0m\n"
    fi    
}


function configure_db_memory_limit() {
    printf "\033[37m\n * Configuring DB memory limit\033[0m\n"
    if [ -n "$RELEEM_DB_MEMORY_LIMIT" ]; then
        if [ "$RELEEM_DB_MEMORY_LIMIT" -gt 0 ]; then
            DB_MEMORY_LIMIT=$RELEEM_DB_MEMORY_LIMIT
        fi
    elif [ -n "$RELEEM_MYSQL_MEMORY_LIMIT" ]; then
        if [ "$RELEEM_MYSQL_MEMORY_LIMIT" -gt 0 ]; then
            DB_MEMORY_LIMIT=$RELEEM_MYSQL_MEMORY_LIMIT
        fi    
    else
        echo
        printf "\033[37m\n In case you are using Database in Docker or it isn't dedicated server for Database.\033[0m\n"
        read -p "Should we limit memory for Database? (Y/N) " -n 1 -r
        echo    # move to a new line
        if [[ $REPLY =~ ^[Yy]$ ]]
        then
            read -p "Please set Database Memory Limit (megabytes):" -r
            echo    # move to a new line
            DB_MEMORY_LIMIT=$REPLY
        fi
    fi
}    

function download_releem_agent() {
    $sudo_cmd rm -rf $RELEEM_WORKDIR
    # Create work directory
    if [ ! -e $RELEEM_CONF_FILE ]; then
        $sudo_cmd mkdir -p $RELEEM_WORKDIR
        $sudo_cmd mkdir -p $RELEEM_WORKDIR/conf
    fi

    printf "\033[37m\n * Downloading Releem Agent, architecture $(arch).\033[0m\n"
    $sudo_cmd curl -L -o $RELEEM_WORKDIR/releem-agent $RELEEM_AGENT_BINARY_URL
    $sudo_cmd curl -L -o $RELEEM_WORKDIR/mysqlconfigurer.sh $RELEEM_AGENT_SCRIPT_URL
    $sudo_cmd chmod 755 $RELEEM_WORKDIR/mysqlconfigurer.sh $RELEEM_WORKDIR/releem-agent
}

function configure_releem_agent() {
    printf "\033[37m\n * Saving variables to Releem Agent configuration\033[0m\n"

    printf "\033[37m - Adding API key to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
    echo "apikey=\"$apikey\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    printf "\033[37m - Adding Releem Agent directory $RELEEM_WORKDIR to Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
    echo "releem_dir=\"$RELEEM_WORKDIR\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    if [ -d "$RELEEM_WORKDIR/conf" ]; then
        printf "\033[37m - Adding Releem Configuration Directory $RELEEM_WORKDIR/conf to Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
        echo "releem_cnf_dir=\"$RELEEM_WORKDIR/conf\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    fi
    # Add database-specific configuration based on detected database type
    if [ "$database_type" == "postgresql" ]; then
        # PostgreSQL configuration
        if [ -n "$PG_LOGIN" ] && [ -n "$PG_PASSWORD" ]; then
            printf "\033[37m - Adding PostgreSQL user and password to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "pg_user=\"$PG_LOGIN\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            echo "pg_password=\"$PG_PASSWORD\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
        if [ -n "$RELEEM_PG_HOST" ]; then
            printf "\033[37m - Adding PostgreSQL host to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "pg_host=\"$RELEEM_PG_HOST\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
        if [ -n "$RELEEM_PG_PORT" ]; then
            printf "\033[37m - Adding PostgreSQL port to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "pg_port=\"$RELEEM_PG_PORT\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
        if [ -n "$RELEEM_PG_SSL_MODE" ]; then
            printf "\033[37m - Adding PostgreSQL SSL mode to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "pg_ssl_mode=\"$RELEEM_PG_SSL_MODE\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
        if [ -n "$pg_service_name_cmd" ]; then
            printf "\033[37m - Adding PostgreSQL restart command to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "pg_restart_service=\"$pg_service_name_cmd\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
        if [ -d "$PG_CONF_DIR" ]; then
            printf "\033[37m - Adding PostgreSQL conf.d directory to the Releem Agent configuration $RELEEM_CONF_FILE.\n\033[0m"
            echo "pg_cnf_dir=\"$PG_CONF_DIR\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi    
    elif [ "$database_type" == "mysql" ]; then
        # MySQL configuration (default)
        if [ -n "$MYSQL_LOGIN" ] && [ -n "$MYSQL_PASSWORD" ]; then
            printf "\033[37m - Adding user and password mysql to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "mysql_user=\"$MYSQL_LOGIN\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            echo "mysql_password=\"$MYSQL_PASSWORD\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
        if [ -n "$RELEEM_MYSQL_HOST" ]; then
            printf "\033[37m - Adding MySQL host to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "mysql_host=\"$RELEEM_MYSQL_HOST\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
        if [ -n "$RELEEM_MYSQL_PORT" ]; then
            printf "\033[37m - Adding MySQL port to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "mysql_port=\"$RELEEM_MYSQL_PORT\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
        if [ -n "$RELEEM_MYSQL_SSL_MODE" ]; then
            echo "mysql_ssl_mode=$RELEEM_MYSQL_SSL_MODE" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi    
        if [ -n "$service_name_cmd" ]; then
            printf "\033[37m - Adding MySQL restart command to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "mysql_restart_service=\"$service_name_cmd\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
        if [ -d "$MYSQL_CONF_DIR" ]; then
            printf "\033[37m - Adding MySQL include directory to the Releem Agent configuration $RELEEM_CONF_FILE.\n\033[0m"
            echo "mysql_cnf_dir=\"$MYSQL_CONF_DIR\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        fi
    fi
    if [ -n "$DB_MEMORY_LIMIT" ]; then
        printf "\033[37m - Adding Memory Limit to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
        echo "memory_limit=\"$DB_MEMORY_LIMIT\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    fi
    if [ -n "$RELEEM_HOSTNAME" ]; then
        printf "\033[37m - Adding hostname to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
        echo "hostname=\"$RELEEM_HOSTNAME\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    else
        RELEEM_HOSTNAME=$(hostname 2>&1)
        if [ $? -eq 0 ];
        then
            printf "\033[37m - Adding autodetected hostname to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "hostname=\"$RELEEM_HOSTNAME\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null        
        else
            printf "\033[31m The variable RELEEM_HOSTNAME is not defined and the hostname could not be determined automatically with error\033[0m\n $RELEEM_HOSTNAME.\n\033[0m"
        fi
    fi
    if [ -n "$RELEEM_ENV" ]; then
        echo "env=\"$RELEEM_ENV\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    fi
    if [ -n "$RELEEM_DEBUG" ]; then
        echo "debug=$RELEEM_DEBUG" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    fi
    if [ -n "$RELEEM_QUERY_OPTIMIZATION" ]; then
        printf "\033[37m - Adding query optimization parameter to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
        echo "query_optimization=$RELEEM_QUERY_OPTIMIZATION" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    fi
    if [ -n "$RELEEM_DATABASES_QUERY_OPTIMIZATION" ]; then
        printf "\033[37m - Adding list databases for query optimization ${RELEEM_DATABASES_QUERY_OPTIMIZATION} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
        echo "databases_query_optimization=\"$RELEEM_DATABASES_QUERY_OPTIMIZATION\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    fi
    if [ -n "$RELEEM_REGION" ]; then
        printf "\033[37m - Adding releem region ${RELEEM_REGION} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
        echo "releem_region=\"$RELEEM_REGION\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
    fi
    printf "\033[37m - Adding releem instance type ${instance_type} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
    echo "instance_type=\"$instance_type\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null

    if [ "$instance_type" == "aws/rds" ]; then
        if [ -n "$RELEEM_AWS_REGION" ] && [ -n "$RELEEM_AWS_RDS_DB" ] && [ -n "$RELEEM_AWS_RDS_PARAMETER_GROUP" ]; then
            printf "\033[37m - Adding AWS region ${RELEEM_AWS_REGION} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "aws_region=\"$RELEEM_AWS_REGION\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            printf "\033[37m - Adding AWS RDS DB ${RELEEM_AWS_RDS_DB} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "aws_rds_db=\"$RELEEM_AWS_RDS_DB\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            printf "\033[37m - Adding AWS RDS Parameter Group ${RELEEM_AWS_RDS_PARAMETER_GROUP} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "aws_rds_parameter_group=\"$RELEEM_AWS_RDS_PARAMETER_GROUP\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
        else
            printf "\033[31m - AWS region, AWS RDS DB or AWS RDS Parameter Group is not set. Please set the variables RELEEM_AWS_REGION, RELEEM_AWS_RDS_DB and RELEEM_AWS_RDS_PARAMETER_GROUP\033[0m\n"
            exit 1
        fi
    elif [ "$instance_type" == "gcp/cloudsql" ]; then
        if [ -n "$RELEEM_GCP_PROJECT_ID" ] && [ -n "$RELEEM_GCP_REGION" ] && [ -n "$RELEEM_GCP_CLOUDSQL_INSTANCE" ]; then
            printf "\033[37m - Adding GCP project ID ${RELEEM_GCP_PROJECT_ID} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "gcp_project_id=\"$RELEEM_GCP_PROJECT_ID\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            printf "\033[37m - Adding GCP region ${RELEEM_GCP_REGION} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "gcp_region=\"$RELEEM_GCP_REGION\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            printf "\033[37m - Adding GCP Cloud SQL instance ${RELEEM_GCP_CLOUDSQL_INSTANCE} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "gcp_cloudsql_instance=\"$RELEEM_GCP_CLOUDSQL_INSTANCE\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null        
            if [ -n "$RELEEM_GCP_CLOUDSQL_PUBLIC_CONNECTION" ]; then
                printf "\033[37m - Adding GCP Cloud SQL public connection ${RELEEM_GCP_CLOUDSQL_PUBLIC_CONNECTION} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
                echo "gcp_cloudsql_public_connection=$RELEEM_GCP_CLOUDSQL_PUBLIC_CONNECTION" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            fi        
        else
            printf "\033[31m - GCP project ID, GCP region or GCP Cloud SQL instance is not set. Please set the variables RELEEM_GCP_PROJECT_ID, RELEEM_GCP_REGION and RELEEM_GCP_CLOUDSQL_INSTANCE\033[0m\n"
            exit 1
        fi
    elif [ "$instance_type" == "azure/mysql" ]; then
        if [ -n "$RELEEM_AZURE_SUBSCRIPTION_ID" ] && [ -n "$RELEEM_AZURE_RESOURCE_GROUP" ] && [ -n "$RELEEM_AZURE_MYSQL_SERVER" ]; then
            printf "\033[37m - Adding Azure subscription ID ${RELEEM_AZURE_SUBSCRIPTION_ID} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "azure_subscription_id=\"$RELEEM_AZURE_SUBSCRIPTION_ID\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            printf "\033[37m - Adding Azure resource group ${RELEEM_AZURE_RESOURCE_GROUP} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "azure_resource_group=\"$RELEEM_AZURE_RESOURCE_GROUP\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            printf "\033[37m - Adding Azure MySQL server ${RELEEM_AZURE_MYSQL_SERVER} to the Releem Agent configuration: $RELEEM_CONF_FILE\n\033[0m"
            echo "azure_mysql_server=\"$RELEEM_AZURE_MYSQL_SERVER\"" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            if [ -z "$RELEEM_MYSQL_SSL_MODE" ]; then
                printf "\033[37m - Enabling MySQL SSL mode by default for Azure Database for MySQL: $RELEEM_CONF_FILE\n\033[0m"
                echo "mysql_ssl_mode=true" | $sudo_cmd tee -a $RELEEM_CONF_FILE >/dev/null
            fi
        else
            printf "\033[31m - Azure subscription ID, resource group or MySQL server is not set. Please set RELEEM_AZURE_SUBSCRIPTION_ID, RELEEM_AZURE_RESOURCE_GROUP and RELEEM_AZURE_MYSQL_SERVER\033[0m\n"
            exit 1
        fi
    fi
    # Secure the configuration file
    $sudo_cmd chmod 640 $RELEEM_CONF_FILE
}

function install_dependencies() {
    # OS/Distro Detection
    # Try lsb_release, fallback with /etc/issue then uname command
    KNOWN_DISTRIBUTION="(Debian|Ubuntu|RedHat|CentOS|Amazon)"
    DISTRIBUTION=$(lsb_release -d 2>/dev/null | grep -Eo $KNOWN_DISTRIBUTION  || grep -Eo $KNOWN_DISTRIBUTION /etc/issue 2>/dev/null || grep -Eo $KNOWN_DISTRIBUTION /etc/Eos-release 2>/dev/null || grep -m1 -Eo $KNOWN_DISTRIBUTION /etc/os-release 2>/dev/null || uname -s)

    if [ -f /etc/debian_version ] || [ "$DISTRIBUTION" == "Debian" ] || [ "$DISTRIBUTION" == "Ubuntu" ]; then
        OS="Debian"
    elif [ -f /etc/redhat-release ] || [ "$DISTRIBUTION" == "RedHat" ] || [ "$DISTRIBUTION" == "CentOS" ] || [ "$DISTRIBUTION" == "Amazon" ]; then
        OS="RedHat"
    # Some newer distros like Amazon may not have a redhat-release file
    elif [ -f /etc/system-release ] || [ "$DISTRIBUTION" == "Amazon" ]; then
        OS="RedHat"
    # Arista is based off of Fedora14/18 but do not have /etc/redhat-release
    elif [ -f /etc/Eos-release ] || [ "$DISTRIBUTION" == "Arista" ]; then
        OS="RedHat"
    fi

    # Install the necessary package sources
    if [ "$OS" = "RedHat" ]; then
        echo -e "\033[37m\n * Checking installed dependencies.\n\033[0m"

        if [ -x "/usr/bin/dnf" ]; then
            package_manager='dnf'
        else
            package_manager='yum'
        fi
        which curl &> /dev/null || $sudo_cmd $package_manager -y install curl
        which crontab &> /dev/null || $sudo_cmd $package_manager -y install cronie
    elif [ "$OS" = "Debian" ]; then
        printf "\033[37m\n * Checking installed dependencies.\n\033[0m\n"
        which curl &> /dev/null || ($sudo_cmd apt-get update ; $sudo_cmd apt-get install -y --force-yes curl)
        which crontab &> /dev/null || ($sudo_cmd apt-get update ; $sudo_cmd apt-get install -y --force-yes cron)
    else
        printf "\033[31mYour OS or distribution are not supported by this install script.\033[0m\n"
        exit 0
    fi
}    

# Detect API key based on environment variables
function detect_releem_api_key() {
    apikey=
    if [ -n "$RELEEM_API_KEY" ]; then
        apikey=$RELEEM_API_KEY
    else
        if test -f $RELEEM_CONF_FILE ; then
            . $RELEEM_CONF_FILE
        fi
    fi
    if [ ! "$apikey" ]; then
        printf "\033[31mReleem API key is not available in RELEEM_API_KEY environment variable. Please sign up at https://releem.com\033[0m\n"
        on_error
        exit 1;
    fi    
}

function first_run_releem_agent() {
    set +e
    trap - ERR
    if [ -z "$RELEEM_AGENT_DISABLE" ]; then
        # First run of Releem Agent to check Queries monitoring
        printf "\033[37m\n * Executing Releem Agent for the first time.\033[0m\n"
        printf "\033[37m This may take up to 15 minutes on servers with many databases.\033[0m\n\n"
        $sudo_cmd $RELEEM_WORKDIR/releem-agent -f
        $sudo_cmd timeout --preserve-status 10 $RELEEM_WORKDIR/releem-agent
    fi
    trap on_error ERR
    set -e
}

function enable_collect_queries() {
    # Enable monitoring of queries for local instances
    if [ "$instance_type" == "local" ]; then
        if [ "$database_type" == "postgresql" ]; then
            if [ "$FLAG_PG_STAT_STATEMENTS" -eq 1 ]; then
                $sudo_cmd $RELEEM_COMMAND -p
            else
                printf "\033[31m\n pg_stat_statements extension is not enabled. \n Please install the postgresql-contrib package for your version of Postgresql and reinstall the Releem Agent.\033[0m\n"
                exit 1
            fi
        elif [ "$database_type" == "mysql" ]; then
            $sudo_cmd $RELEEM_COMMAND -p
        fi
    fi
}    

function main() {
    detect_releem_api_key
    detect_instance_type
    detect_database_type
    configure_connection_parameters
    install_dependencies
    download_releem_agent
    configure_db_memory_limit
    setting_up_database_instance
    configure_releem_agent
    configure_crontab
    enable_collect_queries
    first_run_releem_agent
    reinstall_service_releem_agent
    restart_service_releem_agent
}

if [[ -n "${RELEEM_TEST_MODE}" && "${BASH_SOURCE[0]}" != "$0" ]]; then
    return 0
fi

# Parse parameters
while getopts "u" option
do
case "${option}"
in
u) releem_update;;
esac
done

INSTALL_MODE="$(basename "$0")"
if [ "$INSTALL_MODE" == "uninstall" ] || [ "$1" == "uninstall" ];
then
    trap - EXIT
    apikey=
    if [ -n "$RELEEM_API_KEY" ]; then
        apikey=$RELEEM_API_KEY
    elif test -f "$RELEEM_CONF_FILE" ; then
        . "$RELEEM_CONF_FILE"
    fi
    if [ -n "$apikey" ] && [ -x "$RELEEM_WORKDIR/releem-agent" ]; then
        $RELEEM_WORKDIR/releem-agent --event=agent_uninstall > /dev/null || true
    fi
    printf "\033[37m\n * Configuring crontab\033[0m\n"
    ($sudo_cmd crontab -l 2>/dev/null | grep -v "$RELEEM_WORKDIR/mysqlconfigurer.sh" || true) | $sudo_cmd crontab -
    printf "\033[37m\n * Stopping Releem Agent service.\033[0m\n"
    releem_agent_stop=$($sudo_cmd $RELEEM_WORKDIR/releem-agent  stop)
    if [ $? -eq 0 ]; then
        printf "\033[32m\n Releem Agent stopped successfully.\033[0m\n"
    else
        echo $releem_agent_stop
        printf "\033[31m\n Releem Agent failed to stop.\033[0m\n"
    fi
    printf "\033[37m\n * Uninstalling Releem Agent service.\033[0m\n"
    releem_agent_remove=$($sudo_cmd $RELEEM_WORKDIR/releem-agent remove)
    if [ $? -eq 0 ]; then
        printf "\033[32m\n Releem Agent uninstalled successfully.\033[0m\n"
    else
        echo $releem_agent_remove
        printf "\033[31m\n Releem Agent failed to  uninstall.\033[0m\n"
    fi
    printf "\033[37m\n * Removing files Releem Agent\033[0m\n"
    $sudo_cmd rm -rf $RELEEM_WORKDIR
    exit 0

elif [ "$INSTALL_MODE" == "update" ] || [ "$1" == "update" ];
then
    releem_update

elif [ "$INSTALL_MODE" == "enable_query_optimization" ] || [ "$1" == "enable_query_optimization" ];
then
    #Enable Query Optimitsation
    detect_releem_api_key
    detect_instance_type
    detect_database_type
    configure_connection_parameters

    grant_privileges_sql=$($mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -NBe 'select Concat("GRANT SELECT on *.* to `",User,"`@`", Host,"`;") from mysql.user where User="releem"')
    for query in  "${grant_privileges_sql[@]}";
    do
        echo "${query}"
        $mysqlcmd  ${root_connection_string} --user=root --password=${RELEEM_MYSQL_ROOT_PASSWORD} -Be "${query}"
    done
    if [ -z "$query_optimization" ]; then
        echo "query_optimization=true" | $sudo_cmd tee -a $RELEEM_CONF_FILE
    else
        $sudo_cmd sed -i 's/query_optimization=.*/query_optimization=true/g' $RELEEM_CONF_FILE
    fi
    restart_service_releem_agent
    # Enable perfomance schema
    $sudo_cmd $RELEEM_COMMAND -p
    exit 0

else
    main
    printf "\033[37m\n\033[0m"
    printf "\033[37m * Releem Agent has been successfully installed.\033[0m\n"
    printf "\033[37m\n\033[0m"
    printf "\033[37m * To view Releem recommendations and Database metrics, visit https://app.releem.com/dashboard\033[0m"
    printf "\033[37m\n\033[0m"
fi

Youez - 2016 - github.com/yon3zu
LinuXploit