Current File : //etc/zpanel/panel/modules/wordpress_installation/code/MysqlConnectivity.php |
<?php
error_reporting(0);
class MysqlConnectivity {
private $zdbh;
public function __construct()
{
require('/etc/sentora/panel/cnf/db.php');
include_once('/etc/sentora/panel/dryden/db/driver.class.php');
include_once('/etc/sentora/panel/dryden/debug/logger.class.php');
include_once('/etc/sentora/panel/dryden/runtime/dataobject.class.php');
include_once('/etc/sentora/panel/dryden/runtime/hook.class.php');
include_once('/etc/sentora/panel/dryden/runtime/hash.class.php');
include_once('/etc/sentora/panel/dryden/sys/versions.class.php');
include_once('/etc/sentora/panel/dryden/ctrl/options.class.php');
include_once('/etc/sentora/panel/dryden/ctrl/users.class.php');
include_once('/etc/sentora/panel/dryden/ctrl/auth.class.php');
include_once('/etc/sentora/panel/dryden/fs/director.class.php');
include_once('/etc/sentora/panel/dryden/fs/filehandler.class.php');
include_once('/etc/sentora/panel/inc/dbc.inc.php');
try
{
$this->zdbh = new db_driver("mysql:host=" . $host . ";dbname=" . $dbname . "", $user, $pass);
$mysqli=mysqli_connect($host,$user, $pass);
} catch (PDOException $e) {
exit();
}
}
public function checkMysqlStatus() {
$output = shell_exec('./mysqlStatus.sh');
if($output == 'Mysql Not Running') {
$cmd = "service mysqld restart";
$mysql_status = MYSQL_NOT_RUNNING;
}
else {
$mysql_status = MYSQL_RUNNING;
}
return $mysql_status;
}
public function checkMysqlConnection($username, $password) {
$conn = new mysqli("localhost", $username, $password);
if ($conn->connect_error) {
$mysql_conn_status = MYSQL_CONNECT_FAILED;
}
else {
$mysql_conn_status = MYSQL_CONNECT_SUCCESS;
}
return $mysql_conn_status;
}
public function checkDbExist($dbname) {
$sql = "SELECT * FROM x_mysql_databases WHERE my_name_vc =:dbname AND my_deleted_ts is NULL";
$sql = $this->zdbh->prepare($sql);
$sql->bindParam(':dbname', $dbname);
$sql->execute();
$sentora_numrows = $sql->rowCount();
$sql = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '".$dbname."'";
$sql = $this->zdbh->prepare($sql);
$sql->bindParam(':dbname', $dbname);
$sql->execute();
$db_numrows = $sql->rowCount();
if($sentora_numrows && $db_numrows) {
$db_conn_status = DATABASE_EXIST;
}
else if($sentora_numrows) {
$db_conn_status = DATABASE_EXIST_ONLY_IN_SENTORA;
}
else if($db_numrows) {
$db_conn_status = DATABASE_EXIST_ONLY_IN_SCHEMA;
}
else {
$db_conn_status = DATABASE_DOESNOT_EXIST;
}
return $db_conn_status;
}
public function checkUserExist($username) {
$sql = "SELECT * FROM x_mysql_users WHERE mu_name_vc =:username AND mu_deleted_ts is NULL";
$sql = $this->zdbh->prepare($sql);
$sql->bindParam(':username', $username);
$sql->execute();
$sentora_user_numrows = $sql->rowCount();
$sql = "SELECT * FROM mysql.user WHERE user =:username AND host ='localhost'";
$sql = $this->zdbh->prepare($sql);
$sql->bindParam(':username', $username);
// $sql->bindParam(':hostname', 'localhost');
$sql->execute();
$mysql_user_numrows = $sql->rowCount();
if($sentora_user_numrows && $mysql_user_numrows) {
$user_status = USER_EXIST;
}
else if($sentora_user_numrows) {
$user_status = USER_EXIST_ONLY_IN_SENTORA;
}
else if($mysql_user_numrows) {
$user_status = USER_EXIST_ONLY_IN_SCHEMA;
}
else {
$user_status = USER_DOESNOT_EXIST;
}
return $user_status;
}
public function createDatabase($domainname, $dbname) {
//$currentuser = ctrl_users::GetUserDetail($uid);
$databasename = strtolower(str_replace(' ', '', $dbname));
$check_db_exist = self::checkDbExist($dbname);
if($check_db_exist == DATABASE_EXIST) {
return DATABASE_ALREADY_CREATED;
}
/*else {
continue;
}*/
/*if (fs_director::CheckForEmptyValue(self::CheckCreateForErrors($currentuser['username'], $databasename))) {
return false;
}*/
//runtime_hook::Execute('OnBeforeCreateDatabase');
$dbvals = self::getUserDetails($domainname);
try {
$db = $this->zdbh->mysqlRealEscapeString($dbvals['ac_user_vc'] . "_" . $databasename);
$sql = $this->zdbh->prepare("CREATE DATABASE `$db` DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';");
$sql->execute();
$sql = $this->zdbh->prepare("FLUSH PRIVILEGES");
$qqq = $sql->execute();
$sql = $this->zdbh->prepare("INSERT INTO x_mysql_databases (
my_acc_fk,
my_name_vc,
my_created_ts) VALUES (
:userid,
:name,
:time)");
$time = time();
$name = $dbvals['ac_user_vc'] . "_" . $databasename;
$sql->bindParam(':userid', $dbvals['ac_id_pk']);
$sql->bindParam(':time', $time);
$sql->bindParam(':name', $name);
$create_db_status = $sql->execute();
self::addPrevilages($dbvals['ac_id_pk'], $dbvals['ac_user_vc'], $name);
if($create_db_status) {
return DATABASE_CREATED.":".$name;
}
else {
return DATABASE_NOT_CREATED;
}
} catch (PDOException $e) {
return false;
}
//runtime_hook::Execute('OnAfterCreateDatabase');
}
public function createUserForNewVersion($domainname, $username, $password, $dbname) {
global $controller;
$dbvals = self::getUserDetails($domainname);
//$access = "localhost";
$prefix = $dbvals['ac_user_vc'];
$uid = $dbvals['ac_id_pk'];
// Check for spaces and remove if found...
$username = strtolower(str_replace(' ', '', $prefix."_".$username));
//$dbname = $prefix."_".$dbname;
$check_db_exist = self::checkUserExist($username);
if($check_db_exist == USER_EXIST) {
return USER_ALREADY_CREATED;
}
// If errors are found, then exit before creating user...
/*if (fs_director::CheckForEmptyValue(self::CheckCreateForErrors($username, $database, $access))) {
return false;
}*/
//runtime_hook::Execute('OnBeforeCreateDatabaseUser');
$numrows = $this->zdbh->prepare("SELECT * FROM x_remote_mysql_hosts WHERE re_acc_fk=:userid AND re_deleted_ts IS NULL");
$numrows->bindParam(':userid', $uid);
$numrows->execute();
$rowcount= $numrows->rowCount();
//if ($rowcount <> 0) {
$rowmysqls = $numrows->fetchAll();
$localhost= array("re_host_vc"=>"localhost", "re_acc_fk"=>$uid);
array_push($rowmysqls, $localhost);
// Get the database name from the ID...
$numrows = $this->zdbh->prepare("SELECT * FROM x_mysql_databases WHERE my_name_vc=:database AND my_deleted_ts IS NULL");
$numrows->bindParam(':database', $dbname);
$numrows->execute();
$rowdb = $numrows->fetch();
$database = $rowdb['my_id_pk'];
//$password = fs_director::GenerateRandomPassword(9, 4);
foreach($rowmysqls as $rowmysql) {
$access = $rowmysql['re_host_vc'];
//$password = fs_director::GenerateRandomPassword(9, 4);
// Create user in MySQL
$sql = $this->zdbh->prepare("CREATE USER :username@:access;");
$sql->bindParam(':username', $username);
$sql->bindParam(':access', $access);
$sql->execute();
// Set MySQL password for new user...
$sql = $this->zdbh->prepare("SET PASSWORD FOR :username@:access=PASSWORD(:password)");
$sql->bindParam(':username', $username);
$sql->bindParam(':access', $access);
$sql->bindParam(':password', $password);
$sql->execute();
/*// Get the database name from the ID...
$numrows = $this->zdbh->prepare("SELECT * FROM x_mysql_databases WHERE my_name_vc=:database AND my_deleted_ts IS NULL");
$numrows->bindParam(':database', $dbname);
$numrows->execute();
$rowdb = $numrows->fetch();*/
// Remove all priveledges to all databases
$sql = $this->zdbh->prepare("GRANT USAGE ON *.* TO :username@:access");
$sql->bindParam(':username', $username);
$sql->bindParam(':access', $access);
$sql->execute();
//$database = $rowdb['my_id_pk'];
$usernameClean = $this->zdbh->mysqlRealEscapeString($username);
$accessClean = $this->zdbh->mysqlRealEscapeString($access);
$my_name_vc = $this->zdbh->mysqlRealEscapeString($dbname);
//$my_name_vc = $this->zdbh->mysqlRealEscapeString($rowdb['my_name_vc']);
$sql = $this->zdbh->prepare("GRANT ALL PRIVILEGES ON `$my_name_vc`.* TO `$usernameClean`@`$accessClean`");
//$sql->bindParam(':username', $username, PDO::PARAM_STR);
//$sql->bindParam(':access', $access, PDO::PARAM_STR);
//$sql->bindParam(':name', $rowdb['my_name_vc'], PDO::PARAM_STR);
$sql->execute();
$sql = $this->zdbh->prepare("FLUSH PRIVILEGES");
$sql->execute();
}
$sql = $this->zdbh->prepare("INSERT INTO x_mysql_users (
mu_acc_fk,
mu_name_vc,
mu_database_fk,
mu_pass_vc,
mu_access_vc,
mu_created_ts) VALUES (
:userid,
:username,
:database,
:password,
:access,
:time)");
$sql->bindParam(':userid', $uid);
$sql->bindParam(':username', $username);
$sql->bindParam(':database', $database);
$sql->bindParam(':password', $password);
$sql->bindParam(':access', $access);
$time = time();
$sql->bindParam(':time', $time);
$sql->execute();
$mysql_userid = $this->zdbh->lastInsertId();
$sql = $this->zdbh->prepare("INSERT INTO x_mysql_dbmap (
mm_acc_fk,
mm_user_fk,
mm_database_fk) VALUES (
:userid,
:mysqluserid,
:databaseid)");
$sql->bindParam(':userid', $uid);
$sql->bindParam(':mysqluserid', $mysql_userid);
$sql->bindParam(':databaseid', $database);
$sql->execute();
//self::AddPrevilages($uid, $username, $database);
//runtime_hook::Execute('OnAfterCreateDatabaseUser');
//self::$ok = true;
//return true;
return USER_CREATED.":".$username;
}
public function addPrevilages($uid, $username, $dbname) {
$numrows = $this->zdbh->prepare("SELECT * FROM x_remote_mysql_hosts WHERE re_acc_fk=:userid AND re_deleted_ts IS NULL");
$numrows->bindParam(':userid', $uid);
$numrows->execute();
$rowhosts= $numrows->fetchAll();
array_push($rowhosts, array("re_host_vc"=>"localhost", "re_acc_fk"=>$uid));
foreach ($rowhosts as $rowhost) {
$my_name_vc = $dbname;
//$my_name_vc = $this->zdbh->mysqlRealEscapeString($rowdb['my_name_vc']);
$mu_name_vc = $username;
//$mu_name_vc = $this->zdbh->mysqlRealEscapeString($rowuser['mu_name_vc']);
$mu_access_vc = $this->zdbh->mysqlRealEscapeString($rowhost['re_host_vc']);
$sql = $this->zdbh->prepare("GRANT ALL PRIVILEGES ON `$my_name_vc`.* TO `$mu_name_vc`@`$mu_access_vc`");
$sql->bindParam(':my_name_vc', $my_name_vc, PDO::PARAM_STR);
$sql->bindParam(':mu_name_vc', $mu_name_vc, PDO::PARAM_STR);
//$sql->bindParam(':mu_access_vc', $rowuser['mu_access_vc'], PDO::PARAM_STR);
$sql->bindParam(':mu_access_vc', $mu_access_vc, PDO::PARAM_STR);
$sql->execute();
$sql = $this->zdbh->prepare("FLUSH PRIVILEGES");
$sql->execute();
}
return USER_PREVILAGE_ASSIGNED;
}
public function createUserForOldVersion($domainname, $username, $password, $dbname) {
global $controller;
$dbvals = self::getUserDetails($domainname);
$access = "localhost";
$prefix = $dbvals['ac_user_vc'];
// Check for spaces and remove if found...
$username = strtolower(str_replace(' ', '', $prefix.$username));
// If errors are found, then exit before creating user...
/*if (fs_director::CheckForEmptyValue(self::CheckCreateForErrors($username, $database, $access))) {
return false;
}*/
//runtime_hook::Execute('OnBeforeCreateDatabaseUser');
//$password = fs_director::GenerateRandomPassword(9, 4);
// Create user in MySQL
$sql = $this->zdbh->prepare("CREATE USER :username@:access;");
$sql->bindParam(':username', $username);
$sql->bindParam(':access', $access);
$sql->execute();
// Set MySQL password for new user...
$sql = $this->zdbh->prepare("SET PASSWORD FOR :username@:access=PASSWORD(:password)");
$sql->bindParam(':username', $username);
$sql->bindParam(':access', $access);
$sql->bindParam(':password', $password);
$sql->execute();
// Get the database name from the ID...
/*$numrows = $this->zdbh->prepare("SELECT * FROM x_mysql_databases WHERE my_id_pk=:database AND my_deleted_ts IS NULL");
$numrows->bindParam(':database', $database);
$numrows->execute();
$rowdb = $numrows->fetch();*/
// Remove all priveledges to all databases
$sql = $this->zdbh->prepare("GRANT USAGE ON *.* TO :username@:access");
$sql->bindParam(':username', $username);
$sql->bindParam(':access', $access);
$sql->execute();
// Grant privileges for new user to the assigned database...
$usernameClean = $this->zdbh->mysqlRealEscapeString($username);
$accessClean = $this->zdbh->mysqlRealEscapeString($access);
//$my_name_vc = $this->zdbh->mysqlRealEscapeString($rowdb['my_name_vc']);
$my_name_vc = $this->zdbh->mysqlRealEscapeString($dbname);
$sql = $this->zdbh->prepare("GRANT ALL PRIVILEGES ON `$my_name_vc`.* TO `$usernameClean`@`$accessClean`");
//$sql->bindParam(':username', $username, PDO::PARAM_STR);
//$sql->bindParam(':access', $access, PDO::PARAM_STR);
//$sql->bindParam(':name', $rowdb['my_name_vc'], PDO::PARAM_STR);
$sql->execute();
$sql = $this->zdbh->prepare("FLUSH PRIVILEGES");
$sql->execute();
// Add user to Sentora database...
$sql = $this->zdbh->prepare("INSERT INTO x_mysql_users (
mu_acc_fk,
mu_name_vc,
mu_database_fk,
mu_pass_vc,
mu_access_vc,
mu_created_ts) VALUES (
:userid,
:username,
:database,
:password,
:access,
:time)");
$sql->bindParam(':userid', $uid);
$sql->bindParam(':username', $username);
$sql->bindParam(':database', $dbname);
$sql->bindParam(':password', $password);
$sql->bindParam(':access', $access);
$time = time();
$sql->bindParam(':time', $time);
$sql->execute();
$mysql_userid = $this->zdbh->lastInsertId();
/* // Get the new users id...
//$rowuser = $this->zdbh->query("SELECT * FROM x_mysql_users WHERE mu_name_vc='" . $username . "' AND mu_acc_fk=" . $uid . " AND mu_deleted_ts IS NULL")->fetch();
$numrows = $this->zdbh->prepare("SELECT * FROM x_mysql_users WHERE mu_name_vc=:username AND mu_acc_fk=:userid AND mu_deleted_ts IS NULL");
$numrows->bindParam(':username', $username);
$numrows->bindParam(':userid', $uid);
$numrows->execute();
$rowuser = $numrows->fetch();
// Add database to Sentora user account...
self::ExecuteAddDB($uid, $rowuser['mu_id_pk'], $database);*/
self::ExecuteAddDB($uid, $mysql_userid, $database);
runtime_hook::Execute('OnAfterCreateDatabaseUser');
self::$ok = true;
return true;
}
public function getUserDetails($domainname) {
$rows = $this->zdbh->prepare("SELECT a.ac_id_pk, a.ac_user_vc FROM x_accounts as a INNER JOIN x_vhosts as h ON (a.ac_id_pk = h.vh_acc_fk) WHERE h.vh_name_vc = :domainname AND a.ac_deleted_ts IS NULL");
$rows->bindParam(':domainname', $domainname);
$rows->execute();
$dbvals = $rows->fetch();
return $dbvals;
}
/**************************** RemoTe Mysql Start ****************************/
public function remoteMySqlConnection ($hostname, $domainname) {
$userdetails= self::getUserDetails($domainname);
//$username = $userdetails['ac_user_vc'];
$uid = $userdetails['ac_id_pk'];
$hostname = strtolower(str_replace(' ', '', $hostname));
$numrows = $this->zdbh->prepare("SELECT * FROM x_mysql_users WHERE mu_acc_fk =:userid AND mu_deleted_ts IS NULL");
$numrows->bindParam(':userid', $uid);
$numrows->execute();
$rowcount= $numrows->rowCount();
while ($rowmysql = $numrows->fetch()) {
$password = $rowmysql['mu_pass_vc'];
$username = $rowmysql['mu_name_vc'];
$sql_userid= $rowmysql['mu_id_pk'];
//$database= $rowmysql['db_id'];
//$dbname = $rowmysql['db_name'];
$check_valid_hostname = self::CheckCreateForErrors($hostname,$uid,$username);
//if (fs_director::CheckForEmptyValue(self::CheckCreateForErrors($hostname,$uid,$username))) {
if (!$check_valid_hostname) {
return false;
}
//$password = fs_director::GenerateRandomPassword(9, 4);
// Create user in MySQL
$sql = $this->zdbh->prepare("CREATE USER :username@:access;");
$sql->bindParam(':username', $username);
$sql->bindParam(':access', $hostname);
$sql->execute();
// Set MySQL password for new user...
$sql = $this->zdbh->prepare("SET PASSWORD FOR :username@:access=PASSWORD(:password)");
$sql->bindParam(':username', $username);
$sql->bindParam(':access', $hostname);
$sql->bindParam(':password', $password);
$sql->execute();
$numrows1 = $this->zdbh->prepare("SELECT DISTINCT A.my_id_pk as db_id, A.my_name_vc as db_name From x_mysql_databases as A INNER JOIN x_mysql_dbmap AS B ON (A.my_id_pk = B.mm_database_fk) WHERE A.my_acc_fk=:userid AND mm_user_fk=:mysql_userid");
$numrows1->bindParam(':userid', $uid);
$numrows1->bindParam(':mysql_userid', $sql_userid);
$numrows1->execute();
$rowcount1= $numrows->rowCount();
if($rowcount1 >0)
{
while ($rowmysql1 = $numrows1->fetch()) {
$dbname = $rowmysql1['db_name'];
$sql = $this->zdbh->prepare("GRANT USAGE ON *.* TO :username@:access");
$sql->bindParam(':username', $username);
$sql->bindParam(':access', $hostname);
$sql->execute();
// Grant privileges for new user to the assigned database...
$usernameClean = $this->zdbh->mysqlRealEscapeString($username);
$accessClean = $this->zdbh->mysqlRealEscapeString($hostname);
$my_name_vc = $this->zdbh->mysqlRealEscapeString($dbname);
//$my_name_vc = $zdbh->mysqlRealEscapeString($rowdb['my_name_vc']);
$sql = $this->zdbh->prepare("GRANT ALL PRIVILEGES ON `$my_name_vc`.* TO `$usernameClean`@`$accessClean`");
//$sql->bindParam(':username', $username, PDO::PARAM_STR);
//$sql->bindParam(':access', $access, PDO::PARAM_STR);
//$sql->bindParam(':name', $rowdb['my_name_vc'], PDO::PARAM_STR);
$sql->execute();
$sql = $this->zdbh->prepare("FLUSH PRIVILEGES");
$sql->execute();
}
}
}
// Add user to Sentora database...
$sql = $this->zdbh->prepare("INSERT INTO x_remote_mysql_hosts (
re_host_vc,
re_acc_fk,
re_created_ts) VALUES (
:hostname,
:userid,
:time)");
$sql->bindParam(':userid', $uid);
$sql->bindParam(':hostname', $hostname);
$time = time();
$sql->bindParam(':time', $time);
$sql->execute();
// Get the new users id...
$numrows = $this->zdbh->prepare("SELECT * FROM x_remote_mysql_hosts WHERE re_host_vc=:hostname AND re_acc_fk=:userid AND re_deleted_ts IS NULL");
$numrows->bindParam(':hostname', $hostname);
$numrows->bindParam(':userid', $uid);
$numrows->execute();
$rowuser = $numrows->fetch();
// Add database to Sentora user account...
//self::ExecuteAddDB($uid, $rowuser['mu_id_pk'], $database);
//runtime_hook::Execute('OnAfterCreateDatabaseUser');
//self::$ok = true;
//return true;
return HOSTNAME_CREATED;
}
/**************************** Remote Mysql End ****************************/
/*********************** MysqlCheck & MysqlRepair start *********************/
public function doMySqlCheck() {
$mysql_check_result = shell_exec("mysqlcheck --databases mysql | grep 'status' | awk '{ print $3}' ");
if($mysql_check_result && $mysql_check_result !='OK') {
$ret = self::doMysqlRepair();
$mysql_check_status = $ret;
} else {
$mysql_check_status = MYSQL_DB_WORKING;
}
return $mysql_check_status;
}
public function doMysqlRepair() {
$sql = "SELECT table_name,ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='mysql' AND ENGINE !='InnoDB'";
$numrows = $zdbh->prepare($sql);
$numrows->execute();
$rowcount= $numrows->rowCount();
if($rowcount) {
$mysql_tables = $numrows1->fetchAll();
foreach($mysql_tables as $table) {
//$mysql_repair_result = shell_exec("mysqlcheck -r --databases mysql | grep 'status' | awk '{ print $3}' ");
$mysql_repair_result = shell_exec("mysqlcheck --repair --databases $table");
if($mysql_repair_result && $mysql_check_result !='OK') {
$mysql_repair_status = MYSQL_DB_NOT_REPAIRED;
} else {
$mysql_repair_status = MYSQL_DB_REPAIRED;
}
return $mysql_repair_status;
}
}
}
/*********************** MysqlCheck & MysqlRepair End *********************
/**************************** validations start ****************************/
public function CheckCreateForErrors($hostname,$userid,$username)
{
// Check to make sure the user name is not blank before we go any further...
if ($hostname == '') {
//self::$blank = true;
//return false;
return BLANK_HOSTNAME;
}
if($hostname !="%")
{
if(!filter_var($hostname, FILTER_VALIDATE_IP))
{
/*lf::$badIP = true;
return false;*/
return INVALID_IP;
}
}
// Check to make sure the user name is not a duplicate...
$sql = "SELECT COUNT(*) FROM x_remote_mysql_hosts WHERE re_host_vc=:hostname AND re_acc_fk=:userid AND re_deleted_ts IS NULL";
$numrows = $this->zdbh->prepare($sql);
$numrows->bindParam(':hostname', $hostname);
$numrows->bindParam(':userid', $userid);
if ($numrows->execute()) {
if ($numrows->fetchColumn() <> 0) {
/*self::$alreadyexists = true;
return false;*/
return HOSTNAME_ALREADY_EXIST;
}
}
// Check to make sure the user name is not a duplicate (checks actual mysql table)...
$sql = "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = :username AND host = :hostname)";
$numrows = $this->zdbh->prepare($sql);
$numrows->bindParam(':username', $username);
$numrows->bindParam(':hostname', $hostname);
if ($numrows->execute()) {
if ($numrows->fetchColumn() <> 0) {
/*lf::$alreadyexists = true;
return false;*/
return USERNAME_ALREADY_EXIST;
}
}
/* Check for invalid IP address
if ($hostname != "localhost" && strtolower($hostname) != "localhost" && $hostname != "%") {
if (!sys_monitoring::IsAnyValidIP($hostname)) {
self::$badIP = true;
return false;
}
}*/
return true;
}
/**************************** validations end ****************************/
}
?>