85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
 | 
						|
# Copyright (c) 2016 MariaDB Corporation Ab
 | 
						|
#
 | 
						|
# Use of this software is governed by the Business Source License included
 | 
						|
# in the LICENSE.TXT file and at www.mariadb.com/bsl11.
 | 
						|
#
 | 
						|
# Change Date: 2025-03-08
 | 
						|
#
 | 
						|
# On the date above, in accordance with the Business Source License, use
 | 
						|
# of this software will be governed by version 2 or later of the General
 | 
						|
# Public License.
 | 
						|
 | 
						|
function runQuery(){
 | 
						|
    mysql -s -s -h "$host" -P "$port" -u "$user" -p"$password" -e "$1"
 | 
						|
    if [ $? -ne 0 ]
 | 
						|
    then
 | 
						|
        echo "Failed to execute query: $1"
 | 
						|
        exit
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
# Transform grants to from external hosts to MaxScale's host
 | 
						|
function getGrants(){
 | 
						|
    result=$(runQuery "show grants for $1"|sed -e "s/@[^ ]*/@'$maxscalehost'/" -e "s/ *IDENTIFIED BY.*//" -e "s/$/;/")
 | 
						|
    echo "$result"
 | 
						|
}
 | 
						|
 | 
						|
user=$(whoami)
 | 
						|
host=$(hostname)
 | 
						|
port=3306
 | 
						|
include_root="and user <> 'root'"
 | 
						|
 | 
						|
if [ "$1" == "--help" ] || [ $# -eq 0 ]
 | 
						|
then
 | 
						|
    echo "Transform grants from original host to this host"
 | 
						|
    echo ""
 | 
						|
    echo "This script queries the backend database for a list of grants and outputs "
 | 
						|
    echo "copies of them with the hostnames replaced with the current server's hostname."
 | 
						|
    echo "The value of the hostname is the same you would get by doing a 'SELECT USER()'"
 | 
						|
    echo "query from this server."
 | 
						|
    echo ""
 | 
						|
    echo "Usage: $0 -u USER -p PASSWORD -h HOST -P PORT [-r]"
 | 
						|
    echo "-u USER        Username"
 | 
						|
    echo "-p PASSWORD    Password"
 | 
						|
    echo "-h HOST        Database address ($host)"
 | 
						|
    echo "-P PORT        Database port ($port)"
 | 
						|
    echo "-r             Include root user in the grants"
 | 
						|
    exit
 | 
						|
fi
 | 
						|
 | 
						|
while getopts "u:p:h:P:r" var
 | 
						|
do
 | 
						|
    case $var in
 | 
						|
        u)
 | 
						|
            user=$OPTARG
 | 
						|
            ;;
 | 
						|
 | 
						|
        p)
 | 
						|
            password=$OPTARG
 | 
						|
            ;;
 | 
						|
 | 
						|
        h)
 | 
						|
            host=$OPTARG
 | 
						|
            ;;
 | 
						|
 | 
						|
        P)
 | 
						|
            port=$OPTARG
 | 
						|
            ;;
 | 
						|
        r)
 | 
						|
            include_root=""
 | 
						|
            ;;
 | 
						|
    esac
 | 
						|
done
 | 
						|
 | 
						|
# Get the MaxScale hostname from the backend server
 | 
						|
maxscalehost=$(runQuery "select user()")
 | 
						|
maxscalehost=${maxscalehost#*@}
 | 
						|
 | 
						|
# List all the users
 | 
						|
runQuery "select concat(\"'\", user, \"'\", '@', \"'\", host, \"'\") from mysql.user where user <> '' and host <> '%' $include_root"|while read i
 | 
						|
do
 | 
						|
    getGrants "$i"
 | 
						|
done
 |