Pushing the new v3.x.x series WHMCS WebsitePanel module

This commit is contained in:
Christopher York 2014-02-23 21:23:16 -06:00
parent bb873be496
commit a9263bc903
17 changed files with 1895 additions and 1707 deletions

View file

@ -0,0 +1,26 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>WHMCS WebsitePanel Server Module / Addons</title>
</head>
<body>
<h1>WHMCS WebsitePanel Server Module</h1>
<p style="color: #FF0000">DO NOT CONTACT WHMCS FOR SUPPORT WITH THIS MODULE</p>
<h3>Changelog / Updates</h3>
<p>2-23-2014 (v3.0.2)</p>
<ul>
<li>HTTP communications now support GZIP compression (enabled by default)</li>
</ul>
<p>2-22-2014 (v3.0.1)</p>
<ul>
<li>Usage calculation now works with multiple WebsitePanel ES installations</li>
<li>Large amount of refactoring</li>
<li>Addon hooks (WSP Addons and WSP Client Sync) now execute only when the addon is activated</li>
<li>Improved logging</li>
<li>Client area &quot;one-click login&quot; is now a POST form instead of a link. Credentials are no longer passed through a standard HREF link</li>
<li>Admin area &quot;one-click login&quot; is now a link directly to the WebsitePanel account rather than a login link to WebsitePanel</li>
</ul>
</body>
</html>

View file

@ -1,6 +0,0 @@
04/16/2013 (1.3)
* Some refactoring done
01/29/2013 (1.2)
* WebsitePanel addons no longer require the storage of the Enterprise Server credentials
* Error codes are not properly resolved to their text responses

View file

@ -0,0 +1,14 @@
<title>WHMCS WebsitePanel Server Module / Addons</title>
<h1>WHMCS WebsitePanel Server Module</h1>
<p style="color: #FF0000">DO NOT CONTACT WHMCS FOR SUPPORT WITH THIS MODULE</p>
<h3>Update from the previous available version... (The version prior to 2-23-2014)</h3>
<ol>
<li><strong>Backup all files / directories before deleting!!</strong></li>
<li> Delete includes/hooks/websitepanel_sync.php</li>
<li>Delete includes/hooks/websitepanel_addons.php</li>
<li> Delete modules/servers/websitepanel</li>
<li>Delete modules/addons/websitepanel_sync</li>
<li>Delete modules/addons/websitepanel_addons</li>
<li>Upload the contents of the ZIP to your WHMCS root</li>
</ol>
<p>All new files should have version 3.x.x listed in their headers</p>

View file

@ -1,137 +0,0 @@
<?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 Addons Hook
*
* @author Christopher York
* @package WebsitePanel Addons Hook
* @version v1.0
* @link http://www.websitepanel.net/
*/
/**
* websitepanel_addons_AddonActivation
*
* @access public
* @return array
*/
function websitepanel_addons_AddonActivation($params)
{
// Sanity check to make sure the associated service is WebsitePanel based product
// And that the addon purchased has an associated WebsitePanel addon
$results = full_query("SELECT h.id AS `id` FROM `tblhosting` AS h, `mod_wspaddons` AS w, `tblservers` AS s WHERE h.id = {$params['serviceid']} AND h.server = s.id AND s.type = 'websitepanel' AND w.whmcs_id = {$params['addonid']}");
if (mysql_num_rows($results) > 0)
{
// Include the WebsitePanel ES Class
require_once(ROOTDIR . '/modules/servers/websitepanel/websitepanel.class.php');
require_once(ROOTDIR . '/modules/servers/websitepanel/websitepanel.functions.php');
// Retrieve the WebsitePanel Addons module settings
$modSettings = websitepanel_addons_GetSettings();
$srvSettings = websitepanel_GetServerSettings();
if (empty($modSettings['serverhost']) || empty($modSettings['serverport']) || empty($srvSettings['username']) || empty($srvSettings['password']))
{
// The module is disabled or has not yet been configured - stop
return;
}
// Get the associated WebsitePanel username from WHMCS
$results = select_query('tblhosting', 'username', array('id' => $params['serviceid']));
$username = mysql_fetch_array($results);
$username = $username['username'];
if (empty($username))
{
// The username is required - if missing we cannot continue
return;
}
// Create the WebsitePanel object instance
$wsp = new WebsitePanel($srvSettings['username'], $srvSettings['password'], $modSettings['serverhost'], $modSettings['serverport'], (($modSettings['serversecured']) == 'on' ? TRUE : FALSE));
// Grab the user's details from WebsitePanel in order to get the user's id
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
return;
}
// Get the user's current WebsitePanel hosting space Id (Hosting Plan)
$package = $wsp->getUserPackages($user['UserId']);
$packageId = $package['PackageId'];
if (empty($packageId))
{
return;
}
// Get the associated WebsitePanel addon id
$results = select_query('mod_wspaddons', 'wsp_id,is_ipaddress', array('whmcs_id' => $params['addonid']));
$addon = mysql_fetch_array($results);
$addonPlanId = $addon['wsp_id'];
$addonIsIpAddress = $addon['is_ipaddress'];
// Add the Addon Plan to the customer's WebsitePanel package / hosting space
$results = $wsp->addPackageAddonById($packageId, $addonPlanId);
// Check the results to verify that the addon has been successfully allocated
if ($results['Result'] > 0)
{
// If this addon is an IP address addon - attempt to randomly allocate an IP address to the customer's hosting space
if ($addonIsIpAddress)
{
$wsp->packageAllocateIpAddress($packageId);
}
}
}
}
/* Addon Activation - WebsitePanel */
add_hook('AddonActivation', 1, 'websitepanel_addons_AddonActivation');
/* Addon Activation - WebsitePanel */
add_hook('AddonActivated', 1, 'websitepanel_addons_AddonActivation');
/**
* websitepanel_addons_GetSettings
*
* @access public
* @return array
*/
function websitepanel_addons_GetSettings()
{
$settings = array();
// Retrieve the settings from the modules configuration table
$results = select_query('tbladdonmodules', 'setting,value', array('module' => 'websitepanel_addons'));
while (($row = mysql_fetch_array($results)) != false)
{
$settings[$row[0]] = $row[1];
}
return $settings;
}

View file

@ -1,114 +0,0 @@
<?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 Sync Hook
*
* @author Christopher York
* @package WebsitePanel Sync Hook
* @version v1.0
* @link http://www.websitepanel.net/
*/
/**
* websitepanel_sync_ClientEdit
*
* @access public
* @param array $params
*/
function websitepanel_sync_ClientEdit($params)
{
// Sanity check - Check if client has any active WebsitePanel hosting packages
$results = full_query("SELECT h.userid AS `userid` FROM `tblhosting` AS h, `tblservers` AS s WHERE h.userid = {$params['userid']} AND h.server = s.id AND s.type = 'websitepanel'");
if (mysql_num_rows($results) > 0)
{
// Include the WebsitePanel ES Class
require_once(ROOTDIR . '/modules/servers/websitepanel/websitepanel.class.php');
require_once(ROOTDIR . '/modules/servers/websitepanel/websitepanel.functions.php');
// Retrieve the WebsitePanel Addons module settings
$modSettings = websitepanel_sync_GetSettings();
$srvSettings = websitepanel_GetServerSettings();
if (empty($modSettings['serverhost']) || empty($modSettings['serverport']) || empty($srvSettings['username']) || empty($srvSettings['password']))
{
// The module is disabled or has not yet been configured - stop
return;
}
// Create the WebsitePanel object instance
$wsp = new WebsitePanel($srvSettings['username'], $srvSettings['password'], $modSettings['serverhost'], $modSettings['serverport'], (($modSettings['serversecured']) == 'on' ? TRUE : FALSE));
// Get all WSP users with the old email
$items = (array)$wsp->getUsersPagedRecursive(1, 'Email', $params['olddata']['email'], 0, 0, '');
// Load / parse the XML response
$xml = simplexml_load_string($items['any']);
$rootPath = $xml->NewDataSet;
// Total number of elements to update
$total = $rootPath->Table->Column1;
// Begin updating WebsitePanel accounts
for ($i = 0; $i < $total; $i++)
{
// Set the current root element and get the users details from WebsitePanel
// We cannot use the details provided by the get_users_paged_recursive method as it does not return all the required elements to fully update the user
$currentRoot = $rootPath->Table1->$i;
$userDetails = (array)$wsp->getUserByUsername($currentRoot->Username);
// Update the current user
$wsp->updateUserDetails($userDetails['RoleId'], (($userDetails['RoleId'] == 2) ? 'Reseller' : 'User'), $userDetails['StatusId'], $userDetails['Status'], $userDetails['LoginStatusId'], $userDetails['LoginStatus'], $userDetails['FailedLogins'], $userDetails['UserId'], $userDetails['OwnerId'], $userDetails['Created'], $userDetails['Changed'], $userDetails['IsDemo'], $userDetails['IsPeer'], $currentRoot->Comments, $userDetails['Username'], $userDetails['Password'], $params['firstname'], $params['lastname'], $params['email'], $params['phonenumber'], $params['postcode'], '', '', '', '', $params['country'], $params['address1'] . (!empty($params['address2']) ? " {$params['address2']}" : ''), $params['city'], $params['state'], TRUE, $params['companyname'], (($userDetails['RoleId'] == 2) ? TRUE : FALSE));
// Add log entry to client log
logactivity("WebsitePanel Sync - Account {$currentRoot->Username} contact details updated successfully", $params['userid']);
}
}
}
/* Update Client Contact Details - WebsitePanel */
add_hook('ClientEdit', 1, 'websitepanel_sync_ClientEdit');
/**
* websitepanel_addons_GetSettings
*
* @access public
* @return array
*/
function websitepanel_sync_GetSettings()
{
$settings = array();
// Retrieve the settings from the modules configuration table
$results = select_query('tbladdonmodules', 'setting,value', array('module' => 'websitepanel_sync'));
while (($row = mysql_fetch_array($results)) != false)
{
$settings[$row['setting']] = $row['value'];
}
return $settings;
}

