Files
PrestaShop/modules/cloudcache/lib/CloudCacheApi.php
jObregon fac1566a5f [+] MO : CloudCache module
git-svn-id: http://dev.prestashop.com/svn/v1/branches/1.5.x@14929 b9a71923-0436-4b27-9f14-aed3839534dd
2012-04-26 16:39:43 +00:00

389 lines
11 KiB
PHP

<?php
/*
* 2007-2012 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2012 PrestaShop SA
* @version Release: $Revision: 1.4 $
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
// Load the XML-RPC abstraction
require(dirname(__FILE__).'/xmlrpc.inc.php');
// Defines for the report.gettotaltransfert Method rangeType values
if (!defined('CLOUDCACHE_RANGE_TYPE_TODAY'))
{
define('CLOUDCACHE_RANGE_TYPE_TODAY', '1');
define('CLOUDCACHE_RANGE_TYPE_HOUR', '2');
define('CLOUDCACHE_RANGE_TYPE_DATE', '3');
define('CLOUDCACHE_FILE_TYPE_UNASSOCIATED', 'none');
define('CLOUDCACHE_FILE_TYPE_ALL', 'all');
define('CLOUDCACHE_FILE_TYPE_IMG', 'img');
define('CLOUDCACHE_FILE_TYPE_JS', 'js');
define('CLOUDCACHE_FILE_TYPE_CSS', 'css');
define('CLOUDCACHE_FILE_TYPE_OTHER', 'other');
}
class CloudcacheApi
{
private $apiKey;
private $apiUserId;
private $companyId;
private $curDate;
private $hashType;
private $pullzoneType;
private $availableNamespaces = array('pullzone' => 'Pull Zone');
private $lastRpcRequest;
private $lastRpcResponse;
/** @var port Port of the cloudcache XML-RPC Api server */
private $port;
/** @var httpMethod Http method to be used when using the XML-RPC API */
private $httpMethod;
public function __construct()
{
// Declare which method is avaible for which namespace
$tab = array(
'user' => array('listUsers', 'update'),
'account' => array('getBandwidth'),
'report' => array(
'getTotalTransfer',
'getTotalHits',
'getTotalTransferStats',
'getCacheHitStats',
'getPopularFiles',
'getUsagePerDay',
'getNodeHits',
'getConnectionStats',
'getHourlyConnectionStats',
),
'cache' => array('purge', 'purgeAllCache'),
'pullzone' => array('listZones', 'create', 'update'),
'pushzone' => array('listZones', 'create', 'update'),
'vodzone' => array('listZones', 'create', 'update'),
// 'livezone' => array('listZones', 'create', 'update', 'delete'), // Not yet implemented
);
// Connection settings
$this->port = CLOUDCACHE_API_PORT;
$this->httpMethod = CLOUDCACHE_API_HTTP_METHOD;
$this->apiURI = CLOUDCACHE_API_URI;
$this->apiURL = CLOUDCACHE_API_URL;
// Api credentials
if (Configuration::get('PS_CIPHER_ALGORITHM'))
$this->_cipherTool = new Rijndael(_RIJNDAEL_KEY_, _RIJNDAEL_IV_);
else
$this->_cipherTool = new Blowfish(_COOKIE_KEY_, _COOKIE_IV_);
$this->apiKey = $this->_cipherTool->decrypt(Configuration::get('CLOUDCACHE_API_KEY'));
$this->apiUserId = Configuration::get('CLOUDCACHE_API_USER');
$this->companyId = Configuration::get('CLOUDCACHE_API_COMPANY_ID');
// Random stuff needed by the API
// Save the current timezone
$currentTimezone = date_default_timezone_get();
// Set the timezone to the Cloudcache one
date_default_timezone_set('America/Los_Angeles');
// Retreive the RFC 8601 With Cloudcache timezone
$this->curDate = date('c');
// Put back user timezone
date_default_timezone_set($currentTimezone);
$this->hashType = CLOUDCACHE_API_HASH_TYPE;
$this->pullzoneType = CLOUDCACHE_API_PULL_ZONE_TYPE;
}
/**
* @brief Create a new empty XML-RPC message ready for cloudcache API.
*
* @param namespace Namespace of the request
* @param method Method used
*
* @return The new xmlrpcmsg Object instance.
*/
private function _getEmptyRpcMessage($namespace, $method)
{
// reset last command
$this->lastRpcRequest = $this->lastRpcResponse = null;
return new xmlrpcmsg($namespace.'.'.$method, array(
php_xmlrpc_encode($this->apiUserId),
php_xmlrpc_encode(hash($this->hashType,
$this->curDate.':'.$this->apiKey.':'.$method)),
php_xmlrpc_encode($this->curDate),
));
}
/**
* @brief List zones.
*
* @param namespace Namespace wanted (pullzone, pushzone, vodzone)
*
* @return List of the zones (replied by the cloudcache server)
*/
public function listZones($namespace)
{
$method = 'listZones';
// Initialize the XML-RPC message
$rpcMsg = $this->_getEmptyRpcMessage($namespace, $method);
switch ($namespace)
{
case 'pullzone':
// For the pullzone, we add a parameter type
$rpcMsg->addParam(php_xmlrpc_encode($this->pullzoneType));
break;
case 'pushzone':
case 'vodzone':
case 'livezone':
default:
break;
}
return $this->_sendRequest($namespace, $rpcMsg);
}
/**
* @brief Create a zone.
*
* @param namespace Namespace wanted (pullzone, pushzone, vodzone)
* @param values Array describing the zone to create.
*
* @return The anwser from the server.
*/
public function createZone($namespace, $values)
{
$method = 'create';
// $values['name'] = 'zonename';
// $values['origin'] = 'zone origin url';
// $values['vanity_domain'] = 'domain to use for the zone';
$rpcMsg = $this->_getEmptyRpcMessage($namespace, $method);
$rpcMsg->addParam(php_xmlrpc_encode($values));
return $this->_sendRequest($namespace, $rpcMsg);
}
/**
* @brief Update a zone
*
* @param namespace Namespace wanted (pullzone, pushzone, vodzone)
* @param zoneId Id of the zone to update
* @param values Array describing the new infos of the zone.
*
* @return Reply from the server.
*/
public function updateZone($namespace, $zoneId, $values)
{
$method = 'update';
$rpcMsg = $this->_getEmptyRpcMessage($namespace, $method);
$rpcMsg->addParam(php_xmlrpc_encode($zoneId));
$rpcMsg->addParam(php_xmlrpc_encode($values));
return $this->_sendRequest($namespace, $rpcMsg);
}
/**
* @brief Retrieve the Bandwith of the wanted time area
*
* @param namespace Namespace wanted (should be 'account')
* @param from From when to check
* @param to Until when to check
*
* @return Bandwith used (Replied from the server)
*/
public function getBandwidth($namespace, $from = null, $to = null)
{
$method = 'getBandwidth';
$rpcMsg = $this->_getEmptyRpcMessage($namespace, $method);
if ($from)
$rpcMsg->addParam(php_xmlrpc_encode($from));
if ($to)
$rpcMsg->addParam(php_xmlrpc_encode($to));
return $this->_sendRequest($namespace, $rpcMsg);
}
/**
* @brief Purge the cache of the given URL.
*
* @param namespace Namespace wanted (should be 'cache')
* @param url Url to purge
*
* @return Reply from the server.
*/
public function cachePurge($namespace, $url)
{
$method = 'purge';
$rpcMsg = $this->_getEmptyRpcMessage($namespace, $method);
$rpcMsg->addParam(php_xmlrpc_encode($url));
return $this->_sendRequest($namespace, $rpcMsg);
}
/**
* @brief Purge all cache of the specified zone.
*
* @param namespace Namespace wanted (should be 'cache')
* @param zoneId Zone to purge.
*
* @return Reply from the server.
*/
public function cachePurgeAll($namespace, $zoneId)
{
$method = 'purgeAllCache';
$rpcMsg = $this->_getEmptyRpcMessage($namespace, $method);
$rpcMsg->addParam(php_xmlrpc_encode($zoneId));
return $this->_sendRequest($namespace, $rpcMsg);
}
/**
* @brief Retrieve the data transfert from the given zone and dates
*
* @param namespace Namespace wanted (should be 'report')
* @param zoneId Zone to check
* @param rangeType Type of date range wanted (1: today, 2:cur day,
* 3: date range)
* @param from Date from where to retrieve the data (format Y-m-d)
* @param to Date from where to retrieve the data (format Y-m-d)
*
* @return Reply from the server.
*/
public function getTotalTransfer($namespace, $zoneId, $rangeType,
$from = null, $to = null)
{
$method = 'getTotalTransferStats';
$rpcMsg = $this->_getEmptyRpcMessage($namespace, $method);
$rpcMsg->addParam(php_xmlrpc_encode(Configuration::get('CLOUDCACHE_API_COMPANY_ID')));
$rpcMsg->addParam(php_xmlrpc_encode($zoneId));
//$rpcMsg->addParam(php_xmlrpc_encode($rangeType));
if ($rangeType == CLOUDCACHE_RANGE_TYPE_DATE)
{
if ($from)
$rpcMsg->addParam(php_xmlrpc_encode($from));
if ($to)
$rpcMsg->addParam(php_xmlrpc_encode($to));
}
return $this->_sendRequest($namespace, $rpcMsg);
}
/**
* @brief Retrieve the data transfert from the given zone and dates
*
* @param namespace Namespace wanted (should be 'report')
* @param companyId Company to check
* @param zoneId Zone to check
* @param from Date from where to retrieve the data (format Y-m-d)
* @param to Date from where to retrieve the data (format Y-m-d)
*
* @return Reply from the server.
*/
public function getTotalTransferStats($namespace, $companyId, $zoneId,
$from, $to)
{
$method = 'getTotalTransferStats';
$rpcMsg = $this->_getEmptyRpcMessage($namespace, $method);
$rpcMsg->addParam(php_xmlrpc_encode($companyId));
$rpcMsg->addParam(php_xmlrpc_encode($from));
$rpcMsg->addParam(php_xmlrpc_encode($to));
$rpcMsg->addParam(php_xmlrpc_encode($zoneId));
return $this->_sendRequest($namespace, $rpcMsg);
}
/**
* @brief Actually send the request to the cloudcache API server.
*
* @param namespace Namespace of the request
* @param rpcMsg XML-RPC message Object containing the actual request
*
* @return Reply from the server
*/
private function _sendRequest($namespace, $rpcMsg)
{
$this->lastRpcRequest = $rpcMsg;
// Initialize the XML-RPL client
$rpcClient = new xmlrpc_client($this->apiURI.$namespace,
$this->apiURL, $this->port, $this->httpMethod);
if (file_exists(dirname(__FILE__).'/proxy.inc.php'))
{
include(dirname(__FILE__).'/proxy.inc.php');
$rpcClient->setProxy($proxy->host, $proxy->port,
$proxy->username, $proxy->password);
}
// Send the message
$this->lastRpcResponse = $rpcClient->send($rpcMsg);
return !$this->getLastFaultCode() ? php_xmlrpc_decode($this->lastRpcResponse->value()) : false;
}
public function getLastFaultCode()
{
if ($this->lastRpcResponse)
return $this->lastRpcResponse->faultCode();
return false;
}
public function getLastFaultString()
{
if ($this->lastRpcResponse)
return $this->lastRpcResponse->faultString();
return false;
}
public function getLastRpcResponse()
{
return $this->lastRpcResponse;
}
public function getLastRpcRequest()
{
return $this->lastRpcRequest;
}
public function getAvailableNamespaces($name = false)
{
return !$name ? array_keys($this->availableNamespaces) : $this->availableNamespaces;
}
}