502 lines
No EOL
16 KiB
PHP
502 lines
No EOL
16 KiB
PHP
<?php if (!defined('WHMCS')) exit('ACCESS DENIED');
|
|
// Copyright (c) 2012, Outercurve Foundation.
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without modification,
|
|
// are permitted provided that the following conditions are met:
|
|
//
|
|
// - Redistributions of source code must retain the above copyright notice, this
|
|
// list of conditions and the following disclaimer.
|
|
//
|
|
// - Redistributions in binary form must reproduce the above copyright notice,
|
|
// this list of conditions and the following disclaimer in the documentation
|
|
// and/or other materials provided with the distribution.
|
|
//
|
|
// - Neither the name of the Outercurve Foundation nor the names of its
|
|
// contributors may be used to endorse or promote products derived from this
|
|
// software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
/**
|
|
* WebsitePanel Enterprise Server Client
|
|
* For the ASPnix WebsitePanel system only - Only tested against the ASPnix WebsitePanel system
|
|
*
|
|
* @author Christopher York
|
|
* @link http://www.websitepanel.net/
|
|
* @access public
|
|
* @name websitepanel_EnterpriseServer
|
|
* @version 3.0.4
|
|
* @package WHMCS
|
|
* @final
|
|
*/
|
|
final class websitepanel_EnterpriseServer
|
|
{
|
|
/**
|
|
* WebsitePanel user account statuses / states
|
|
*
|
|
* @access public
|
|
* @var string
|
|
*/
|
|
const USERSTATUS_ACTIVE = 'Active';
|
|
const USERSTATUS_SUSPENDED = 'Suspended';
|
|
const USERSTATUS_CANCELLED = 'Cancelled';
|
|
const USERSTATUS_PENDING = 'Pending';
|
|
|
|
/**
|
|
* WebsitePanel usage calculation types
|
|
*
|
|
* @access public
|
|
* @var int
|
|
*/
|
|
const USAGE_DISKSPACE = 0;
|
|
const USAGE_BANDWIDTH = 1;
|
|
|
|
/**
|
|
* Enterprise Server username
|
|
*
|
|
* @access private
|
|
* @var string
|
|
*/
|
|
private $_username;
|
|
|
|
/**
|
|
* Enterprise Server password
|
|
*
|
|
* @access private
|
|
* @var string
|
|
*/
|
|
private $_password;
|
|
|
|
/**
|
|
* Enterprise Server URL / address (without the port)
|
|
*
|
|
* @access private
|
|
* @var string
|
|
*/
|
|
private $_host;
|
|
|
|
/**
|
|
* Enterprise Server TCP port
|
|
*
|
|
* @access private
|
|
* @var int
|
|
*/
|
|
private $_port;
|
|
|
|
/**
|
|
* Use SSL (HTTPS) for Enterprise Server communications
|
|
*
|
|
* @access private
|
|
* @var boolean
|
|
*/
|
|
private $_secured;
|
|
|
|
/**
|
|
* SoapClient WSDL caching
|
|
*
|
|
* @access private
|
|
* @var boolean
|
|
*/
|
|
private $_caching;
|
|
|
|
/**
|
|
* SoapClient HTTP compression
|
|
*
|
|
* @access private
|
|
* @var boolean
|
|
*/
|
|
private $_compression;
|
|
|
|
/**
|
|
* Class constructor
|
|
*
|
|
* @access public
|
|
* @param string $username
|
|
* @param string $password
|
|
* @param string $host
|
|
* @param int $port
|
|
* @param boolean $secured
|
|
* @param boolean $caching
|
|
* @param boolean $compression
|
|
*/
|
|
function __construct($username, $password, $host, $port = 9002, $secured = FALSE, $caching = FALSE, $compression = TRUE)
|
|
{
|
|
$this->_username = $username;
|
|
$this->_password = $password;
|
|
$this->_host = $host;
|
|
$this->_port = $port;
|
|
$this->_secured = $secured;
|
|
$this->_caching = $caching;
|
|
$this->_compression = $compression;
|
|
}
|
|
|
|
/**
|
|
* Executes the "CreateUserWizard" method
|
|
*
|
|
* @param array $params CreateUserWizard method parameters
|
|
* @throws Exception
|
|
* @return int
|
|
*/
|
|
public function createUserWizard($params)
|
|
{
|
|
try
|
|
{
|
|
return $this->execute('esPackages.asmx', 'CreateUserWizard', $params)->CreateUserWizardResult;
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("ChangeUserStatus Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "UpdateUser" method
|
|
*
|
|
* @access private
|
|
* @param array $params
|
|
* @throws Exception
|
|
* @return int
|
|
*/
|
|
public function updateUserDetails($params)
|
|
{
|
|
try
|
|
{
|
|
return $this->execute('esUsers.asmx', 'UpdateUser', array('user' => $params))->UpdateUserResult;
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("UpdateUser Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "DeleteUser" method
|
|
*
|
|
* @access public
|
|
* @param int $userId User's WebsitePanel userId
|
|
* @throws Exception
|
|
* @return int
|
|
*/
|
|
public function deleteUser($userId)
|
|
{
|
|
try
|
|
{
|
|
return $this->execute('esUsers.asmx', 'DeleteUser', array('userId' => $userId))->DeleteUserResult;
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("ChangeUserStatus Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "GetUserByUsername" method
|
|
*
|
|
* @access public
|
|
* @param string $username Websitepanel username
|
|
* @throws Exception
|
|
* @return array
|
|
*/
|
|
public function getUserByUsername($username)
|
|
{
|
|
try
|
|
{
|
|
return $this->convertArray($this->execute('esUsers.asmx', 'GetUserByUsername', array('username' => $username))->GetUserByUsernameResult);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("GetUserByUsername Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()})", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "ChangeUserStatus" method
|
|
*
|
|
* @access public
|
|
* @param int $userId User's WebsitePanel userId
|
|
* @param string $status Account status (Active, Suspended, Cancelled, Pending)
|
|
* @throws Exception
|
|
* @return int
|
|
*/
|
|
public function changeUserStatus($userId, $status)
|
|
{
|
|
try
|
|
{
|
|
return $this->execute('esUsers.asmx', 'ChangeUserStatus', array('userId' => $userId, 'status' => $status))->ChangeUserStatusResult;
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("ChangeUserStatus Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "ChangeUserPassword" method
|
|
*
|
|
* @access public
|
|
* @param int $userId User's WebsitePanel userId
|
|
* @param string $password User's new password
|
|
* @throws Exception
|
|
* @return int
|
|
*/
|
|
public function changeUserPassword($userId, $password)
|
|
{
|
|
try
|
|
{
|
|
return $this->execute('esUsers.asmx', 'ChangeUserPassword', array('userId' => $userId, 'password' => $password))->ChangeUserPasswordResult;
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("ChangeUserPassword Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "GetMyPackages" method
|
|
*
|
|
* @access public
|
|
* @param int $userId User's WebsitePanel userId
|
|
* @throws Exception
|
|
* @return array
|
|
*/
|
|
public function getUserPackages($userId)
|
|
{
|
|
try
|
|
{
|
|
return $this->convertArray($this->execute('esPackages.asmx', 'GetMyPackages', array('userId' => $userId))->GetMyPackagesResult->PackageInfo);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("GetMyPackages Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "GetUsersPagedRecursive" method
|
|
*
|
|
* @access public
|
|
* @param unknown $userId Users's WebsitePanel userId
|
|
* @param unknown $filterColumn Column value to filter against
|
|
* @param unknown $filterValue Filter value
|
|
* @param unknown $statusId Users's account status id
|
|
* @param unknown $roleId User's account role id
|
|
* @param unknown $sortColumn Column value to sort against
|
|
* @param number $startRow Start value
|
|
* @param string $maximumRows Maximum rows to return
|
|
* @throws Exception
|
|
* @return object
|
|
*/
|
|
public function getUsersPagedRecursive($userId, $filterColumn, $filterValue, $statusId, $roleId, $sortColumn, $startRow = 0, $maximumRows = PHP_INT_MAX)
|
|
{
|
|
try
|
|
{
|
|
$result = (array)$this->execute('esUsers.asmx', 'GetUsersPagedRecursive', array('userId' => $userId, 'filterColumn' => $filterColumn, 'filterValue' => $filterValue, 'statusId' => $statusId, 'roleId' => $roleId, 'sortColumn' => $sortColumn, 'startRow' => $startRow, 'maximumRows' => $maximumRows))->GetUsersPagedRecursiveResult;
|
|
return $this->convertArray($result['any'], TRUE);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("GetUsersPagedRecursive Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "UpdatePackageLiteral" method
|
|
*
|
|
* @access public
|
|
* @param int $packageId Package's WebsitePanel packageId
|
|
* @param int $statusId Package's status id
|
|
* @param int $planId Package's WebsitePanel planid
|
|
* @param string $purchaseDate Package's purchase date
|
|
* @param string $packageName Package's name
|
|
* @param string $packageComments Package's comments
|
|
* @throws Exception
|
|
* @return array
|
|
*/
|
|
public function updatePackageLiteral($packageId, $statusId, $planId, $purchaseDate, $packageName, $packageComments)
|
|
{
|
|
try
|
|
{
|
|
return $this->convertArray($this->execute('esPackages.asmx', 'UpdatePackageLiteral', array('packageId' => $packageId, 'statusId' => $statusId, 'planId' => $planId, 'purchaseDate' => $purchaseDate, 'packageName' => $packageName, 'packageComments' => $packageComments))->UpdatePackageLiteralResult);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("UpdatePackageLiteral Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "AddPackageAddonById" method
|
|
*
|
|
* @access public
|
|
* @param unknown $packageId WebsitePanel package Id
|
|
* @param unknown $addonPlanId WebsitePanel addon id
|
|
* @param number $quantity Number of addons to add :)
|
|
* @throws Exception
|
|
* @return array
|
|
*/
|
|
public function addPackageAddonById($packageId, $addonPlanId, $quantity = 1)
|
|
{
|
|
try
|
|
{
|
|
return $this->convertArray($this->execute('esPackages.asmx', 'AddPackageAddonById', array('packageId' => $packageId, 'addonPlanId' => $addonPlanId, 'quantity' => $quantity))->AddPackageAddonByIdResult);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("AddPackageAddonById Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "GetPackageBandwidth" method
|
|
*
|
|
* @access public
|
|
* @param unknown $packageId WebsitePanel package id
|
|
* @param unknown $startDate Calculation start date
|
|
* @param unknown $endDate Calculation end date
|
|
* @throws Exception
|
|
* @return object
|
|
*/
|
|
public function getPackageBandwidthUsage($packageId, $startDate, $endDate)
|
|
{
|
|
try
|
|
{
|
|
$result = (array)$this->execute('esPackages.asmx', 'GetPackageBandwidth', array('packageId' => $packageId, 'startDate' => $startDate, 'endDate' => $endDate))->GetPackageBandwidthResult;
|
|
return $this->convertArray($result['any'], TRUE);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("GetPackageBandwidth Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "GetPackageDiskspace" method
|
|
*
|
|
* @access public
|
|
* @param unknown $packageId WebsitePanel package id
|
|
* @throws Exception
|
|
* @return object
|
|
*/
|
|
public function getPackageDiskspaceUsage($packageId)
|
|
{
|
|
try
|
|
{
|
|
$result = (array)$this->execute('esPackages.asmx', 'GetPackageDiskspace', array('packageId' => $packageId))->GetPackageDiskspaceResult;
|
|
return $this->convertArray($result['any'], TRUE);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("GetPackageDiskspace Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the "AllocatePackageIPAddresses" method
|
|
*
|
|
* @access public
|
|
* @param int $packageId WebsitePanel package id
|
|
* @param string $groupName WebsitePanel IP address group name
|
|
* @param string $pool WebsitePanel IP address pool
|
|
* @param int $addressesNumber Number of IP addresses to allocate
|
|
* @param string $allocateRandom Allocate randomly
|
|
* @throws Exception
|
|
* @return object
|
|
*/
|
|
public function allocatePackageIPAddresses($packageId, $groupName = 'Web', $pool = 'WebSites', $addressesNumber = 1, $allocateRandom = TRUE)
|
|
{
|
|
try
|
|
{
|
|
return $this->convertArray($this->execute('esServers.asmx', 'AllocatePackageIPAddresses', array('packageId' => $packageId, 'groupName' => $groupName, 'pool' => $pool, 'addressesNumber' => $addressesNumber, 'allocateRandom' => $allocateRandom))->AllocatePackageIPAddressesResult);
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("AllocatePackageIPAddresses Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}", $e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Converts the WebsitePanel error code to a friendly human-readable message
|
|
*
|
|
* @access public
|
|
* @param int $code WebsitePanel error code
|
|
* @return string
|
|
*/
|
|
public static function getFriendlyError($code)
|
|
{
|
|
$errors = array(-100 => 'Username not available, already in use',
|
|
-101 => 'Username not found, invalid username',
|
|
-102 => 'User\'s account has child accounts',
|
|
-300 => 'Hosting package could not be found',
|
|
-301 => 'Hosting package has child hosting spaces',
|
|
-501 => 'The sub-domain belongs to an existing hosting space that does not allow sub-domains to be created',
|
|
-502 => 'The domain or sub-domain exists in another hosting space / user account',
|
|
-511 => 'Instant alias is enabled, but not configured',
|
|
-601 => 'The website already exists on the target hosting space or server',
|
|
-700 => 'The email domain already exists on the target hosting space or server',
|
|
-1100 => 'User already exists');
|
|
|
|
// Find the error and return it, else a general error will do!
|
|
if (array_key_exists($code, $errors))
|
|
{
|
|
return $errors[$code];
|
|
}
|
|
else
|
|
{
|
|
return "An unknown error occured (Code: {$code}). Please reference WebsitePanel BusinessErrorCodes for further information";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the request on the Enterprise Server and returns the results
|
|
*
|
|
* @param unknown $service
|
|
* @param unknown $method
|
|
* @param unknown $params
|
|
* @throws Exception
|
|
*/
|
|
private function execute($service, $method, $params)
|
|
{
|
|
// Set the Enterprise Server full URL
|
|
$host = (($this->_secured) ? 'https' : 'http') . "://{$this->_host}:{$this->_port}/{$service}?WSDL";
|
|
try
|
|
{
|
|
// Create the SoapClient
|
|
$client = new SoapClient($host, array('login' => $this->_username, 'password' => $this->_password, 'compression' => (($this->_compression) ? (SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP) : ''), 'cache_wsdl' => ($this->_caching) ? 1 : 0));
|
|
|
|
// Execute the request and process the results
|
|
return call_user_func(array($client, $method), $params);
|
|
}
|
|
catch (SoapFault $e)
|
|
{
|
|
throw new Exception("SOAP Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()})");
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
throw new Exception("General Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()})");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Converts an object or an XML string to an array
|
|
*
|
|
* @access private
|
|
* @param mixed $value Object or an XML string
|
|
* @param boolean $loadXml Loads the string into the SimpleXML object
|
|
* @return array
|
|
*/
|
|
private function convertArray($value, $loadXml = FALSE)
|
|
{
|
|
// This is silly, but it works, and it works very well for what we are doing :)
|
|
return json_decode(json_encode(($loadXml ? simplexml_load_string($value) : $value)), TRUE);
|
|
}
|
|
} |