View file

@ -0,0 +1,128 @@
<?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 server module core files
require_once(ROOTDIR. '/modules/servers/websitepanel/enterpriseserver.php');
/**
* WebsitePanel Enterprise Server Client
*
* @author Christopher York
* @link http://www.websitepanel.net/
* @access public
* @name websitepanel_EnterpriseServer
* @version 3.0.2
* @package WHMCS
* @final
*/
/**
* Handles activating and adding client addons to WebsitePanel
*
* @access public
* @param array $params WHMCS parameters
* @throws Exception
*/
function websitepanel_addons_AddonActivation($params)
{
// WHMCS server parameters & package parameters
$userId = $params['userid'];
$serviceId = $params['serviceid'];
$addonId = $params['addonid'];
$result = full_query("SELECT h.username AS username, s.ipaddress AS serverip, s.hostname AS serverhostname, s.secure AS serversecure, s.username AS serverusername, s.password AS serverpassword, p.configoption6 AS configoption6, h.id AS serviceid FROM `tblhosting` AS h, `tblservers` AS s, `tblproducts` AS p, `mod_wspaddons` AS w WHERE h.packageid = p.id AND w.whmcs_id = {$addonId} AND h.id = {$serviceId} AND h.server = s.id AND s.type = 'websitepanel'");
if (mysql_num_rows($result) > 0)
{
// Get the results of the query
$row = mysql_fetch_assoc($result);
// Start processing the users addon
$username = $row['username'];
$serverUsername = $row['serverusername'];
$serverPassword = decrypt($row['serverpassword']);
$serverPort = $row['configoption6'];
$serverHost = empty($row['serverhostname']) ? $row['serverip'] : $row['serverhostname'];
$serverSecure = $row['serversecure'] == 'on' ? TRUE : FALSE;
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
// Get the user's details from WebsitePanel - We need the UserId
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
throw new Exception("User {$username} does not exist - Cannot allocate addon for unknown user");
}
// Get the user's package details from WebsitePanel - We need the PackageId
$package = $wsp->getUserPackages($user['UserId']);
$packageId = $package['PackageId'];
// Get the associated WebsitePanel addon id
$results = select_query('mod_wspaddons', 'wsp_id,is_ipaddress', array('whmcs_id' => $addonId));
$addon = mysql_fetch_array($results);
$addonPlanId = $addon['wsp_id'];
$addonIsIpAddress = $addon['is_ipaddress'];
// Add the Addon Plan to the customer's WebsitePanel package / hosting space
$results = $wsp->addPackageAddonById($packageId, $addonPlanId);
// Check the results to verify that the addon has been successfully allocated
if ($results['Result'] > 0)
{
// If this addon is an IP address addon - attempt to randomly allocate an IP address to the customer's hosting space
if ($addonIsIpAddress)
{
$wsp->allocatePackageIPAddresses($packageId);
}
// Add log entry to client log
logactivity("WebsitePanel Addon - Account {$username} addon successfully completed - Addon ID: {$addonId}", $userId);
}
else
{
// Add log entry to client log
throw new Exception("Unknown", $results['Result']);
}
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "websitepanel_addons_AddonActivation Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
}
}
}
/* Addon Activation - WebsitePanel */
add_hook('AddonActivation', 1, 'websitepanel_addons_AddonActivation');

View file

@ -28,12 +28,16 @@
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/**
* WebsitePanel Addons Addon Module
* WebsitePanel Enterprise Server Client
* For the ASPnix WebsitePanel system only - Only tested against the ASPnix WebsitePanel system
*
* @author Christopher York
* @package WebsitePanel Addons Addon Module
* @version v1.0
* @link http://www.websitepanel.net/
* @access public
* @name websitepanel_EnterpriseServer
* @version 3.0.2
* @package WHMCS
* @final
*/
/**
@ -44,16 +48,10 @@
*/
function websitepanel_addons_config()
{
$configarray = array('name' => 'WebsitePanel Addons Automation',
'description' => 'Automates WHMCS product addons with WebsitePanel',
'version' => '1.2',
'author' => 'Christopher York',
'fields' => array('serverhost' => array('FriendlyName', 'Enterprise Server Host', 'Type' => 'text', 'Size' => 25, 'Description' => 'Enterprise Server hostname / IP address', 'Default' => '127.0.0.1'),
'serverport' => array('FriendlyName', 'Enterprise Server Port', 'Type' => 'text', 'Size' => 4, 'Description' => 'Enterprise Server port', 'Default' => 9002),
'serversecured' => array('FriendlyName', 'Use Secured Connection', 'Type' => 'yesno', 'Description' => 'Tick to use SSL secured connection'),
)
);
return $configarray;
return array('name' => 'WebsitePanel Addons Automation',
'description' => 'Automates WHMCS product addons with WebsitePanel Addons',
'version' => '3.0.1',
'author' => 'Christopher York');
}
/**
@ -65,10 +63,10 @@ function websitepanel_addons_config()
function websitepanel_addons_activate()
{
// Create the WebsitePanel Addons table
$query = "CREATE TABLE `mod_wspaddons` (
$query = "CREATE TABLE IF NOT EXISTS `mod_wspaddons` (
`whmcs_id` int(11) NOT NULL,
`wsp_id` int(11) NOT NULL,
`is_ipaddress` bit(1) NOT NULL DEFAULT 0,
`is_ipaddress` bit(1) NOT NULL DEFAULT b'0',
PRIMARY KEY (`whmcs_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
$result = full_query($query);
@ -115,7 +113,7 @@ function websitepanel_addons_deactivate()
*/
function websitepanel_addons_upgrade($vars)
{
// Module versions
$version = $vars['version'];
// Adjust the table name and remove the WebsitePanel credentials
@ -128,7 +126,7 @@ function websitepanel_addons_upgrade($vars)
}
/**
* websitepanel_addons_output
* Displays the WebsitePanel Addons module output
*
* @access public
* @return mixed

View file

@ -0,0 +1,136 @@
<?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 server module core files
require_once(ROOTDIR. '/modules/servers/websitepanel/enterpriseserver.php');
/**
* WebsitePanel WHMCS WebsitePanel / WHMCS Client Contact Details Sync
*
* @author Christopher York
* @link http://www.websitepanel.net/
* @access public
* @name websitepanel
* @version 3.0.2
* @package WHMCS
*/
/**
* Handles updating WebsitePanel account details when a client or administrator updates a client's details
*
* @access public
* @param array $params WHMCS parameters
* @throws Exception
*/
function websitepanel_sync_ClientEdit($params)
{
// WHMCS server parameters & package parameters
$userId = $params['userid'];
$serviceId = 0;
// Query for the users WebsitePanel accounts - If they do not have any, just ignore the request
$result = full_query("SELECT h.username AS username, s.ipaddress AS serverip, s.hostname AS serverhostname, s.secure AS serversecure, s.username AS serverusername, s.password AS serverpassword, p.configoption6 AS configoption6, h.id AS serviceid FROM `tblhosting` AS h, `tblservers` AS s, `tblproducts` AS p WHERE h.userid = {$userId} AND h.packageid = p.id AND h.server = s.id AND s.type = 'websitepanel' AND h.domainstatus IN ('Active', 'Suspended')");
while (($row = mysql_fetch_array($result)) != false)
{
// Start updating the users account details
$serviceId = $row['serviceid'];
$username = $row['username'];
$serverUsername = $row['serverusername'];
$serverPassword = decrypt($row['serverpassword']);
$serverPort = $row['configoption6'];
$serverHost = empty($row['serverhostname']) ? $row['serverip'] : $row['serverhostname'];
$serverSecure = $row['serversecure'] == 'on' ? TRUE : FALSE;
$clientsDetails = $params;
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
// Get the user's details from WebsitePanel - We need the username
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
throw new Exception("User {$username} does not exist - Cannot update account details for unknown user");
}
// Update the user's account details using the previous details + WHMCS's details (address, city, state etc.)
$userParams = array('RoleId' => $user['RoleId'],
'Role' => $user['Role'],
'StatusId' => $user['StatusId'],
'Status' => $user['Status'],
'LoginStatusId' => $user['LoginStatusId'],
'LoginStatus' => $user['LoginStatus'],
'FailedLogins' => $user['FailedLogins'],
'UserId' => $user['UserId'],
'OwnerId' => $user['OwnerId'],
'IsPeer' => $user['IsPeer'],
'Created' => $user['Created'],
'Changed' => $user['Changed'],
'IsDemo' => $user['IsDemo'],
'Comments' => $user['Comments'],
'LastName' => $clientsDetails['lastname'],
'Username' => $user['Username'],
'Password' => $user['Password'],
'FirstName' => $clientsDetails['firstname'],
'Email' => $clientsDetails['email'],
'PrimaryPhone' => $clientsDetails['phonenumber'],
'Zip' => $clientsDetails['postcode'],
'InstantMessenger' => '',
'Fax' => '',
'SecondaryPhone' => '',
'SecondaryEmail' => '',
'Country' => $clientsDetails['country'],
'Address' => $clientsDetails['address1'],
'City' => $clientsDetails['city'],
'State' => $clientsDetails['state'],
'HtmlMail' => $user['HtmlMail'],
'CompanyName' => $clientsDetails['companyname'],
'EcommerceEnabled' => $user['EcommerceEnabled'],
'SubscriberNumber' => '');
// Execute the UpdateUserDetails method
$wsp->updateUserDetails($userParams);
// Add log entry to client log
logactivity("WebsitePanel Sync - Account {$username} contact details updated successfully", $userId);
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "websitepanel_sync_ClientEdit Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
}
}
}
/* Update Client Contact Details - WebsitePanel */
add_hook('ClientEdit', 1, 'websitepanel_sync_ClientEdit');

View file

