Go Back   CodingForums.com > :: Client side development > XML

Before you post, read our: Rules & Posting Guidelines

Reply
 
Thread Tools Rate Thread
Enjoy an ad free experience by logging in. Not a member yet? Register.
Old 04-08-2009, 11:29 PM   PM User | #1
Ricardo-san
New to the CF scene

 
Join Date: Apr 2009
Posts: 1
Thanks: 0
Thanked 0 Times in 0 Posts
Ricardo-san is an unknown quantity at this point
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.
Ricardo-san is offline   Reply With Quote
Old 04-09-2009, 08:37 PM   PM User | #2
Alex Vincent
Moderator


 
Join Date: May 2002
Location: Hayward, CA
Posts: 1,427
Thanks: 1
Thanked 19 Times in 17 Posts
Alex Vincent is on a distinguished road
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
Alex Vincent is offline   Reply With Quote
Old 10-21-2009, 07:30 AM   PM User | #3
rejuan
New to the CF scene

 
Join Date: Oct 2009
Location: Bangladesh
Posts: 1
Thanks: 0
Thanked 0 Times in 0 Posts
rejuan is an unknown quantity at this point
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
rejuan is offline   Reply With Quote
Reply

Bookmarks

Jump To Top of Thread


Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 03:38 AM.


Advertisement
Log in to turn off these ads.