@@ -0,0 +1,567 @@
<?php
/**
* CloudFlare API
*
* @source https://github.com/vexxhost/CloudFlare-API
* @author AzzA <azza@broadcasthe.net>
* @copyright omgwtfhax inc. 2013
* @version 1.1
*/
class cloudflare_api
{
//The URL of the API
private static $ URL = array (
'USER' => 'https://www.cloudflare.com/api_json.html' ,
'HOST' => 'https://api.cloudflare.com/host-gw.html'
);
//Service mode values.
private static $ MODE_SERVICE = array ('A' , 'AAAA' , 'CNAME' );
//Prio values.
private static $ PRIO = array ('MX' , 'SRV' );
//Timeout for the API requests in seconds
const TIMEOUT = 5 ;
//Interval values for Stats
const INTERVAL_365_DAYS = 10 ;
const INTERVAL_30_DAYS = 20 ;
const INTERVAL_7_DAYS = 30 ;
const INTERVAL_DAY = 40 ;
const INTERVAL_24_HOURS = 100 ;
const INTERVAL_12_HOURS = 110 ;
const INTERVAL_6_HOURS = 120 ;
//Stores the api key
private $ token_key ;
private $ host_key ;
//Stores the email login
private $ email ;
/**
* Make a new instance of the API client
*/
public function __construct ()
{
$ parameters = func_get_args();
switch (func_num_args()) {
case 1 :
//a host API
$ this ->host_key = $ parameters [0 ];
break ;
case 2 :
//a user request
$ this ->email = $ parameters [0 ];
$ this ->token_key = $ parameters [1 ];
break ;
}
}
public function setEmail ($ email )
{
$ this ->email = $ email ;
}
public function setToken ($ token_key )
{
$ this ->token_key = $ token_key ;
}
/**
* CLIENT API
* Section 3
* Access
*/
/**
* 3.1 - Retrieve Domain Statistics For A Given Time Frame
* This function retrieves the current stats and settings for a particular website.
* It can also be used to get currently settings of values such as the security level.
*/
public function stats ($ domain , $ interval = 20 )
{
$ data = array (
'a' => 'stats' ,
'z' => $ domain ,
'interval' => $ interval
);
return $ this ->http_post ($ data );
}
/**
* 3.2 - Retrieve A List Of The Domains
* This lists all domains in a CloudFlare account along with other data.
*/
public function zone_load_multi ()
{
$ data = array (
'a' => 'zone_load_multi'
);
return $ this ->http_post ($ data );
}
/**
* 3.3 - Retrieve DNS Records Of A Given Domain
* This function retrieves the current DNS records for a particular website.
*/
public function rec_load_all ($ domain )
{
$ data = array (
'a' => 'rec_load_all' ,
'z' => $ domain
);
return $ this ->http_post ($ data );
}
/**
* 3.4 - Checks For Active Zones And Returns Their Corresponding Zids
* This function retrieves domain statistics for a given time frame.
*/
public function zone_check ($ zones )
{
if (is_array($ zones )) {
$ zones = implode(',' , $ zones );
}
$ data = array (
'a' => 'zone_check' ,
'zones' => $ zones
);
return $ this ->http_post ($ data );
}
/**
* 3.6 - Check The Threat Score For A Given IP
* This function retrieves the current threat score for a given IP.
* Note that scores are on a logarithmic scale, where a higher score indicates a higher threat.
*/
public function threat_score ($ ip )
{
$ data = array (
'a' => 'ip_lkup' ,
'ip' => $ ip
);
return $ this ->http_post ($ data );
}
/**
* 3.7 - List All The Current Settings
* This function retrieves all the current settings for a given domain.
*/
public function zone_settings ($ domain )
{
$ data = array (
'a' => 'zone_settings' ,
'z' => $ domain
);
return $ this ->http_post ($ data );
}
/**
* Undocumented method
* SEE: https://github.com/vexxhost/CloudFlare-API/pull/3
*/
public function zone_init ($ zone )
{
$ data ['a' ] = 'zone_init' ;
$ data ['z' ] = $ zone ;
return $ this ->http_post ($ data );
}
/**
* CLIENT API
* Section 4
* Modify
*/
/**
* 4.1 - Set The Security Level
* This function sets the Basic Security Level to I'M UNDER ATTACK! / HIGH / MEDIUM / LOW / ESSENTIALLY OFF.
* The switches are: (help|high|med|low|eoff).
*/
public function sec_lvl ($ domain , $ mode )
{
$ data = array (
'a' => 'sec_lvl' ,
'z' => $ domain ,
'v' => $ mode
);
return $ this ->http_post ($ data );
}
/**
* 4.2 - Set The Cache Level
* This function sets the Caching Level to Aggressive or Basic.
* The switches are: (agg|basic).
*/
public function cache_lvl ($ domain , $ mode )
{
$ data = array (
'a' => 'cache_lvl' ,
'z' => $ domain ,
'v' => (strtolower($ mode ) == 'agg' ) ? 'agg' : 'basic'
);
return $ this ->http_post ($ data );
}
/**
* 4.3 - Toggling Development Mode
* This function allows you to toggle Development Mode on or off for a particular domain.
* When Development Mode is on the cache is bypassed.
* Development mode remains on for 3 hours or until when it is toggled back off.
*/
public function devmode ($ domain , $ mode )
{
$ data = array (
'a' => 'devmode' ,
'z' => $ domain ,
'v' => ($ mode == true ) ? 1 : 0
);
return $ this ->http_post ($ data );
}
/**
* 4.4 - Clear CloudFlare's Cache
* This function will purge CloudFlare of any cached files.
* It may take up to 48 hours for the cache to rebuild and optimum performance to be achieved.
* This function should be used sparingly.
*/
public function fpurge_ts ($ domain )
{
$ data = array (
'a' => 'fpurge_ts' ,
'z' => $ domain ,
'v' => 1
);
return $ this ->http_post ($ data );
}
/**
* 4.5 - Purge A Single File In CloudFlare's Cache
* This function will purge a single file from CloudFlare's cache.
*/
public function zone_file_purge ($ domain , $ url )
{
$ data = array (
'a' => 'zone_file_purge' ,
'z' => $ domain ,
'url' => $ url
);
return $ this ->http_post ($ data );
}
/**
* 4.6 - Update The Snapshot Of Your Site
* This snapshot is used on CloudFlare's challenge page
* This function tells CloudFlare to take a new image of your site.
* Note that this call is rate limited to once per zone per day.
* Also the new image may take up to 1 hour to appear.
*/
public function update_image ($ zoneid )
{
$ data = array (
'a' => 'zone_grab' ,
'zid' => $ zoneid
);
return $ this ->http_post ($ data );
}
/**
* 4.7a - Whitelist IPs
* You can add an IP address to your whitelist.
*/
public function wl ($ ip )
{
$ data = array (
'a' => 'wl' ,
'key' => $ ip
);
return $ this ->http_post ($ data );
}
/**
* 4.7b - Blacklist IPs
* You can add an IP address to your blacklist.
*/
public function ban ($ ip )
{
$ data = array (
'a' => 'ban' ,
'key' => $ ip
);
return $ this ->http_post ($ data );
}
/**
* 4.7c - Unlist IPs
* You can remove an IP address from the whitelist and the blacklist.
*/
public function nul ($ ip )
{
$ data = array (
'a' => 'nul' ,
'key' => $ ip
);
return $ this ->http_post ($ data );
}
/**
* 4.8 - Toggle IPv6 Support
* This function toggles IPv6 support.
*/
public function ipv46 ($ domain , $ mode )
{
$ data = array (
'a' => 'ipv46' ,
'z' => $ domain ,
'v' => ($ mode == true ) ? 1 : 0
);
return $ this ->http_post ($ data );
}
/**
* 4.9 - Set Rocket Loader
* This function changes Rocket Loader setting.
*/
public function async ($ domain , $ mode )
{
$ data = array (
'a' => 'async' ,
'z' => $ domain ,
'v' => $ mode
);
return $ this ->http_post ($ data );
}
/**
* 4.10 - Set Minification
* This function changes minification settings.
*/
public function minify ($ domain , $ mode )
{
$ data = array (
'a' => 'minify' ,
'z' => $ domain ,
'v' => $ mode
);
return $ this ->http_post ($ data );
}
/**
* CLIENT API
* Section 5
* DNS Record Management
*/
/**
* 5.1 - Add A New DNS Record
* This function creates a new DNS record for a zone.
* See http://www.cloudflare.com/docs/client-api.html#s5.1 for documentation.
*/
public function rec_new ($ domain , $ type , $ name , $ content , $ ttl = 1 , $ mode = 1 , $ prio = 1 , $ service = 1 , $ srvname = 1 , $ protocol = 1 , $ weight = 1 , $ port = 1 , $ target = 1 )
{
$ data = array (
'a' => 'rec_new' ,
'z' => $ domain ,
'type' => $ type ,
'name' => $ name ,
'content' => $ content ,
'ttl' => $ ttl
);
if (in_array($ type , self ::$ MODE_SERVICE ))
$ data ['service_mode' ] = ($ mode == true ) ? 1 : 0 ;
else if (in_array($ type , self ::$ PRIO )) {
$ data ['prio' ] = $ prio ;
if ($ type == 'SRV' ) {
$ data = array_merge($ data , array (
'service' => $ service ,
'srvname' => $ srvname ,
'protocol' => $ protocol ,
'weight' => $ weight ,
'port' => $ port ,
'target' => $ target
));
}
}
return $ this ->http_post ($ data );
}
/**
* 5.2 - Edit A DNS Record
* This function edits a DNS record for a zone.
* See http://www.cloudflare.com/docs/client-api.html#s5.1 for documentation.
*/
public function rec_edit ($ domain , $ type , $ id , $ name , $ content , $ ttl = 1 , $ mode = 1 , $ prio = 1 , $ service = 1 , $ srvname = 1 , $ protocol = 1 , $ weight = 1 , $ port = 1 , $ target = 1 )
{
$ data = array (
'a' => 'rec_edit' ,
'z' => $ domain ,
'type' => $ type ,
'id' => $ id ,
'name' => $ name ,
'content' => $ content ,
'ttl' => $ ttl
);
if (in_array($ type , self ::$ MODE_SERVICE ))
$ data ['service_mode' ] = ($ mode == true ) ? 1 : 0 ;
else if (in_array($ type , self ::$ PRIO )) {
$ data ['prio' ] = $ prio ;
if ($ type == 'SRV' ) {
$ data = array_merge($ data , array (
'service' => $ service ,
'srvname' => $ srvname ,
'protocol' => $ protocol ,
'weight' => $ weight ,
'port' => $ port ,
'target' => $ target
));
}
}
return $ this ->http_post ($ data );
}
/**
* 5.3 - Delete A DNS Record
* This function deletes a DNS record for a zone.
* $zone = zone
* $id = The DNS Record ID (Available by using the rec_load_all call)
* $type = A|CNAME
*/
public function delete_dns_record ($ domain , $ id )
{
$ data = array (
'a' => 'rec_delete' ,
'z' => $ domain ,
'id' => $ id
);
return $ this ->http_post ($ data );
}
/**
* HOST API
* Section 3
* Specific Host Provider Operations
*/
public function user_create ($ email , $ password , $ username = '' , $ id = '' )
{
$ data = array (
'act' => 'user_create' ,
'cloudflare_email' => $ email ,
'cloudflare_pass' => $ password ,
'cloudflare_username' => $ username ,
'unique_id' => $ id
);
return $ this ->http_post ($ data , 'HOST' );
}
public function zone_set ($ key , $ zone , $ resolve_to , $ subdomains )
{
if (is_array($ subdomains ))
$ subdomains = implode(',' , $ subdomains );
$ data = array (
'act' => 'zone_set' ,
'user_key' => $ key ,
'zone_name' => $ zone ,
'resolve_to' => $ resolve_to ,
'subdomains' => $ subdomains
);
return $ this ->http_post ($ data , 'HOST' );
}
public function user_lookup ($ email , $ isID = false )
{
$ data = array (
'act' => 'user_lookup'
);
if ($ isID ) {
$ data ['unique_id' ] = $ email ;
} else {
$ data ['cloudflare_email' ] = $ email ;
}
return $ this ->http_post ($ data , 'HOST' );
}
public function user_auth ($ email , $ password , $ id = '' )
{
$ data = array (
'act' => 'user_auth' ,
'cloudflare_email' => $ email ,
'cloudflare_pass' => $ password ,
'unique_id' => $ id
);
return $ this ->http_post ($ data , 'HOST' );
}
public function zone_lookup ($ zone , $ user_key )
{
$ data = array (
'act' => 'zone_lookup' ,
'user_key' => $ user_key ,
'zone_name' => $ zone
);
return $ this ->http_post ($ data , 'HOST' );
}
public function zone_delete ($ zone , $ user_key )
{
$ data = array (
'act' => 'zone_delete' ,
'user_key' => $ user_key ,
'zone_name' => $ zone
);
return $ this ->http_post ($ data , 'HOST' );
}
public function zone_list ()
{
$ data = array (
'act' => 'zone_list' ,
'one_status' => 'ALL' ,
'sub_status' => 'ALL'
);
return $ this ->http_post ($ data , 'HOST' );
}
/**
* GLOBAL API CALL
* HTTP POST a specific task with the supplied data
*/
private function http_post ($ data , $ type = 'USER' )
{
switch ($ type ) {
case 'USER' :
$ data ['u' ] = $ this ->email ;
$ data ['tkn' ] = $ this ->token_key ;
break ;
case 'HOST' :
$ data ['host_key' ] = $ this ->host_key ;
break ;
}
$ ch = curl_init();
curl_setopt($ ch , CURLOPT_VERBOSE , 0 );
curl_setopt($ ch , CURLOPT_FORBID_REUSE , true );
curl_setopt($ ch , CURLOPT_URL , self ::$ URL [$ type ]);
curl_setopt($ ch , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt($ ch , CURLOPT_POST , 1 );
curl_setopt($ ch , CURLOPT_POSTFIELDS , $ data );
curl_setopt($ ch , CURLOPT_TIMEOUT , self ::TIMEOUT );
curl_setopt($ ch , CURLOPT_SSL_VERIFYPEER , false );
$ http_result = curl_exec($ ch );
$ error = curl_error($ ch );
$ http_code = curl_getinfo($ ch , CURLINFO_HTTP_CODE );
curl_close($ ch );
if ($ http_code != 200 ) {
return array (
'error' => $ error
);
} else {
return json_decode($ http_result );
}
}
}