@ -28,44 +28,40 @@
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/**
* WebsitePanel Sync Addon Module
* WebsitePanel WHMCS WebsitePanel / WHMCS Client Contact Details Sync
*
* @author Christopher York
* @package WebsitePanel Sync Addon Module
* @version v1.0
* @link http://www.websitepanel.net/
* @access public
* @name websitepanel
* @version 3.0.2
* @package WHMCS
*/
/**
* websitepanel_sync_config
* Returns the WebsitePanel Sync configuration options
*
* @access public
* @return array
*/
function websitepanel_sync_config()
{
$configarray = array('name' => 'WebsitePanel Sync Automation',
'description' => 'Syncs WHMCS client details / contact changes with WebsitePanel',
'version' => '1.2',
'author' => 'Christopher York',
'fields' => array('serverhost' => array('FriendlyName', 'Enterprise Server Host', 'Type' => 'text', 'Size' => 25, 'Description' => 'Enterprise Server hostname / IP address', 'Default' => '127.0.0.1'),
'serverport' => array('FriendlyName', 'Enterprise Server Port', 'Type' => 'text', 'Size' => 4, 'Description' => 'Enterprise Server port', 'Default' => 9002),
'serversecured' => array('FriendlyName', 'Use Secured Connection', 'Type' => 'yesno', 'Description' => 'Tick to use SSL secured connection'),
)
);
return $configarray;
return array('name' => 'WebsitePanel Sync Automation',
'description' => 'Syncs WHMCS client details / contact changes with WebsitePanel accounts',
'version' => '3.0.1',
'author' => 'Christopher York');
}
/**
* websitepanel_addons_upgrade
* Returns the WebsitePanel Sync configuration options
*
* @param $vars array
* @param $vars array WHMCS parameters
* @access public
* @return array
*/
function websitepanel_sync_upgrade($vars)
{
// Module version
$version = $vars['version'];
// Remove the WebsitePanel credentials

View file

@ -0,0 +1,2 @@
<br />
<form action="{$websitepanel_url}/default.aspx?pid=Login" method="POST" target="_blank"><input type="hidden" value="{$username}" name="user"><input type="hidden" value="{$password}" name="password"><input type="submit" value="{$LANG.websitepanel_clientarea_oneclicklogin}"></form>

View file

@ -0,0 +1,502 @@
<?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.2
* @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);
}
}

View file

@ -0,0 +1,146 @@
<?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 WHMCS Server Module Shared Funcitons
*
* @author Christopher York
* @link http://www.websitepanel.net/
* @access public
* @name websitepanel
* @version 3.0.2
* @package WHMCS
*/
/**
* Calculate the bandwidth calculation starting date based on when the customer signed up
*
* @access public
* @param string $startDate Customer registration date (starting date)
* @return string
*/
function websitepanel_CreateBandwidthDate($startDate)
{
$dateExploded = explode('-', $startDate);
$currentYear = date('Y');
$currentMonth = date('m');
$newDate = "{$currentYear}-{$currentMonth}-{$dateExploded[2]}";
$dateDiff = time() - strtotime('+1 hour', strtotime($newDate));
$fullDays = floor($dateDiff / (60 * 60 * 24));
if ($fullDays < 0)
{
return date('Y-m-d', strtotime('-1 month', strtotime($newDate)));
}
else
{
return $newDate;
}
}
/**
* Calculates the total usage of the provided WebsitePanel usage tables
* Each websitepanel provider / service calculates its own disk and bandwidth usage, total all provided tables and return
*
* @access public
* @param array $usageTables Usage tables (each service provides its own usage breakdown)
* @param int $usageType WebsitePanel usage type (websitepanel_EnterpriseServer::USAGE_*)
* @return int
*/
function websitepanel_CalculateUsage($usageTables, $usageType)
{
$totalUsage = 0;
foreach ($usageTables['NewDataSet']['Table'] as $table)
{
switch ($usageType)
{
case websitepanel_EnterpriseServer::USAGE_BANDWIDTH:
$totalUsage += $table['MegaBytesTotal'];
break;
case websitepanel_EnterpriseServer::USAGE_DISKSPACE:
$totalUsage += $table['Diskspace'];
break;
}
}
return $totalUsage;
}
/**
* Loads the WebsitePanel language file
*
* @access public
*/
function websitepanel_LoadClientLanguage()
{
global $CONFIG, $_LANG, $smarty;
// Attempt to load the client's language
$selectedLanguage = !empty($_SESSION['Language']) ? $_SESSION['Language'] : $CONFIG['Language'];
// For the admin area
if (defined('ADMINAREA'))
{
$result = select_query('tbladmins', 'language', array('id' => (int)$_SESSION['adminid']));
$results = mysql_fetch_assoc($result);
$selectedLanguage = !empty($results['language']) ? $results['language'] : 'english';
}
// Load the language file
$languageFile = dirname(__FILE__) . "/lang/{$selectedLanguage}.php";
if (file_exists($languageFile))
{
require_once($languageFile);
}
else
{
// Load the default (English) language file
require_once(dirname(__FILE__) . '/lang/english.php');
}
// Process the module language entries
if (is_array($_MOD_LANG))
{
foreach ($_MOD_LANG as $key => $value)
{
if (empty($_LANG[$key]))
{
$_LANG[$key] = $value;
}
}
}
// Add to the template
if (isset($smarty))
{
$smarty->assign('LANG', $_LANG);
}
return $_MOD_LANG;
}

View file

@ -27,34 +27,16 @@
// (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 Server Module - WebsitePanel Business Error Codes
*
* @author Christopher York
* @package WebsitePanel Server Module - WebsitePanel Business Error Codes
* @version v1.0
* @link http://www.websitepanel.net/
*/
/**
* Common error codes encountered while using the WebsitePanel Server Module
* These are not all the Enterprise Server error codes, only the ones I have encountered using the API
* WebsitePanel WHMCS Server Module Client Area Language
*
* @author Christopher York
* @link http://www.websitepanel.net/
* @access public
* @return array
* @name websitepanel
* @version 3.0.0
* @package WHMCS
*/
function websitepanel_GetEnterpriseServerErrors()
{
$esErrorCodes = array(-100 => 'User already exists',
-101 => 'User not found',
-102 => 'User has child user 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 within another hosting space',
-511 => 'Instant alias is enabled, but not configured',
-601 => 'The website already exists on the target hosting space',
-700 => 'The email domain already exists on the target hosting space',
-1100 => 'User already exists');
return $esErrorCodes;
}
$_MOD_LANG['websitepanel_clientarea_oneclicklogin'] = 'Login to Control Panel (One-Click Login)';
$_MOD_LANG['websitepanel_adminarea_gotowebsitepanelaccount'] = 'View Account in WebsitePanel';

View file

