Clase PHP para administrar las bases de datos de un cPanel

Enviado por alegg | En PHP | El 26-08-2009

1

Hace un par de días necesitaba para un proyecto, que determinados clientes puedan acceder a las bases de datos del servidor, desde si mini panel en el sitio web. Encontre esta clase que me ayudo bastante.


/**
* Name: cPanel Database Class
* Version: 1.0
* Author:     The HungryCoder
* Contact:    thehungrycoder@gmail.com
* Homepage: www.hungrycoder.xenexbd.com
*/

class cpanel_db {
    protected $cpdomain;
    protected $cpuser;
    protected $cppass;
    protected $cptheme;
    private $error;
    public $callresult;

    function __construct($cpdomain,$cpuser,$cppass,$cptheme='x3'){
        $this->cpdomain = $cpdomain;
        $this->cpuser = $cpuser;
        $this->cppass = $cppass;
        $this->cptheme = $cptheme;

    }

    private function callUrl($urlsuffix){
        if(empty($urlsuffix)) return $this->error('URL is empty');

        $url = "http://".$this->cpdomain.":2082/frontend/".$this->cptheme.$urlsuffix;
        $this->callresult=''; //reset
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_USERPWD, "$this->cpuser:$this->cppass");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //    curl_setopt($ch, CURLOPT_VERBOSE , 1 );
        $this->callresult = curl_exec($ch);
        $info = curl_getinfo($ch);
        curl_close($ch);
        return $info;
    }

    /**
     * Create Database
     *
     * @param string $dbname
     * @return boolean
     */
    public function createDb($dbname){
        $suffix = "/sql/addb.html?db=$dbname";

        //return $this->callresult;
        $this->callUrl($suffix);

        return $this->isSuccess('db');
    }   

    public function createUser($username,$pass){
        $suffix = "/sql/adduser.html?user=$username&pass=$pass&pass2=$pass";

        //return $this->callresult;
        $this->callUrl($suffix);

        return $this->isSuccess('user');
    }

    public function grantPriv($db,$user){
        //prepare the params
        $params = "db=$db&user=$user&update=&ALL=ALL&SELECT=SELECT&CREATE=CREATE&INSERT=INSERT&ALTER=ALTER&UPDATE=UPDATE&DROP=DROP&DELETE=DELETE&LOCKTABLES=LOCK&INDEX=INDEX&REFERENCES=REFERENCES&CREATETEMPORARYTABLES=TEMPORARY&CREATEROUTINE=CREATEROUTINE";
        $callurl = "/sql/addusertodb.html?$params";

        $this->callUrl($callurl);

        return $this->isSuccess('grant');
    }

    private function isSuccess($type='db'){
        switch ($type){
            case 'db':
                if(eregi('Added the database',$this->callresult)){
                    return true;
                } else {
                    return false;
                }
                break;

            case 'user':
                if(eregi('Added user',$this->callresult)){
                    return true;
                } else {
                    return false;
                }
                break;

            case 'grant':
                if(eregi('was added to the database',$this->callresult)){
                    return true;
                } else {
                    return false;
                }
                break;
            case 'deldb':
                if(eregi('deleted the database',$this->callresult)){
                    return true;
                } else {
                    return false;
                }
                break;
            case 'deluser':
                if(eregi('Deleted the user',$this->callresult)){
                    return true;
                } else {
                    return false;
                }
                break;
        }
    }

    public function error($msg){
        $this->error = $msg;
        return false;
    }

    public function runBatch($dbname,$dbuser,$dbpass){
        if(empty($dbname) OR empty($dbuser) OR empty($dbpass)) return false;
        $result = array();
        //create the database
        $result['db'] = $this->createDb($dbname);

        //create the user
        $result['user'] = $this->createUser($dbuser,$dbpass);

        //grant the access with real db name and username
        $result['grant'] = $this->grantPriv($this->cpuser.'_'.$dbname,$this->cpuser.'_'.$dbuser);

        return $result;
    }

    /**
     * This method deletes a number of databases from cpanel.
     *
     * @param array $dbs
     * @return array
     */
    public function delDb($dbs){
        //this method will delete a number of dbs.
        if(is_array($dbs)){
            foreach ($dbs as $db){
                $db_full_name = $this->cpuser .'_'.$db;
                $suffix = "/sql/deldb.html?db=$db_full_name";
                $this->callUrl($suffix);
                $result[$db] = $this->isSuccess('deldb');
            }
            return $result;
        } else {
            $this->error('Not an array');
        }
        return false;
    }
    /**
     * This method deletes a number of users from cpanel.
     *
     * @param array $dbs
     * @return array
     */
    public function delUser($users){
        //this method will delete a number of dbs.
        if(is_array($users)){
            foreach ($users as $user){
                $user_full_name = $this->cpuser .'_'.$user;
                $suffix = "/sql/deluser.html?user=$user_full_name";
                $this->callUrl($suffix);
                $result[$user] = $this->isSuccess('deluser');
            }
            return $result;
        } else {
            $this->error('Not an array');
        }
        return false;
    }

    /**
     * Find whether a database is exists in cPanel or not!
     *
     * @param string $dbname Do not include the database name prefix (anything before _).
     * @return boolean
     */
    public function isDbExists($dbname,$limit=100){
        $suffix = "/sql/index.html?itemsperpage=$limit";
        $this->callUrl($suffix);
        $html = $this->callresult;
        $html = substr($html,stripos($html,'


'));
        $html = str_ireplace('','BR',$html);
        $html = strip_tags($html);
        $all_db = explode('BR',$html); //array of all databases.

        //trim the whitespaces surrounding the dbname
        $all_db = array_map('trim',$all_db);
        //print_r($all_db);

        if(in_array($this->cpuser.'_'.$dbname,$all_db)){
            return true;
        } else {
            return false;
        }
    }   

    public function isUserExists($username,$limit=100){
        $suffix = "/sql/index.html?itemsperpage=$limit";
        $this->callUrl($suffix);
        $html = $this->callresult;

        $html = substr($html,stripos($html,'


'));

        $html = str_ireplace('','BR',$html);
        $html = strip_tags($html);
        $all_user = explode('BR',$html); //array of all databases.

        //trim the whitespaces surrounding the dbname
        $all_user = array_map('trim',$all_user);
        //print_r($all_db);

        if(in_array($this->cpuser.'_'.$username,$all_user)){
            return true;
        } else {
            return false;
        }
    }
}

Usando la clase


error_reporting(E_ALL);
include('cpanel_mysql.class.php');

$db = new cpanel_db('domain','user','pass');

//create db
if($db->createDb('cpdb')){
    echo 'Db Created';
} else {
    echo 'Db not created';
}

//create user
if($db->createUser('cpuser','3837djd')){
    echo 'User Created';
} else {
    echo 'User not created';
}

//grant access
if($db->grantPriv('cpdb','cpuser')){
    echo 'Priv granted';
} else {
    echo 'Priv not granted';
}

//we can run the above three by this single line:
//$result = $db->runBatch('batch','batch','elkdrlfd');
    //we can now check the result
    print_r($result);

//del database
$db->delDb(array('db1','db2','db3'));

//del users
$db->delUser(array('user1','user1','user3'));

//we can also check whether a db/user exists
if($db->isUserExists('cpuser')) echo 'User exists';

if($db->isDbExists('cpdb')) echo 'Db exists';

Comments (1)

Información Bitacoras.com…

Valora en Bitacoras.com: Hace un par de días necesitaba para un proyecto, que determinados clientes puedan acceder a las bases de datos del servidor, desde si mini panel en el sitio web. Encontre esta clase que me ayudo bastante. /** * Name: cPanel D…..

Write a comment