ud+
This commit is contained in:
162
directadmin-1.62.4/scripts/change_database_username.php
Normal file
162
directadmin-1.62.4/scripts/change_database_username.php
Normal file
@@ -0,0 +1,162 @@
|
||||
<?php
|
||||
$version = '2.0';
|
||||
|
||||
$user = getenv('DBUSER');
|
||||
$pass = getenv('DBPASS');
|
||||
$username = getenv('USERNAME');
|
||||
$newusername = getenv('NEWUSERNAME');
|
||||
|
||||
$host = getenv('DBHOST');
|
||||
if ($host == "")
|
||||
$host = 'localhost';
|
||||
|
||||
$verbose = getenv('VERBOSE');
|
||||
$verbose = ($verbose == 1) ? 1 : 0;
|
||||
$ignore_errors = 0; //power through at your own risk
|
||||
|
||||
$exit_code = 0;
|
||||
|
||||
$rename_database_sh = '/usr/local/directadmin/scripts/rename_database.sh';
|
||||
if (file_exists('/usr/local/directadmin/scripts/custom/rename_database.sh'))
|
||||
$rename_database_sh = '/usr/local/directadmin/scripts/custom/rename_database.sh';
|
||||
|
||||
if ($username == "" || $username == "root" || $username == "mysql")
|
||||
{
|
||||
die("Bad username ($username). aborting mysql database swap");
|
||||
}
|
||||
|
||||
if ($newusername == "" || $newusername == "root" || $newusername == "mysql")
|
||||
{
|
||||
die('Bad new username. aborting mysql database swap');
|
||||
}
|
||||
|
||||
$mysqli = new mysqli('localhost',$user,$pass);
|
||||
if ($mysqli->connect_error)
|
||||
{
|
||||
die('Could not connect to mysql: ('.$mysqli->connect_errno.') '. $mysqli->connect_error);
|
||||
}
|
||||
|
||||
//*******************************************************************
|
||||
// Main code
|
||||
|
||||
$mysqli->select_db('mysql');
|
||||
|
||||
replace_users($mysqli);
|
||||
rename_dbs($mysqli);
|
||||
|
||||
$mysqli->query("FLUSH_PRIVILEGES");
|
||||
$mysqli->close();
|
||||
|
||||
exit($exit_code);
|
||||
|
||||
//*******************************************************************
|
||||
|
||||
function rename_dbs($mysqli)
|
||||
{
|
||||
global $username, $newusername, $ignore_errors, $rename_database_sh, $exit_code;
|
||||
|
||||
// This will find all databases owned by the User
|
||||
// for each db, create a new db with the correct name (based on the old db?)
|
||||
// for each db, it finds all tables
|
||||
|
||||
|
||||
$user_dbs = get_user_dbs($mysqli);
|
||||
|
||||
foreach ($user_dbs as $db)
|
||||
{
|
||||
$new_db = preg_replace('/'.$username.'\\_/', $newusername.'_', $db);
|
||||
|
||||
vecho("Swapping $db to $new_db\n");
|
||||
|
||||
//This will mysqldump -> mysql to a new CREATE DB
|
||||
//and will update mysql.db, mysql.columns_priv, mysql.procs_priv, mysql.tables_priv
|
||||
$ret = 0;
|
||||
system($rename_database_sh." '".$db."' '".$new_db."'", $ret);
|
||||
if ($ret != 0)
|
||||
$exit_code = $ret;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
function get_user_dbs($mysqli)
|
||||
{
|
||||
global $username;
|
||||
|
||||
$query = "SHOW DATABASES LIKE '$username\\_%'";
|
||||
if (! ($result = $mysqli->query($query)) )
|
||||
{
|
||||
die("DB List Error: ". $mysqli->error);
|
||||
}
|
||||
|
||||
$db_array = array();
|
||||
|
||||
while (($row = $result->fetch_row()))
|
||||
{
|
||||
array_push($db_array, $row[0]);
|
||||
}
|
||||
|
||||
$result->free();
|
||||
|
||||
return $db_array;
|
||||
}
|
||||
|
||||
|
||||
function replace_users($mysqli)
|
||||
{
|
||||
global $username;
|
||||
global $newusername;
|
||||
|
||||
//in this function, we need to replace
|
||||
// username to newusername
|
||||
// username_user to newusername_user
|
||||
|
||||
if (false) //old
|
||||
{
|
||||
$mysqli->query("UPDATE mysql.user SET user='$newusername' WHERE user='$username'");
|
||||
$mysqli->query("UPDATE mysql.db SET user='$newusername' WHERE user='$username'");
|
||||
}
|
||||
else //new
|
||||
{
|
||||
$query = "SELECT host FROM mysql.user WHERE user='$username'";
|
||||
$result = $mysqli->query($query) or vecho("Error selecting mysql.user: ".$mysqli->error."\n", 1);
|
||||
while ($row = $result->fetch_row())
|
||||
{
|
||||
$host = $row[0];
|
||||
|
||||
vecho("swapping '$username'@'$host' with '$newusername'@'$host'");
|
||||
|
||||
$query = "RENAME USER '$username'@'$host' TO '$newusername'@'$host'";
|
||||
$mysqli->query($query) or vecho("Error updating '$username'@'$host' to '$newusername'@'$host' with RENAME USER: ".$mysqli->error."\n", 1);
|
||||
}
|
||||
$result->free();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$query = "SELECT user,host FROM mysql.user WHERE user LIKE '$username\\_%'";
|
||||
$result = $mysqli->query($query) or vecho("Error selecting mysql.user: ".$mysqli->error."\n", 1);
|
||||
|
||||
while ($row = $result->fetch_row())
|
||||
{
|
||||
$user = $row[0];
|
||||
$host = $row[1];
|
||||
$new_user = preg_replace('/'.$username.'_/', $newusername."_", $user);
|
||||
|
||||
vecho("swapping '$user'@'$host' with '$new_user'@'$host'");
|
||||
|
||||
$query = "RENAME USER '$user'@'$host' TO '$new_user'@'$host'";
|
||||
$mysqli->query($query) or vecho("Error updating '$user'@'$host' to '$new_user'@'$host' in mysql.user: ".$mysqli->error."\n", 1);
|
||||
}
|
||||
$result->free();
|
||||
}
|
||||
|
||||
function vecho($str, $is_err=0)
|
||||
{
|
||||
global $verbose;
|
||||
|
||||
if ($verbose || $is_err==1)
|
||||
echo $str."\n";
|
||||
}
|
||||
|
||||
?>
|
||||
Reference in New Issue
Block a user