@ -1,438 +0,0 @@
<?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 Server Module - Enterprise Server Wrapper
*
* @author Christopher York
* @package WebsitePanel Server Module - WebsitePanel Enterprise Server Wrapper
* @version v1.0
* @link http://www.websitepanel.net/
*/
class WebsitePanel
{
/**
* WebsitePanel Enteprise Server service file names
*
* @access private
* @var string
*/
const SERVICEFILE_PACKAGES = 'esPackages.asmx';
const SERVICEFILE_USERS = 'esUsers.asmx';
const SERVICEFILE_SERVERS = 'esServers.asmx';
/**
* WebsitePanel account states
*
* @access public
* @var string
*/
const USERSTATUS_ACTIVE = 'Active';
const USERSTATUS_SUSPENDED = 'Suspended';
const USERSTATUS_CANCELLED = 'Cancelled';
const USERSTATUS_PENDING = 'Pending';
/**
* WebsitePanel usage calculation
*
* @access public
* @var int
*/
const USAGE_DISKSPACE = 0;
const USAGE_BANDWIDTH = 1;
/**
* WebsitePanel IP address pools
*
* @access public
* @var string
*/
const IPADDRESS_POOL_WEB = 'Web';
/**
* WebsitePanel IP address groups
*
* @access public
* @var string
*/
const IPADDRESS_GROUP_WEBSITES = 'WebSites';
/**
* Enterprise Server username
*
* @access private
* @var string
*/
private $_esUsername = 'serveradmin';
/**
* Enterprise Server password
*
* @access private
* @var string
*/
private $_esPassword;
/**
* Enterprise Server URL / address (without the port)
*
* @access private
* @var string
*/
private $_esServerUrl;
/**
* Enterprise Server TCP port
*
* @access private
* @var int
*/
private $_esServerPort = 9002;
/**
* Use SSL (HTTPS) for Enterprise Server communications
*
* @access private
* @var boolean
*/
private $_esUseSsl = false;
/**
* WebsitePanel class constructor
*
* @access public
* @param string $esUsername Enterprise Server username
* @param string $esPassword Enterprise Server password
* @param string $esServerUrl Enterprise Server URL / address (without the port)
* @param int $esServerPort Enterprise Server TCP port
* @param boolean $useSsl Use SSL (HTTPS) for Enterprise Server communications
*/
public function __construct($esUsername, $esPassword, $esServerUrl, $esServerPort = 9002, $useSsl = FALSE)
{
$this->_esUsername = $esUsername;
$this->_esPassword = $esPassword;
$this->_esServerUrl = $esServerUrl;
$this->_esServerPort = $esServerPort;
$this->_esUseSsl = $useSsl;
}
/**
* WebsitePanel::CreateAccount()
*
* @param string $username Account username
* @param string $password Account password
* @param string $roleId Account role id
* @param string $firstName Account holders firstname
* @param string $lastName Account holders lastname
* @param string $email Account holders email address
* @param string $planId WebsitePanel plan id
* @param integer $parentPackageId Parent space / package id
* @param string $domainName Account domain name
* @param string $hostName Website hostname (if createWebsite is TRUE)
* @param bool $htmlMail Send HTML email
* @param bool $sendAccountLetter Send WebsitePanel "Account Summary" letter
* @param bool $sendPackageLetter Send WebsitePanel "Hosting Space Summary" letter
* @param bool $createPackage Create hostingspace / package on user creation
* @param bool $tempDomain Create temporary domain on hostingspace / package creation
* @param bool $createWebSite Create Website on hostingspace / package creation
* @param bool $createFtpAccount Create FTP account on hostingspace / package creation
* @param string $ftpAcountName FTP account name to create (if createFtpAccount is TRUE)
* @param bool $createMailAccount Create default mail account on hostingspace / package creation
* @param bool $createZoneRecord Create domain DNS zone record (if createMailAccount OR createWebSite are TRUE)
* @return int
*/
public function createUserWizard($username, $password, $roleId, $firstName, $lastName, $email, $planId, $parentPackageId, $domainName, $hostName, $htmlMail = TRUE, $sendAccountLetter = TRUE, $sendPackageLetter = TRUE, $createPackage = TRUE, $tempDomain = FALSE, $createWebSite = FALSE, $createFtpAccount = FALSE, $ftpAcountName = '', $createMailAccount = FALSE, $createZoneRecord = FALSE)
{
$params = array();
foreach (get_defined_vars() as $key => $value)
{
if ($key == 'params')
continue;
$params[$key] = $value;
}
return $this->executeServerMethod(WebsitePanel::SERVICEFILE_PACKAGES, 'CreateUserWizard', $params)->CreateUserWizardResult;
}
/**
* WebsitePanel::UpdateUserDetails()
*
* @access public
* @param int $RoleId Account role id
* @param string $Role Account role
* @param int $StatusId Account status id
* @param string $Status Account status
* @param int $UserId Account user id
* @param int $OwnerId Account owner id
* @param string $Created Account creation date
* @param string $Changed Account changed date
* @param bool $IsDemo Demo account
* @param bool $IsPeer Peer account
* @param string $Comments Account comments
* @param string $Username Account username
* @param string $Password Account password
* @param string $FirstName Account holders firstname
* @param string $LastName Account holders lastname
* @param string $Email Account holders email address
* @param string $PrimaryPhone Account holders phone number
* @param string $Zip Account holders postal code
* @param string $InstantMessenger Account holders IM
* @param string $Fax Account holders fax number
* @param string $SecondaryPhone Account holders secondary phone number
* @param string $SecondaryEmail Account holders secondary email
* @param string $Country Account holders country
* @param string $Address Account holders physical address
* @param string $City Account holders city
* @param string $State Account holders state
* @param bool $HtmlMail Send HTML email
* @param string $CompanyName Account holders Company name
* @param bool $EcommerceEnabled Ecommerce enabled
* @return void
*/
public function updateUserDetails($RoleId, $Role, $StatusId, $Status, $LoginStatusId, $LoginStatus, $FailedLogins, $UserId, $OwnerId, $Created, $Changed, $IsDemo, $IsPeer, $Comments, $Username, $Password, $FirstName, $LastName, $Email, $PrimaryPhone, $Zip, $InstantMessenger, $Fax, $SecondaryPhone, $SecondaryEmail, $Country, $Address, $City, $State, $HtmlMail, $CompanyName, $EcommerceEnabled)
{
$params = array();
foreach (get_defined_vars() as $key => $value)
{
if ($key == 'params')
continue;
$params[$key] = $value;
}
return $this->executeServerMethod(WebsitePanel::SERVICEFILE_USERS, 'UpdateUser', array('user' => $params))->UpdateUserResult;
}
/**
* WebsitePanel::DeleteUser()
*
* @access public
* @param int $userid User id
* @return int
*/
public function deleteUser($userId)
{
return $this->executeServerMethod(WebsitePanel::SERVICEFILE_USERS, 'DeleteUser', array('userId' => $userId))->DeleteUserResult;
}
/**
* WebsitePanel::GetUserByUsername()
*
* @access public
* @param string $username Username
* @return array
*/
public function getUserByUsername($username)
{
return (array)$this->executeServerMethod(WebsitePanel::SERVICEFILE_USERS, 'GetUserByUsername', array('username' => $username))->GetUserByUsernameResult;
}
/**
* WebsitePanel::ChangeUserStatus()
*
* @param int $userId User id
* @param string $status Account status (Active, Suspended, Cancelled, Pending)
* @return int
*/
public function changeUserStatus($userId, $status)
{
return $this->executeServerMethod(WebsitePanel::SERVICEFILE_USERS, 'ChangeUserStatus', array('userId' => $userId, 'status' => $status))->ChangeUserStatusResult;
}
/**
* WebsitePanel::ChangeUserPassword()
*
* @access public
* @param int $userId User id
* @param string $password New password
* @return int
*/
public function changeUserPassword($userId, $password)
{
return $this->executeServerMethod(WebsitePanel::SERVICEFILE_USERS, 'ChangeUserPassword', array('userId' => $userId, 'password' => $password))->ChangeUserPasswordResult;
}
/**
* WebsitePanel::GetUserPackages()
*
* @access public
* @param int $userid User id
* @return array
*/
public function getUserPackages($userid)
{
return (array)$this->executeServerMethod(WebsitePanel::SERVICEFILE_PACKAGES, 'GetMyPackages', array('userId' => $userid))->GetMyPackagesResult->PackageInfo;
}
/**
* WebsitePanel::getUsersPagedRecursive()
*
* @param int $userId User id
* @param string $filterColumn Column name to filter on
* @param string $filterValue Filter value
* @param int $statusId Status id
* @param int $roleId Role id
* @param string $sortColumn Column name to sort on
* @param int $startRow Row to start at
* @param int $maximumRows Maximum rows to return
*/
public function getUsersPagedRecursive($userId, $filterColumn, $filterValue, $statusId, $roleId, $sortColumn, $startRow = 0, $maximumRows = 999)
{
$params = array();
foreach (get_defined_vars() as $key => $value)
{
if ($key == 'params')
continue;
$params[$key] = $value;
}
return $this->executeServerMethod(WebSitePanel::SERVICEFILE_USERS, 'GetUsersPagedRecursive', $params)->GetUsersPagedRecursiveResult;
}
/**
* WebsitePanel::UpdatePackageLiteral()
*
* @access public
* @param int $packageId Package id
* @param int $statusId Status id
* @param int $planId Plan id
* @param string $purchaseDate Purchase date
* @param string $packageName Package name
* @param string $packageComments Package comments
* @return array
*/
public function updatePackageLiteral($packageId, $statusId, $planId, $purchaseDate, $packageName, $packageComments)
{
$params = array();
foreach (get_defined_vars() as $key => $value)
{
if ($key == 'params')
continue;
$params[$key] = $value;
}
return (array)$this->executeServerMethod(WebsitePanel::SERVICEFILE_PACKAGES, 'UpdatePackageLiteral', $params)->UpdatePackageLiteralResult;
}
/**
* WebsitePanel::addPackageAddonById()
*
* @access public
* @param mixed $packageId Package id
* @param mixed $addonPlanId Addon plan od
* @param integer $quantity Quantity
* @return array
*/
public function addPackageAddonById($packageId, $addonPlanId, $quantity = 1)
{
return (array)$this->executeServerMethod(WebsitePanel::SERVICEFILE_PACKAGES, 'AddPackageAddonById', array('packageId' => $packageId, 'addonPlanId' => $addonPlanId, 'quantity' => $quantity))->AddPackageAddonByIdResult;
}
/**
* WebsitePanel::GetSpaceBandwidthUsage()
*
* @access public
* @param int $packageId Package id
* @param string $startDate Start date
* @param string $endDate Ending date
* @return object
*/
public function getSpaceBandwidthUsage($packageId, $startDate, $endDate)
{
return $this->executeServerMethod(WebsitePanel::SERVICEFILE_PACKAGES, 'GetPackageBandwidth', array('packageId' => $packageId, 'startDate' => $startDate, 'endDate' => $endDate))->GetPackageBandwidthResult;
}
/**
* WebsitePanel::GetSpaceDiskspaceUsage()
*
* @access private
* @param int $packageId Package Id
* @return object
*/
public function getSpaceDiskspaceUsage($packageId)
{
return $this->executeServerMethod(WebsitePanel::SERVICEFILE_PACKAGES, 'GetPackageDiskspace', array('packageId' => $packageId))->GetPackageDiskspaceResult;
}
/**
* WebsitePanel::packageAllocateIpAddress()
*
* @param mixed $packageId Package id
* @param mixed $groupName Group name
* @param mixed $pool Address pool
* @param integer $addressesNumber Number of IP addresses
* @param bool $allocateRandom Allocate IP addresses randomly
* @return object
*/
public function packageAllocateIpAddress($packageId, $groupName = WebsitePanel::IPADDRESS_POOL_WEB, $pool = WebsitePanel::IPADDRESS_GROUP_WEBSITES, $addressesNumber = 1, $allocateRandom = TRUE)
{
$params = array();
foreach (get_defined_vars() as $key => $value)
{
if ($key == 'params')
continue;
$params[$key] = $value;
}
return $this->executeServerMethod(WebsitePanel::SERVICEFILE_SERVERS, 'AllocatePackageIPAddresses', $params)->AllocatePackageIPAddressesResult;
}
/**
* Executes the requested Enterprise Server method / parameters and returns the results
*
* @access private
* @param string $serviceFile Enterprise Server service filename
* @param string $serviceMethod Enterprise Server service method name
* @param array $methodParameters Method parameters
* @throws Exception
* @return object
*/
private function executeServerMethod($serviceFile, $serviceMethod, $methodParameters = array())
{
$esUrl = (($this->_esUseSsl ? "https" : "http") . "://{$this->_esServerUrl}:{$this->_esServerPort}/{$serviceFile}?WSDL");
$soapParams = array('login' => $this->_esUsername,
'password' => $this->_esPassword,
'cache_wsdl' => WSDL_CACHE_NONE // WSDL caching is an annoying nightmare - we will disable it
);
try
{
$client = new SoapClient($esUrl, $soapParams);
$result = $client->$serviceMethod($methodParameters);
if (is_soap_fault($result))
{
throw new Exception($result->faultstring);
}
return $result;
}
catch (Exception $e)
{
throw new Exception($e->getMessage());
}
}
}

