Hello and welcome to our community! Is this your first visit?
Register
Enjoy an ad free experience by logging in. Not a member yet? Register.
Results 1 to 3 of 3
  1. #1
    New to the CF scene
    Join Date
    Apr 2009
    Posts
    1
    Thanks
    0
    Thanked 0 Times in 0 Posts

    cPanel XML API and PHP...

    Ok. I'm trying to get the createacct function to work using cPanel WHM API.
    Here's createacct.php
    PHP Code:
    <?php
    header
    ('Content-Type: text/xml');
    echo 
    "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
    echo 
    "<?xml-stylesheet type=\"text/xsl\" href=\"style.xsl\"?>";

    # cpanel12 - createacct_example.php                Copyright(c) 1997-2009 cPanel, Inc.
    #                                                           All Rights Reserved.
    # copyright@cpanel.net                                         http://cpanel.net

    include("xmlapi.php.inc");

    $ip "127.0.0.1";
    $kh3us_pass "*********";

    $xmlapi = new xmlapi($ip);
    $xmlapi->password_auth("kh3us",$kh3us_pass);

    $xmlapi->set_debug(1);

    $acct = array( username => "souser"password => "pass123"domain => "thdomain.com");
    print 
    $xmlapi->createacct($acct);
    ?>
    xmlapi.php.inc
    PHP Code:
    <?php

    # cpanel12 - xmlapi.php.inc                Copyright(c) 1997-2009 cPanel, Inc.
    #                                                           All Rights Reserved.
    # copyright@cpanel.net                                         http://cpanel.net
    # Version 1.0

    class xmlapi {
        public 
    $host;
        public 
    $curl;
        
        private 
    $port 2087;
        private 
    $protocol "https://";
        private 
    $debug 0;
        private 
    $return_xml 0;

        function 
    __construct($host) {
            
    $this->host $host;
            
    $this->curl curl_init();                                # Create Curl Object
            
    curl_setopt($this->curlCURLOPT_SSL_VERIFYPEER,0);
             
    curl_setopt($this->curlCURLOPT_RETURNTRANSFER,1);        # Return contents of transfer on curl_exec
            
    curl_setopt($this->curlCURLOPT_SSL_VERIFYHOST,0);        # Allow self-signed certs
        
    }
        
        function 
    __destruct() {
            
    curl_close($this->curl);                                # destroy curl object on unset
        
    }
        
        public function 
    set_debug($debug) {
            
    $this->debug $debug;
        }

        public function 
    set_port($port) {
            
    $this->port $port;
            if (
    $port == "2087" || $port == "2083" || $port == "443") {
                
    $this->protocol "https://";
            } else {
                
    $this->protocol "http://";
            }
        }
        
        public function 
    return_xml($value ) {
            
    $this->return_xml 1;
        }
        
        public function 
    return_object($value 1) {
            
    $this->return_xml 0;
        }
        
        public function 
    password_auth($username,$password) {
            
    curl_setopt($this->curlCURLOPT_USERPWD$username.":".$password);
        }
        
        public function 
    hash_auth($user,$hash) {
            
    $header[0] = "Authorization: WHM $user:" preg_replace("'(\r|\n)'","",$hash);
            
    curl_setopt($this->curl,CURLOPT_HTTPHEADER,$header);
        }

        public function 
    xmlapi_query($function$calls = array()) {
            if (!
    $function) {
                
    error_log("xmlapi_query() requires a function to be passed to it");
                return;
            }
            
            
    $args http_build_query($calls);
            
    $query =  $this->protocol $this->host ":" $this->port "/xml-api/" $function "?" $args;

            if (
    $this->debug) {
                print 
    "\n\nQUERY:\n" $query "\n\n";
            }

            
    curl_setopt($this->curlCURLOPT_URL$query);
            
    $result curl_exec($this->curl);

            if (
    $result == false) {
                
    error_log("curl_exec threw error \"" curl_error($this->curl) . "\" for $query");
            }

            if (
    $this->return_xml) {
                if (
    $this->debug) {
                    print 
    "RAW XML:\n\n$result\n\n";
                }
                return 
    $result;
            } else {
                if (
    $this->debug) {
                    print 
    "RAW XML:\n\n$result\n\n";
                    print 
    "SIMPLEXML OBJ:\n\n" var_dump(simplexml_load_string($result)) . "\n\n";
                }
                return 
    simplexml_load_string($result);
            }

        }
        
        
        
        public function 
    api1_query($user,$module,$function,$args) {
            
    $api_call = array(
                
    module => $module,
                
    func => $function,
                
    apiversion => "1",
                
    args => $args
            
    );
            
            
    $call = array(
                
    user => $user,
                
    xmlin => $this->build_api1_call($api_call),
            );
            
            return 
    $this->xmlapi_query("cpanel",$call);
        }
        
        public function 
    api2_query($user,$module,$function,$args) {
            
    $api_call = array(
                
    module => $module,
                
    func => $function,
                
    args => $args
            
    );
            
            
    $call = array(
                
    user => $user,
                
    xmlin => $this->build_api2_call($api_call)
            );
            return 
    $this->xmlapi_query("cpanel",$call);
        }
        
        public function 
    build_api2_call($input) {
            
    $output "<cpanelaction>";
            foreach(
    $input as $tag => $data) {
                if (
    is_array($data)) {
                    
    $output .= "<args>";
                    foreach (
    $data as $arg_tag => $arg) {
                        
    $output .= "<$arg_tag>" $arg "</$arg_tag>";
                    }
                    
    $output .= "</args>";
                } else {
                   
    $output .= "<$tag>" $data "</$tag>";
                }
            }
            
    $output .= "</cpanelaction>";
            if (
    $this->debug) {
                print 
    "\n\nRAW API2 CALL:\n" $output "\n\n";
            }
            return 
    $output;
        }

        public function 
    build_api1_call($input) {
            
    $output "<cpanelaction>";
            foreach(
    $input as $tag => $data) {
                if (
    is_array($data)) {
                    foreach (
    $data as $arg) {
                        
    $output .= "<args>" $arg "</args>";
                    }
                } else {
                   
    $output .= "<$tag>" $data "</$tag>";
                }
            }
            
    $output .= "</cpanelaction>";
            if (
    $this->debug) {
                print 
    "\n\nRAW API1 CALL:\n" $output "\n\n";
            }
            return 
    $output;
        }
        
        
    ####
        #  XML API Functions
        ####
        
        ####
        # Accounting
        ####
        
        
        ####
        # createacct($accthash)
        # This needs to be passed in a hash where username, password and domain are all defined.
        # all other arguments are optional
        ####
        
    public function createacct($acctinfo) {
            if (!isset(
    $acctinfo['username']) || !isset($acctinfo['password']) || !isset($acctinfo['domain'])) {
                
    error_log("createacct requires that username, password & domain elements are in the array passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("createacct"$acctinfo);
        }
        
        
        public function 
    removeacct($username) {
            if (!isset(
    $username)) {
                
    error_log("killacct requires that a username is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("removeacct",array("user" => $username));
        }
        
        public function 
    passwd($user,$pass){
            if (!isset(
    $user) || !isset($pass)) {
                
    error_log("passwd requires that (username,password) are passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("passwd", array("user" => $user"pass" => $pass));
        }
        
        public function 
    listaccts($searchtype null$search null) {
            if (
    $search) {
                return 
    $this->xmlapi_query("listaccts", array( "searchtype" => $searchtype"search" => $search ) );
            } else {
                return 
    $this->xmlapi_query("listaccts");
            }
        }
        
        public function 
    accoutsummary($username) {
            if (!isset(
    $username)) {
                
    error_log("accountsummary requires that a username is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("accountsummary",array(user => $username));
        }
        
        public function 
    suspendacct($username$reason null) {
            if (!isset(
    $username)) {
                
    error_log("suspendacct requires that a username is passed to it");
                return 
    0;
            }
            if (
    $reason) {
                return 
    $this->xmlapi_query("suspendacct",array( "user" => $username"reason" => $reason ));
            } else {
                return 
    $this->xmlapi_query("suspendacct", array("user" => $username));
            }
        }
        
        public function 
    unsuspendacct($username){
            if (!isset(
    $username)) {
                
    error_log("unsuspendacct requires that a username is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("unsuspendacct", array("user" => $username));
        }
        
        public function 
    modifyacct($opts) {
            if (!isset(
    $opts['user'])) {
                
    error_log("modifyacct requires that user is defined in the array passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("modifyacct",$opts);
        }
        
        
    ####
        # Package Functions
        ####
        
        
    public function addpkg($pkg) {
            if (!isset(
    $pkg['name'])) {
                
    error_log("addpkg requires that name is defined in the array passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query('addpkg'$pkg);
        }

        public function 
    killpkg($pkg) {
            if(!isset(
    $pkg)) {
                
    error_log("killpkg requires that the package name is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query('killpkg',array("pkg" => $pkg));
        }
        
        public function 
    editpkg($pkg) {
            if (!
    $isset($pkg['name'])) {
                
    error_log("editpkg requires that name is defined in the array passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("editpkg",$pkg);
        }
        
        public function 
    listpkgs() {
            return 
    $self->query('listpkgs');
        }
        
        
    ####
        # Reseller Functions
        ####
        
        
    public function setupreseller($user,$makeowner) {
            if (!isset(
    $user) || !isset($makeowner)) {
                
    error_log("setupreseller requires that (user,makeowner) are passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("setupreseller",array("user" => $user"makeowner" => $makeowner));
        }
        
        public function 
    unsetupreseller($user) {
            if (!isset(
    $user)) {
                
    error_log("unsetupreseller requires that a reseller name is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("unsetupreseller",array("user"=>$user));
        }
        
        public function 
    listresellers() {
            return 
    $this->xmlapi_query('listresellers');
        }
        
        public function 
    saveacllist($acl) {
            if (!isset(
    $acl['acllist'])) {
                
    error_log("saveacllist requires that acllist is defined in the array passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query('saveacllist',$act);
        }
        
        public function 
    setacls($acl) {
            if (!isset(
    $acl['reseller'])) {
                
    error_log("setacls requires that reseller is defined in the array passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("setacls"$acl);
        }
        
        public function 
    terminatereseller($reseller,$terminatereseller) {
            if (!isset(
    $reseller) || !isset($terminatereseller)) {
                
    error_log("terminatereseller requires that (reseller|terminatereseller) are passed to it");
                return 
    0;
            }
            
    $verify "I%20understand%20this%20will%20irrevocably%20remove%20all%20the%20accounts%20owned%20by%20the%20reseller%20" $reseller;
            return 
    $this->xmlapi_query("terminatereseller",array("reseller" => $reseller"terminatereseller" => $terminatereseller"verify" => $verify));
        }
        
        
    ####
        # Server Info
        ####
        
        
    public function version() {
            return 
    $this->xmlapi_query("version");
        }
        
        public function 
    hostname() {
            return 
    $this->xmlapi_query('hostname');
        }
        
        
    ####
        # Service Functions
        ####
        
        
    public function restartsrv($service) {
            if (!isset(
    $service)) {
                
    error_log("restartsrv requires that service is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("restartservice",array('service' => $service));
        }
        
        public function 
    applist() {
            return 
    $this->xmlapi_query("applist");
        }
        
        public function 
    myprivs() {
            return 
    $this->xmlapi_query("myprivs");
        }
        
        public function 
    sethostname($hostname) {
            if (!isset(
    $hostname)) {
                
    error_log("sethostname requires that hostname is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("sethostname", array("hostname"=>$hostname));
        }
        
        public function 
    addip($ip,$netmask) {
            if (!isset(
    $ip,$netmask)) {
                
    error_log("addip requires that an IP address and Netmask are passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("addip",array("ip"=>$ip,"netmask"=>$netmask));
        }
        
        public function 
    delip($ip) {
            if (!isset(
    $ip)) {
                
    error_log("delip requires that an IP is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("delip", array("ip"=>$ip));
        }
        
        public function 
    listips() {
            return 
    $this->xmlapi_query("listips");
        }

        
    ####
        # DNS Functions
        ####
        
        
    public function adddns($domain,$ip) {
            if (!isset(
    $domain) || !isset($ip)) {
                
    error_log("adddns require that domain, ip are passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("adddns", array("domain"=>$domain,"ip"=>$ip));
        }
        
        public function 
    killdns($domain) {
            if (!isset(
    $domain)) {
                
    error_log("killdns requires that domain is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("killdns", array("domain"=>$domain));
        }

        public function 
    listzones() {
            return 
    $this->xmlapi_query("listzones");
        }
        
        public function 
    dumpzone($domain) {
            if (!isset(
    $domain)) {
                
    error_log("dumpzone requires that a domain is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("dumpzone",array("domain"=>$domain));
        }
        
        public function 
    lookupnsip($nameserver) {
            if (!isset(
    $nameserver)) {
                
    error_log("lookupnsip requres that a nameserver is passed to it");
                return 
    0;
            }
            return 
    $this->xmlapi_query("lookupnsip",array("nameserver"=>$nameserver));
        }

        
    }

    ?>
    After running the script, I get a blank page but this in the source code:
    PHP Code:
    <?xml version="1.0" encoding="ISO-8859-1"?><?xml-stylesheet type="text/xsl" href="style.xsl"?>

    QUERY:
    https://127.0.0.1:2087/xml-api/createacct?username=souser&password=pass123&domain=thdomain.com

    RAW XML:

    <createacct>
      <result>
        <options>
          <ip>174.132.240.50</ip>
          <nameserver>ns1.kh3.us</nameserver>
          <nameserver2>ns2.kh3.us</nameserver2>
          <nameserver3></nameserver3>
          <nameserver4></nameserver4>
          <nameservera></nameservera>
          <nameservera2></nameservera2>
          <nameservera3></nameservera3>
          <nameservera4></nameservera4>
          <nameserverentry></nameserverentry>
          <nameserverentry2></nameserverentry2>
          <nameserverentry3></nameserverentry3>
          <nameserverentry4></nameserverentry4>
          <package>default</package>
        </options>
        <rawout>Checking input data...System has 0 free ips.
    ...DoneWWWAcct 12.1.0 (c) 1997-2008 cPanel, Inc....

    Dns Zone check is enabled.
    +===================================+
    | New Account Info                  |
    +===================================+
    | Domain: thdomain.com
    | Ip: 174.132.240.50 (n)
    | HasCgi: y
    | UserName: souser
    | PassWord: pass123
    | CpanelMod: x3
    | HomeRoot: /home
    | Quota: 0 Meg
    | NameServer1: ns1.kh3.us
    | NameServer2: ns2.kh3.us
    | NameServer3: 
    | NameServer4: 
    | Contact Email: 
    | Package: default
    | Feature List: default
    | Language: english
    +===================================+
    ...DoneRunning pre creation script (/scripts/prewwwacct)......DoneAdding User...Removing Shell Access (n)
    ...DoneCopying skel files from /home/kh3us/cpanel3-skel/ to /home/souser/......DoneAdding Entries to httpd.conf......DoneSetting up Mail &amp; Local Domains...localdomains...valiases ...vdomainaliases...vfilters......DoneConfiguring DNS......DoneRestarting apache......DoneChanging password for souser
    Password for souser has been changed
    Updating Authentication Databases...Updating ftp passwords for souser
    Ftp password files updated.
    Ftp vhost passwords synced
    ...DoneVerifying MX Records and Setting up Databases......DoneSetting up Proxy Subdomains......DoneBind reconfiguring on sapphire using rndc
    Sending Account Information......DoneSystem has 0 free ips.
    Running post creation scripts (/scripts/legacypostwwwacct, /scripts/postwwwacct, /scripts/postwwwacctuser)......Donewwwacct creation finished
    Setting up Domain Pointers......DoneSetting Reseller Privs......DoneAccount Creation Complete!!!...Account Creation Ok...Done</rawout>
        <status>1</status>
        <statusmsg>Account Creation Ok</statusmsg>
      </result>
    </createacct>

    <!-- Web Host Manager  (c) cPanel, Inc. 2008 http://cpanel.net/  Unauthorized copying is prohibited. -->


    object(SimpleXMLElement)#2 (1) {
      ["result"]=>
      object(SimpleXMLElement)#3 (4) {
        ["options"]=>
        object(SimpleXMLElement)#4 (14) {
          ["ip"]=>
          string(14) "174.132.240.50"
          ["nameserver"]=>
          string(10) "ns1.kh3.us"
          ["nameserver2"]=>
          string(10) "ns2.kh3.us"
          ["nameserver3"]=>
          object(SimpleXMLElement)#5 (0) {
          }
          ["nameserver4"]=>
          object(SimpleXMLElement)#6 (0) {
          }
          ["nameservera"]=>
          object(SimpleXMLElement)#7 (0) {
          }
          ["nameservera2"]=>
          object(SimpleXMLElement)#8 (0) {
          }
          ["nameservera3"]=>
          object(SimpleXMLElement)#9 (0) {
          }
          ["nameservera4"]=>
          object(SimpleXMLElement)#10 (0) {
          }
          ["nameserverentry"]=>
          object(SimpleXMLElement)#11 (0) {
          }
          ["nameserverentry2"]=>
          object(SimpleXMLElement)#12 (0) {
          }
          ["nameserverentry3"]=>
          object(SimpleXMLElement)#13 (0) {
          }
          ["nameserverentry4"]=>
          object(SimpleXMLElement)#14 (0) {
          }
          ["package"]=>
          string(7) "default"
        }
        ["rawout"]=>
        string(1624) "Checking input data...System has 0 free ips.
    ...DoneWWWAcct 12.1.0 (c) 1997-2008 cPanel, Inc....

    Dns Zone check is enabled.
    +===================================+
    | New Account Info                  |
    +===================================+
    | Domain: thdomain.com
    | Ip: 174.132.240.50 (n)
    | HasCgi: y
    | UserName: souser
    | PassWord: pass123
    | CpanelMod: x3
    | HomeRoot: /home
    | Quota: 0 Meg
    | NameServer1: ns1.kh3.us
    | NameServer2: ns2.kh3.us
    | NameServer3: 
    | NameServer4: 
    | Contact Email: 
    | Package: default
    | Feature List: default
    | Language: english
    +===================================+
    ...DoneRunning pre creation script (/scripts/prewwwacct)......DoneAdding User...Removing Shell Access (n)
    ...DoneCopying skel files from /home/kh3us/cpanel3-skel/ to /home/souser/......DoneAdding Entries to httpd.conf......DoneSetting up Mail & Local Domains...localdomains...valiases ...vdomainaliases...vfilters......DoneConfiguring DNS......DoneRestarting apache......DoneChanging password for souser
    Password for souser has been changed
    Updating Authentication Databases...Updating ftp passwords for souser
    Ftp password files updated.
    Ftp vhost passwords synced
    ...DoneVerifying MX Records and Setting up Databases......DoneSetting up Proxy Subdomains......DoneBind reconfiguring on sapphire using rndc
    Sending Account Information......DoneSystem has 0 free ips.
    Running post creation scripts (/scripts/legacypostwwwacct, /scripts/postwwwacct, /scripts/postwwwacctuser)......Donewwwacct creation finished
    Setting up Domain Pointers......DoneSetting Reseller Privs......DoneAccount Creation Complete!!!...Account Creation Ok...Done"
        ["status"]=>
        string(1) "1"
        ["statusmsg"]=>
        string(19) "Account Creation Ok"
      }
    }
    SIMPLEXML OBJ:
    I'm trying to figure out how I would display the "rawout" data in simpleXML. The one with account info.

  • #2
    Moderator
    Join Date
    May 2002
    Location
    Hayward, CA
    Posts
    1,453
    Thanks
    1
    Thanked 21 Times in 19 Posts
    I think the next step would be to look at style.xsl. It's probably doing a transformation that isn't working the way you expect.

    Try removing the line that prints that processing instruction and see what happens.
    "The first step to confirming there is a bug in someone else's work is confirming there are no bugs in your own."
    June 30, 2001
    author, Verbosio prototype XML Editor
    author, JavaScript Developer's Dictionary
    https://alexvincent.us/blog

  • #3
    New to the CF scene
    Join Date
    Oct 2009
    Location
    Bangladesh
    Posts
    1
    Thanks
    0
    Thanked 0 Times in 0 Posts
    Thanks a lot for this script.

    but there is some error

    they show

    XML Parsing Error: syntax error
    Location: http://www.shonkolon.com/createacct.php
    Line Number 3, Column 1:


    html code of this page

    <?xml version="1.0" encoding="ISO-8859-1"?><?xml-stylesheet type="text/xsl" href="style.xsl"?>

    QUERY:
    https://127.0.0.1:2087/xml-api/creat...=thdomain8.com

    RAW XML:

    <createacct>
    <result>
    <options></options>
    <rawout></rawout>
    <status>0</status>
    <statusmsg>Sorry, a group for that username already exists.</statusmsg>

    </result>
    </createacct>

    <!-- Web Host Manager (c) cPanel, Inc. 2008 http://cpanel.net/ Unauthorized copying is prohibited. -->


    object(SimpleXMLElement)#2 (1) {
    ["result"]=>
    object(SimpleXMLElement)#3 (4) {
    ["options"]=>
    object(SimpleXMLElement)#4 (0) {
    }
    ["rawout"]=>
    object(SimpleXMLElement)#5 (0) {
    }
    ["status"]=>
    string(1) "0"
    ["statusmsg"]=>
    string(48) "Sorry, a group for that username already exists."
    }
    }
    SIMPLEXML OBJ:




    its make cPanel account successfully. but just show this error.

    thanks again

    regards,
    rejuan


  •  

    Posting Permissions

    • You may not post new threads
    • You may not post replies
    • You may not post attachments
    • You may not edit your posts
    •