View file

@ -1,197 +0,0 @@
<?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 Server Module - websitepanel Helper Functions
*
* @author Christopher York
* @package websitepanel Server Module - websitepanel Helper Functions
* @version v1.0
* @link http://www.websitepanel.net/
*/
/**
* websitepanel_GetErrorMessage()
*
* @access public
* @param int $code
* @return mixed
*/
function websitepanel_GetErrorMessage($code)
{
// Error codes
$esErrorCodes = array();
// Include the common / known error codes
require_once(ROOTDIR . '/modules/servers/websitepanel/websitepanel.errorcodes.php');
$esErrorCodes = websitepanel_GetEnterpriseServerErrors();
// Check if the error code exists, if not return the code
if (array_key_exists($code, $esErrorCodes))
{
return $esErrorCodes[$code];
}
else
{
return $code;
}
}
/**
* websitepanel_CreateBandwidthDate()
*
* @access public
* @param mixed $date
* @return date
*/
function websitepanel_CreateBandwidthDate($date)
{
$dateExploded = explode('-', $date);
$currentYear = date('Y');
$currentMonth = date('m');
$newDate = "{$currentYear}-{$currentMonth}-{$dateExploded[2]}";
$dateDiff = time() - strtotime('+1 hour', strtotime($newDate));
$fullDays = floor($dateDiff / (60 * 60 * 24));
if ($fullDays < 0)
{
return date('Y-m-d', strtotime('-1 month', strtotime($newDate)));
}
else
{
return $newDate;
}
}
/**
* websitepanel_CalculateBandwidthUsage()
*
* @access public
* @param mixed $params
* @param mixed $packageId
* @param mixed $startDate
* @return int
*/
function websitepanel_CalculateBandwidthUsage($params, $packageId, $startDate)
{
// Create the ASPnix websitepanel_EnterpriseServer class object
$wsp = new WebsitePanel($params['serverusername'], $params['serverpassword'], $params['serverip'], $params['configoption6'], $params['serversecure']);
try
{
$result = $wsp->getSpaceBandwidthUsage($packageId, $startDate, date('Y-m-d', time()));
return websitepanel_CalculateUsage($result, WebsitePanel::USAGE_BANDWIDTH);
}
catch (Exception $e)
{
// Do nothing, just catch the Exception to keep PHP from exploding :)
}
}
/**
* websitepanel_CalculateDiskspaceUsage()
*
* @access public
* @param mixed $params
* @param mixed $packageId
* @return int
*/
function websitepanel_CalculateDiskspaceUsage($params, $packageId)
{
// Create the ASPnix websitepanel_EnterpriseServer class object
$wsp = new WebsitePanel($params['serverusername'], $params['serverpassword'], $params['serverip'], $params['configoption6'], $params['serversecure']);
try
{
$result = $wsp->getSpaceDiskspaceUsage($packageId);
return websitepanel_CalculateUsage($result, WebsitePanel::USAGE_DISKSPACE);
}
catch (Exception $e)
{
// Do nothing, just catch the Exception to keep PHP from exploding :)
}
}
/**
* websitepanel_CalculateUsage()
*
* @access public
* @param mixed $result
* @param int $usageType
* @return int
*/
function websitepanel_CalculateUsage($result, $usageType)
{
// Process results
$xml = simplexml_load_string($result->any);
$total = 0;
if (count($xml->NewDataSet->Table) > 0)
{
foreach ($xml->NewDataSet->Table as $table)
{
switch ($usageType)
{
case WebsitePanel::USAGE_BANDWIDTH:
$total = $total + $table[0]->MegaBytesTotal;
break;
case WebsitePanel::USAGE_DISKSPACE:
$total = $total + $table[0]->Diskspace;
break;
default:
$total = $total + $table[0]->MegaBytesTotal;
break;
}
}
}
return $total;
}
/**
* websitepanel_GetServerSettings
*
* @access public
* @return array
*/
function websitepanel_GetServerSettings()
{
$settings = array('username' => '', 'password' => '');
// Retrieve the settings from the modules configuration table
$results = select_query('tblservers', 'username,password', array('type' => 'websitepanel'));
if (mysql_num_rows($results) != 0)
{
$row = mysql_fetch_array($results, MYSQL_ASSOC);
$settings['username'] = $row['username'];
$settings['password'] = decrypt($row['password']);
}
return $settings;
}

View file

@ -27,439 +27,608 @@
// (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 server module core files
require_once(ROOTDIR. '/modules/servers/websitepanel/enterpriseserver.php');
require_once(ROOTDIR. '/modules/servers/websitepanel/functions.php');
/**
* WHMCS WebsitePanel Server Module
*
* Tested with WHMCS v5.1.3 - however this should work for all v5 releases.
* DO NOT contact WHMCS for support with this module, they will not provide
* you any support for this. This should replace the default WHMCS WebsitePanel
* server module, however I HIGHLY RECOMMEND that you backup the stock WebsitePanel
* server module.
*
* THIS IS PROVIDED AS IS AND WITHOUT WARRANTY! I TAKE NO RESPOSIBILITY FOR
* ERRORS, MISUSE, EXCEPTIONS, LOSS OF DATA, LOSS OF LIFE, PLANETS NOT ALIGNING
* PROPERLY, ALIEN ABDUCTIONS AND ANYTHING ELSE THAT CAN OR MAY HAPPEN FROM
* USING THIS! BY INSTALLING AND USING THIS YOU AGREE TO TAKE FULL RESPOSNBILITY
* FOR ANY AND ALL THINGS!
* WebsitePanel WHMCS Server Module
*
* @author Christopher York
* @package WHMCS Server Module
* @version v1.0
* @link http://www.websitepanel.net/
* @access public
* @name websitepanel
* @version 3.0.2
* @package WHMCS
*/
/****************************************************************************/
// WebsitePanel WHMCS Server Module Configuration / Commands
/****************************************************************************/
require_once(ROOTDIR . '/modules/servers/websitepanel/websitepanel.class.php');
require_once(ROOTDIR . '/modules/servers/websitepanel/websitepanel.functions.php');
/**
* websitepanel_ConfigOptions()
* Returns the WebsitePanel package / server configuration options
*
* @access public
* @return array
*/
function websitepanel_ConfigOptions()
{
$configarray = array('Package Name' => array( 'Type' => 'text', 'Size' => 25, 'Description' => 'Package Name'),
'Web Space Quota' => array( 'Type' => 'text', 'Size' => 5, 'Description' => 'MB'),
'Bandwidth Limit' => array( 'Type' => 'text', 'Size' => 5, 'Description' => 'MB'),
'Plan ID' => array( 'Type' => 'text', 'Size' => 4, 'Description' => 'WebsitePanel hosting plan id'),
'Parent Space ID' => array( 'Type' => 'text', 'Size' => 3, 'Description' => '* SpaceID that all accounts are created under', 'Default' => 1),
'Enterprise Server Port' => array( 'Type' => 'text', 'Size' => 5, 'Description' => '* Required', 'Default' => 9002),
'Different Potal URL' => array( 'Type' => 'yesno', 'Description' => 'Tick if portal address is different to server address'),
'Portal URL' => array( 'Type' => 'text', 'Size' => 25, 'Description' => 'Portal URL, with http://, no trailing slash' ),
'Send Account Summary Email' => array( 'Type' => 'yesno', 'Description' => 'Tick to send the "Account Summary" letter' ),
'Send Hosting Space Summary Email' => array( 'Type' => 'yesno', 'Description' => 'Tick to send the "Hosting Space Summary" letter'),
'Create Mail Account' => array( 'Type' => 'yesno', 'Description' => 'Tick to create mail account' ),
'Create FTP Account' => array( 'Type' => 'yesno', 'Description' => 'Tick to create FTP account' ),
'Create Temporary Domain' => array( 'Type' => 'yesno', 'Description' => 'Tick to create a temporary domain' ),
'Send HTML Email' => array( 'Type' => 'yesno', 'Description' => 'Tick enable HTML email from WebsitePanel' ),
'Create Website' => array( 'Type' => 'yesno', 'Description' => 'Tick to create Website' ),
'Count Bandwidth / Diskspace' => array( 'Type' => 'yesno', 'Description' => 'Tick to update diskpace / bandwidth in WHMCS'),
'Default Pointer' => array( 'Type' => 'text', 'Size' => 25, 'Description' => 'The default pointer (hostname) to use when creating a Website' ),
'Create DNS Zone' => array( 'Type' => 'yesno', 'Description' => 'Tick to create domain DNS zone' )
);
return $configarray;
return array('Package Name' => array( 'Type' => 'text', 'Size' => 25, 'Description' => 'Package Name'),
'Web Space Quota' => array( 'Type' => 'text', 'Size' => 5, 'Description' => 'MB'),
'Bandwidth Limit' => array( 'Type' => 'text', 'Size' => 5, 'Description' => 'MB'),
'WebsitePanel Plan ID' => array( 'Type' => 'text', 'Size' => 4, 'Description' => 'WebsitePanel hosting plan id'),
'Parent Space ID' => array( 'Type' => 'text', 'Size' => 3, 'Description' => '* SpaceID that all accounts are created under', 'Default' => 1),
'Enterprise Server Port' => array( 'Type' => 'text', 'Size' => 5, 'Description' => '* Required', 'Default' => 9002),
'Different Potal URL' => array( 'Type' => 'yesno', 'Description' => 'Tick if portal address is different to server address'),
'Portal URL' => array( 'Type' => 'text', 'Size' => 25, 'Description' => 'Portal URL, with http(s)://, no trailing slash' ),
'Send Account Summary Email' => array( 'Type' => 'yesno', 'Description' => 'Tick to send the "Account Summary" letter' ),
'Send Hosting Space Summary Email' => array( 'Type' => 'yesno', 'Description' => 'Tick to send the "Hosting Space Summary" letter'),
'Create Mail Account' => array( 'Type' => 'yesno', 'Description' => 'Tick to create mail account' ),
'Create FTP Account' => array( 'Type' => 'yesno', 'Description' => 'Tick to create FTP account' ),
'Create Temporary Domain' => array( 'Type' => 'yesno', 'Description' => 'Tick to create a temporary domain' ),
'Send HTML Email' => array( 'Type' => 'yesno', 'Description' => 'Tick enable HTML email from WebsitePanel' ),
'Create Website' => array( 'Type' => 'yesno', 'Description' => 'Tick to create Website' ),
'Count Bandwidth / Diskspace' => array( 'Type' => 'yesno', 'Description' => 'Tick to update diskpace / bandwidth in WHMCS'),
'Default Pointer' => array( 'Type' => 'text', 'Size' => 25, 'Description' => 'The default pointer (hostname) to use when creating a Website' ),
'Create DNS Zone' => array( 'Type' => 'yesno', 'Description' => 'Tick to create domain DNS zone'));
}
/**
* websitepanel_CreateAccount()
* Creates the WebsitePanel user account and package
*
* @access public
* @param array $params
* @param array $params WHMCS parameters
* @throws Exception
* @return string
*/
function websitepanel_CreateAccount($params)
{
// Create the WebsitePanel object instance
$wsp = new WebsitePanel($params['serverusername'], $params['serverpassword'], $params['serverip'], $params['configoption6'], $params['serversecure']);
// WHMCS server parameters & package parameters
$serverUsername = $params['serverusername'];
$serverPassword = $params['serverpassword'];
$serverPort = $params['configoption6'];
$serverHost = empty($params['serverhostname']) ? $params['serverip'] : $params['serverhostname'];
$serverSecure = $params['serversecure'];
$username = $params['username'];
$password = $params['password'];
$domain = $params['domain'];
$packageType = $params['type'];
$clientsDetails = $params['clientsdetails'];
$userId = $clientsDetails['userid'];
$serviceId = $params['serviceid'];
// WHMCS server parameters & package parameters
$username = $params['username'];
$password = $params['password'];
$accountId = $params['accountid'];
$packageId = $params['packageid'];
$domain = $params['domain'];
$packageType = $params['type'];
$clientsDetails = $params['clientsdetails'];
// WebsitePanel API parameters
$planId = $params['configoption4'];
$parentPackageId = $params['configoption5'];
$roleId = ($packageType == 'reselleraccount') ? 2 : 3;
$htmlMail = ($params['configoption14'] == 'on') ? TRUE : FALSE;
$sendAccountLetter = ($params['configoption9'] == 'on') ? TRUE : FALSE;
$sendPackageLetter = ($params['configoption10'] == 'on') ? TRUE : FALSE;
$createMailAccount = ($params['configoption11'] == 'on') ? TRUE : FALSE;
$createTempDomain = ($params['configoption13'] == 'on') ? TRUE : FALSE;
$createFtpAccount = ($params['configoption12'] == 'on') ? TRUE : FALSE;
$createWebsite = ($params['configoption15'] == 'on') ? TRUE : FALSE;
$websitePointerName = $params['configoption17'];
$createZoneRecord = ($params['configoption18'] == 'on') ? TRUE : FALSE;
// WebsitePanel API parameters
$planId = $params['configoption4'];
$parentPackageId = $params['configoption5'];
$roleId = ($packageType == 'reselleraccount') ? 2 : 3;
$htmlMail = ($params['configoption14'] == 'on') ? TRUE : FALSE;
$sendAccountLetter = ($params['configoption9'] == 'on') ? TRUE : FALSE;
$sendPackageLetter = ($params['configoption10'] == 'on') ? TRUE : FALSE;
$createMailAccount = ($params['configoption11'] == 'on') ? TRUE : FALSE;
$createTempDomain = ($params['configoption13'] == 'on') ? TRUE : FALSE;
$createFtpAccount = ($params['configoption12'] == 'on') ? TRUE : FALSE;
$createWebsite = ($params['configoption15'] == 'on') ? TRUE : FALSE;
$websitePointerName = $params['configoption17'];
$createZoneRecord = ($params['configoption18'] == 'on') ? TRUE : FALSE;
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
try
{
// Attempt to create the WSP user account and his / her package / hosting space
$result = $wsp->createUserWizard($username, $password, $roleId, $clientsDetails['firstname'], $clientsDetails['lastname'], $clientsDetails['email'], $planId, $parentPackageId, $domain, $websitePointerName, $htmlMail, $sendAccountLetter, $sendPackageLetter, TRUE, $createTempDomain, $createWebsite, $createFtpAccount, $username, $createMailAccount, $createZoneRecord);
if ($result >= 0)
{
// Grab the user's details from WebsitePanel
$user = $wsp->getUserByUsername($username);
// Create the user's new account using the CreateUserWizard method
$userParams = array('parentPackageId' => $parentPackageId,
'username' => $username,
'password' => $password,
'roleId' => $roleId,
'firstName' => $clientsDetails['firstname'],
'lastname' => $clientsDetails['lastname'],
'email' => $clientsDetails['email'],
'secondaryEmail' => '',
'htmlMail' => $htmlMail,
'sendAccountLetter' => $sendAccountLetter,
'createPackage' => TRUE,
'planId' => $planId,
'sendPackageLetter' => $sendPackageLetter,
'domainName' => $domain,
'tempDomain' => $createTempDomain,
'createWebSite' => $createWebsite,
'createFtpAccount' => $createFtpAccount,
'ftpAccountName' => $username,
'createMailAccount' => $createMailAccount,
'hostName' => $websitePointerName,
'createZoneRecord' => $createZoneRecord);
// Update the user's account with his / her WHMCS contact details
$wsp->updateUserDetails($user['RoleId'], $user['Role'], $user['StatusId'], $user['Status'], $user['LoginStatusId'], $user['LoginStatus'], $user['FailedLogins'], $user['UserId'], $user['OwnerId'], $user['Created'], $user['Changed'], $user['IsDemo'], $user['IsPeer'], $user['Comments'], $username, $password, $clientsDetails['firstname'], $clientsDetails['lastname'], $clientsDetails['email'], $clientsDetails['phonenumber'], $clientsDetails['postcode'], '', '', '', '', $clientsDetails['country'], $clientsDetails['address1'], $clientsDetails['city'], $clientsDetails['state'], $htmlMail, $clientsDetails['companyname'], (($roleId == 2) ? TRUE : FALSE));
// Execute the CreateUserWizard method
$result = $wsp->createUserWizard($userParams);
if ($result < 0)
{
// Something went wrong
throw new Exception('Fault: ' . websitepanel_EnterpriseServer::getFriendlyError($result), $result);
}
// Success - Alert WHMCS
return 'success';
}
else
{
// Failed - Alert WHMCS of the returned Enterprise Server error code
return websitepanel_GetErrorMessage($result);
}
}
catch (Exception $e)
{
return $e->getMessage();
}
// Get the newly created user's details from WebsitePanel so we can update the account details completely
$user = $wsp->getUserByUsername($username);
// Update the user's account details using the previous details + WHMCS's details (address, city, state etc.)
$userParams = array('RoleId' => $roleId,
'Role' => $user['Role'],
'StatusId' => $user['StatusId'],
'Status' => $user['Status'],
'LoginStatusId' => $user['LoginStatusId'],
'LoginStatus' => $user['LoginStatus'],
'FailedLogins' => $user['FailedLogins'],
'UserId' => $user['UserId'],
'OwnerId' => $user['OwnerId'],
'IsPeer' => $user['IsPeer'],
'Created' => $user['Created'],
'Changed' => $user['Changed'],
'IsDemo' => $user['IsDemo'],
'Comments' => $user['Comments'],
'LastName' => $clientsDetails['lastname'],
'Username' => $username,
'Password' => $password,
'FirstName' => $clientsDetails['firstname'],
'Email' => $clientsDetails['email'],
'PrimaryPhone' => $clientsDetails['phonenumber'],
'Zip' => $clientsDetails['postcode'],
'InstantMessenger' => '',
'Fax' => '',
'SecondaryPhone' => '',
'SecondaryEmail' => '',
'Country' => $clientsDetails['country'],
'Address' => $clientsDetails['address1'],
'City' => $clientsDetails['city'],
'State' => $clientsDetails['state'],
'HtmlMail' => $htmlMail,
'CompanyName' => $clientsDetails['companyname'],
'EcommerceEnabled' => (($roleId == 2) ? TRUE : FALSE),
'SubscriberNumber' => '');
// Execute the UpdateUserDetails method
$wsp->updateUserDetails($userParams);
// Notify success
return 'success';
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "CreateAccount Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
// Notify failure - Houston we have a problem!
return $errorMessage;
}
}
/**
* websitepanel_TerminateAccount()
* Terminates the WebsitePanel user account and package
*
* @access public
* @param array $params
* @param array $params WHMCS parameters
* @throws Exception
* @return string
*/
function websitepanel_TerminateAccount($params)
{
// Create the WebsitePanel object instance
$wsp = new WebsitePanel($params['serverusername'], $params['serverpassword'], $params['serverip'], $params['configoption6'], $params['serversecure']);
// WHMCS server parameters & package parameters
$serverUsername = $params['serverusername'];
$serverPassword = $params['serverpassword'];
$serverPort = $params['configoption6'];
$serverHost = empty($params['serverhostname']) ? $params['serverip'] : $params['serverhostname'];
$serverSecure = $params['serversecure'];
$username = $params['username'];
$clientsDetails = $params['clientsdetails'];
$userId = $clientsDetails['userid'];
$serviceId = $params['serviceid'];
// WHMCS server parameters & package parameters
$username = $params['username'];
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
try
{
// Grab the user's details from WebsitePanel in order to get the user's id
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
return "The specified user {$username} does not exist";
}
else
{
// Attempt to delete the users account and package / hosting space
$result = $wsp->deleteUser($user['UserId']);
if ($result >= 0)
{
// Success - Alert WHMCS
return 'success';
}
else
{
// Failed - Alert WHMCS of the returned Enterprise Server error code
return websitepanel_GetErrorMessage($result);
}
}
}
catch (Exception $e)
{
return $e->getMessage();
}
// Get the user's details from WebsitePanel - We need the userid
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
throw new Exception("User {$username} does not exist - Cannot terminate account for unknown user");
}
// Attempt the delete the users account
$result = $wsp->deleteUser($user['UserId']);
if ($result < 0)
{
// Something went wrong
throw new Exception('Fault: ' . websitepanel_EnterpriseServer::getFriendlyError($result), $result);
}
// Notify success
return 'success';
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "TerminateAccount Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
// Notify failure - Houston we have a problem!
return $errorMessage;
}
}
/**
* websitepanel_SuspendAccount()
* Suspends the WebsitePanel user account and package
*
* @access public
* @param array $params
* @param array $params WHMCS parameters
* @throws Exception
* @return string
*/
function websitepanel_SuspendAccount($params)
{
// Create the WebsitePanel object instance
$wsp = new WebsitePanel($params['serverusername'], $params['serverpassword'], $params['serverip'], $params['configoption6'], $params['serversecure']);
// WHMCS server parameters & package parameters
$serverUsername = $params['serverusername'];
$serverPassword = $params['serverpassword'];
$serverPort = $params['configoption6'];
$serverHost = empty($params['serverhostname']) ? $params['serverip'] : $params['serverhostname'];
$serverSecure = $params['serversecure'];
$username = $params['username'];
$clientsDetails = $params['clientsdetails'];
$userId = $clientsDetails['userid'];
$serviceId = $params['serviceid'];
// WHMCS server parameters & package parameters
$username = $params['username'];
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
try
{
// Grab the user's details from WebsitePanel in order to get the user's id
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
return "The specified user {$username} does not exist";
}
else
{
// Attempt to suspend the users account and package / hosting space
$result = $wsp->changeUserStatus($user['UserId'], WebsitePanel::USERSTATUS_SUSPENDED);
if ($result >= 0)
{
// Success - Alert WHMCS
return 'success';
}
else
{
// Failed - Alert WHMCS of the returned Enterprise Server error code
return websitepanel_GetErrorMessage($result);
}
}
}
catch (Exception $e)
{
return $e->getMessage();
}
// Get the user's details from WebsitePanel - We need the userid
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
throw new Exception("User {$username} does not exist - Cannot suspend account for unknown user");
}
// Change the user's account and package account status
$result = $wsp->changeUserStatus($user['UserId'], websitepanel_EnterpriseServer::USERSTATUS_SUSPENDED);
if ($result < 0)
{
// Something went wrong
throw new Exception('Fault: ' . websitepanel_EnterpriseServer::getFriendlyError($result), $result);
}
// Notify success
return 'success';
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "SuspendAccount Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
// Notify failure - Houston we have a problem!
return $errorMessage;
}
}
/**
* websitepanel_UnsuspendAccount()
* Unsuspends the WebsitePanel user account and package
*
* @access public
* @param array $params
* @param array $params WHMCS parameters
* @throws Exception
* @return string
*/
function websitepanel_UnsuspendAccount($params)
{
// Create the WebsitePanel object instance
$wsp = new WebsitePanel($params['serverusername'], $params['serverpassword'], $params['serverip'], $params['configoption6'], $params['serversecure']);
// WHMCS server parameters & package parameters
$serverUsername = $params['serverusername'];
$serverPassword = $params['serverpassword'];
$serverPort = $params['configoption6'];
$serverHost = empty($params['serverhostname']) ? $params['serverip'] : $params['serverhostname'];
$serverSecure = $params['serversecure'];
$username = $params['username'];
$clientsDetails = $params['clientsdetails'];
$userId = $clientsDetails['userid'];
$serviceId = $params['serviceid'];
// WHMCS server parameters & package parameters
$username = $params['username'];
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
try
{
// Grab the user's details from WebsitePanel in order to get the user's id
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
return "The specified user {$username} does not exist";
}
else
{
// Attempt to activate the users account and package / hosting space
$result = $wsp->changeUserStatus($user['UserId'], WebsitePanel::USERSTATUS_ACTIVE);
if ($result >= 0)
{
// Success - Alert WHMCS
return 'success';
}
else
{
// Failed - Alert WHMCS of the returned Enterprise Server error code
return websitepanel_GetErrorMessage($result);
}
}
}
catch (Exception $e)
{
return $e->getMessage();
}
// Get the user's details from WebsitePanel - We need the userid
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
throw new Exception("User {$username} does not exist - Cannot unsuspend account for unknown user");
}
// Change the user's account and package account status
$result = $wsp->changeUserStatus($user['UserId'], websitepanel_EnterpriseServer::USERSTATUS_ACTIVE);
if ($result < 0)
{
// Something went wrong
throw new Exception('Fault: ' . websitepanel_EnterpriseServer::getFriendlyError($result), $result);
}
// Notify success
return 'success';
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "UnsuspendAccount Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
// Notify failure - Houston we have a problem!
return $errorMessage;
}
}
/**
* websitepanel_ChangePassword()
* Changes the WebsitePanel user account password
*
* @access public
* @param array $params
* @return int
* @param array $params WHMCS parameters
* @throws Exception
* @return string
*/
function websitepanel_ChangePassword($params)
{
// Create the WebsitePanel object instance
$wsp = new WebsitePanel($params['serverusername'], $params['serverpassword'], $params['serverip'], $params['configoption6'], $params['serversecure']);
// WHMCS server parameters & package parameters
$serverUsername = $params['serverusername'];
$serverPassword = $params['serverpassword'];
$serverPort = $params['configoption6'];
$serverHost = empty($params['serverhostname']) ? $params['serverip'] : $params['serverhostname'];
$serverSecure = $params['serversecure'];
$username = $params['username'];
$password = $params['password'];
$clientsDetails = $params['clientsdetails'];
$userId = $clientsDetails['userid'];
$serviceId = $params['serviceid'];
// WHMCS server parameters & package parameters
$serviceId = $params['serviceid'];
$username = $params['username'];
$password = $params['password'];
$userId = $params['clientsdetails']['userid'];
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
try
{
// Grab the user's details from WebsitePanel in order to get the user's id
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
return "The specified user {$username} does not exist";
}
else
{
// Attempt to change the user's account password
$result = $wsp->changeUserPassword($user['UserId'], $password);
if ($result >= 0)
{
// Log this action for logging / tracking purposes incase the client complains we have record of what went on and why
logActivity("Control Panel Password Updated - Service ID: {$serviceId}", $userId);
// Get the user's details from WebsitePanel - We need the userid
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
throw new Exception("User {$username} does not exist - Cannot change account password for unknown user");
}
// Success - Alert WHMCS
return 'success';
}
else
{
// Failed - Alert WHMCS of the returned Enterprise Server error code
return websitepanel_GetErrorMessage($result);
}
}
}
catch (Exception $e)
{
return $e->getMessage();
}
// Change the user's account password
$result = $wsp->changeUserPassword($user['UserId'], $password);
if ($result < 0)
{
// Something went wrong
throw new Exception('Fault: ' . websitepanel_EnterpriseServer::getFriendlyError($result), $result);
}
// Notify success
return 'success';
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "ChangePassword Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
// Notify failure - Houston we have a problem!
return $errorMessage;
}
}
/**
* websitepanel_ChangePackage()
* Changes the WebsitePanel user hosting package
*
* @access public
* @param array $params
* @param array $params WHMCS parameters
* @throws Exception
* @return string
*/
function websitepanel_ChangePackage($params)
{
// Create the WebsitePanel object instance
$wsp = new WebsitePanel($params['serverusername'], $params['serverpassword'], $params['serverip'], $params['configoption6'], $params['serversecure']);
// WHMCS server parameters & package parameters
$serverUsername = $params['serverusername'];
$serverPassword = $params['serverpassword'];
$serverPort = $params['configoption6'];
$serverHost = empty($params['serverhostname']) ? $params['serverip'] : $params['serverhostname'];
$serverSecure = $params['serversecure'];
$username = $params['username'];
$clientsDetails = $params['clientsdetails'];
$userId = $clientsDetails['userid'];
$serviceId = $params['serviceid'];
// WHMCS server parameters & package parameters
$username = $params['username'];
// WebsitePanel API parameters
$planId = $params['configoption4'];
$packageName = $params['configoption1'];
// WebsitePanel API parameters
$planId = $params['configoption4'];
$packageName = $params['configoption1'];
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
try
{
// Grab the user's details from WebsitePanel in order to get the user's id
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
return "The specified user {$username} does not exist";
}
else
{
// Get the user's current WebsitePanel hosting space Id (Hosting Plan)
$package = $wsp->getUserPackages($user['UserId']);
$packageId = $package['PackageId'];
// Get the user's details from WebsitePanel - We need the userid
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
throw new Exception("User {$username} does not exist - Cannot change package for unknown user");
}
// Update the user's package
$result = $wsp->updatePackageLiteral($packageId, $package['StatusId'], $planId, $package['PurchaseDate'], $packageName, '');
$result = $result['Result'];
if ($result >= 0)
{
// Success - Alert WHMCS
return 'success';
}
else
{
// Failed - Alert WHMCS of the returned Enterprise Server error code
return websitepanel_GetErrorMessage($result);
}
}
}
catch (Exception $e)
{
return $e->getMessage();
}
// Get the user's package details from WebsitePanel - We need the PackageId
$package = $wsp->getUserPackages($user['UserId']);
// Update the user's WebsitePanel package
$result = $wsp->updatePackageLiteral($package['PackageId'], $package['StatusId'], $planId, $package['PurchaseDate'], $packageName, $package['PackageComments']);
if ($result < 0)
{
// Something went wrong
throw new Exception('Fault: ' . websitepanel_EnterpriseServer::getFriendlyError($result), $result);
}
// Notify success
return 'success';
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "ChangePackage Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
// Notify failure - Houston we have a problem!
return $errorMessage;
}
}
/**
* websitepanel_LoginLink()
* Updates the WHMCS service's usage details from WebsitePanel
*
* @access public
* @param array $params
* @param aray $params WHMCS parameters
* @throws Exception
*/
function websitepanel_UsageUpdate($params)
{
// WHMCS server parameters & package parameters
$serverUsername = $params['serverusername'];
$serverPassword = $params['serverpassword'];
$serverHost = empty($params['serverhostname']) ? $params['serverip'] : $params['serverhostname'];
$serverSecure = $params['serversecure'];
$serverId = $params['serverid'];
$userId = 0;
$serviceId = 0;
// Query for WebsitePanel user accounts assigned to this server
// Only services that have packages that have "Tick to update diskpace / bandwidth in WHMCS" enabled
$result = full_query("SELECT h.id AS serviceid, h.userid AS userid, h.username AS username, h.regdate AS regdate, p.configoption2 AS configoption2, p.configoption3 AS configoption3, p.configoption6 AS configoption6 FROM `tblhosting` AS h, `tblproducts` AS p WHERE h.server = {$serverId} AND h.packageid = p.id AND p.configoption16 = 'on' AND h.domainstatus IN ('Active', 'Suspended')");
while (($row = mysql_fetch_array($result)) != false)
{
// Start processing the users usage
$username = $row['username'];
$userId = $row['userid'];
$serviceId = $row['serviceid'];
$serverPort = $row['configoption6'];
// Diskspace and Bandwidth limits for this package
$diskLimit = $row['configoption2'];
$bwidthLimit = $row['configoption3'];
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
// Get the user's details from WebsitePanel - We need the userid
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
throw new Exception("User {$username} does not exist - Cannot calculate usage for unknown user");
}
// Get the user's package details from WebsitePanel - We need the PackageId
$package = $wsp->getUserPackages($user['UserId']);
// Gather the bandwidth / diskspace usage stats
$bwidthUsage = websitepanel_CalculateUsage($wsp->getPackageBandwidthUsage($package['PackageId'], websitepanel_CreateBandwidthDate($row['regdate']), date('Y-m-d', time())), websitepanel_EnterpriseServer::USAGE_BANDWIDTH);
$diskUsage = websitepanel_CalculateUsage($wsp->getPackageDiskspaceUsage($package['PackageId']), websitepanel_EnterpriseServer::USAGE_DISKSPACE);
// Update WHMCS's service details
update_query('tblhosting', array('diskusage' => $diskUsage, 'disklimit' => $diskLimit, 'bwusage' => $bwidthUsage, 'bwlimit' => $bwidthLimit, 'lastupdate' => 'now()'), array('id' => $serviceId));
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "UsageUpdate Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
}
}
}
/**
* Returns the WebsitePanel one-click login link
*
* @param array $params WHMCS parameters
* @throws Exception
* @return string
*/
function websitepanel_LoginLink($params)
{
echo "<a href='{$params['configoption8']}/default.aspx?pid=Login&user={$params['username']}&password={$params['password']}' title='Control Panel Login' style='color:#cc0000;' target='_blank'>Login to Control Panel (One-Click Login)</a>";
// WHMCS does not return the full hosting account details, we will query for what we need
$result = select_query('tblhosting', 'domainstatus', array('id' => $params['serviceid']));
$results = mysql_fetch_array($result);
// Display the link only if the account is Active or Suspended
if (in_array($results['domainstatus'], array('Active', 'Suspended')))
{
// WHMCS server parameters & package parameters
$serverUsername = $params['serverusername'];
$serverPassword = $params['serverpassword'];
$serverPort = $params['configoption6'];
$serverHost = empty($params['serverhostname']) ? $params['serverip'] : $params['serverhostname'];
$serverSecure = $params['serversecure'];
$username = $params['username'];
$serviceId = $params['serviceid'];
$clientsDetails = $params['clientsdetails'];
$userId = $clientsDetails['userid'];
try
{
// Create the WebsitePanel Enterprise Server Client object instance
$wsp = new websitepanel_EnterpriseServer($serverUsername, $serverPassword, $serverHost, $serverPort, $serverSecure);
// Get the user's details from WebsitePanel - We need the userid
$user = $wsp->getUserByUsername($username);
if (empty($user))
{
throw new Exception("User {$username} does not exist - Cannot display LoginLink for non-existing user");
}
// Load the client area language file
$LANG = websitepanel_LoadClientLanguage();
// Print the link
echo "<a href=\"{$params['configoption8']}/Default.aspx?pid=Home&UserID={$user['UserId']}\" target=\"_blank\" title=\"{$LANG['websitepanel_adminarea_gotowebsitepanelaccount']}\">{$LANG['websitepanel_adminarea_gotowebsitepanelaccount']}</a><br />";
}
catch (Exception $e)
{
// Error message to log / return
$errorMessage = "LoginLink Fault: (Code: {$e->getCode()}, Message: {$e->getMessage()}, Service ID: {$serviceId})";
// Log to WHMCS
logactivity($errorMessage, $userId);
// Notify failure - Houston we have a problem!
return $errorMessage;
}
}
}
/**
* websitepanel_ClientArea()
* Client Area module output for the customer's "My Services" service output
*
* @access public
* @param array $params
* @return string
* @param array $params WHMCS parameters
* @throws Exception
* @return array
*/
function websitepanel_ClientArea($params)
{
return "<a href='{$params['configoption8']}/default.aspx?pid=Login&user={$params['username']}&password={$params['password']}' title='Control Panel Login' style='color:#cc0000;' target='_blank'>Login to Control Panel (One-Click Login)</a>";
}
/**
* websitepanel_UsageUpdate()
*
* @access public
* @param array $params
* @return void
*/
function websitepanel_UsageUpdate($params)
{
// WHMCS server parameters & package parameters
$serverid = $params['serverid'];
$serverip = $params['serverip'];
$username = $params['username'];
$password = $params['password'];
// Query for all active or suspended users under the specified server
$query = full_query("SELECT `username`, `packageid`, `regdate` FROM `tblhosting` WHERE `server` = {$serverid} AND `domainstatus` IN ('Active', 'Suspended') AND `username` <> ''");
while (($row = mysql_fetch_array($query)) != false)
{
try
{
// Start processing the specified users usage
$username = $row['username'];
$packageId = $row['packageid'];
// Load the client area language file
websitepanel_LoadClientLanguage();
// Get the packages ConfigOptions
$packageQuery = select_query('tblproducts', 'configoption2,configoption3,configoption6,configoption16', array('id' => $packageId, 'configoption16' => 'on'));
$cfgOptions = mysql_fetch_array($packageQuery);
$params['configoption6'] = $cfgOptions['configoption6'];
// Diskspace and Bandwidth limits for this package
$diskLimit = $cfgOptions['configoption2'];
$bwidthLimit = $cfgOptions['configoption3'];
// Create the WebsitePanel object instance
$wsp = new WebsitePanel($params['serverusername'], $params['serverpassword'], $serverip, $params['configoption6'], $params['serversecure']);
// Get the specified user details
// Get the Package id of the user's package
$user = $wsp->getUserByUsername($username);
$package = $wsp->getUserPackages($user['UserId']);
// Gather the bandwidth / diskspace usage stats
$bandwidthUsage = websitepanel_CalculateBandwidthUsage($params, $package['PackageId'], websitepanel_CreateBandwidthDate($row['regdate']));
$diskSpaceUsage = websitepanel_CalculateDiskspaceUsage($params, $package['PackageId']);
// Update the package details
update_query('tblhosting', array('diskusage' => $diskSpaceUsage, 'disklimit' => $diskLimit, 'bwusage' => $bandwidthUsage, 'bwlimit' => $bwidthLimit, 'lastupdate' => date('Y-m-d H:i:s')), array('username' => $username, 'server' => $serverid));
}
catch (Exception $e)
{
// Nothing
}
}
// Return template information
return array('templatefile' => 'clientarea', 'vars' => array('websitepanel_url' => $params['configoption8'], 'username' => $username, 'password' => $password));
}

View file

@ -1,19 +0,0 @@
Extract the "includes" and "modules" directories into the root of your WHMCS installation
Overwrite any files that already exists
To enable addon automation...
1. WHMCS Admin -> Setup -> Addon Modules -> "WebsitePanel Addons Automation" -> Activate
2. Select "Configure"
3. Enter your WebsitePanel Enterprise Server details
4. WHMCS Admin -> Addons -> "WebsitePanel Addons"
5. Enter your addons here. You can get the WHMCS addon ID by clicking the edit icon on the product addon and extracting the &id=x from the URL (x being the WHMCS Addon ID)
You can retrieve your WebsitePanel addon ID by clicking the hosting addon and extracting the PlanID=x from the URL (x being the WebsitePanel Addon ID)
6. If this is a Dedicated IP address addon, check the Dedicated IP Address box to allow the module to auto-allocate an IP address.
What does not work?
- Quantities, only a single addon => addon can be allocated
- Terminating / Suspending Addons, I've ran out of time on what I can do currently
- When an IP address is allocated WebsitePanel does not return back what IP was allocated, so WHMCS is not updated which what IP has been allocated to his / her package at this time.
- A single user => single package is the only way the WebsitePanel server module works. I have no plans on making this work any other way.
DO NOT CONTACT WHMCS FOR SUPPORT WITH THIS MODULE - THIS IS NOT DEVELOPED BY WHMCS AND HAS NO AFFILIATION WITH WHMCS OR WHMCS.COM.