1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-10 13:12:50 +01:00
invoiceninja/app/Ninja/DNS/Cloudflare.php
David Bomba 8e7b53fd26
Refactor Cloudflare DNS to add and remove A records for custom domains (#1905)
* Refactor Cloudflare DNS to add and remove A records for custom domains

* rebase
2018-02-20 21:14:21 +11:00

131 lines
3.7 KiB
PHP

<?php
namespace App\Ninja\DNS;
use App\Libraries\Utils;
use App\Models\Account;
class Cloudflare
{
public static function addDNSRecord(Account $account){
$zones = json_decode(env('CLOUDFLARE_ZONE_IDS',''), true);
foreach($zones as $zone)
{
if($account->subdomain != "")
{
$jsonEncodedData = json_encode(['type' => 'A', 'name' => $account->subdomain, 'content' => env('CLOUDFLARE_TARGET_IP_ADDRESS', ''), 'proxied' => true]);
$requestType = 'POST';
$url = 'https://api.cloudflare.com/client/v4/zones/' . $zone . '/dns_records';
$response = self::curlCloudFlare($requestType, $url, $jsonEncodedData);
if ($response['status'] != 200)
Utils::logError('Unable to update subdomain ' . $account->subdomain . ' @ Cloudflare - ' . $response['result']['result']);
}
}
}
public static function removeDNSRecord(Account $account) {
$zones = json_decode(env('CLOUDFLARE_ZONE_IDS',''), true);
foreach($zones as $zone)
{
if($account->subdomain != "")
{
$dnsRecordId = self::getDNSRecord($zone, $account->subdomain);
$jsonEncodedData = json_encode([]);
$requestType = 'DELETE';
$url = 'https://api.cloudflare.com/client/v4/zones/' . $zone . '/dns_records/'. $dnsRecordId .'';
$response = self::curlCloudFlare($requestType, $url, $jsonEncodedData);
if ($response['status'] != 200)
Utils::logError('Unable to delete subdomain ' . $account->subdomain . ' @ Cloudflare - ' . $response['result']['result']);
}
}
}
public static function getDNSRecord($zone, $aRecord)
{
//harvest the zone_name
$url = 'https://api.cloudflare.com/client/v4/zones/'. $zone .'/dns_records?type=A&per_page=1';
$requestType = 'GET';
$jsonEncodedData = json_encode([]);
$response = self::curlCloudFlare($requestType, $url, $jsonEncodedData);
if ($response['status'] != 200)
Utils::logError('Unable to get the zone name for ' . $aRecord . ' @ Cloudflare - ' . $response['result']['result']);
$zoneName = $response['result']['result'][0]['zone_name'];
//get the A record
$url = 'https://api.cloudflare.com/client/v4/zones/'. $zone .'/dns_records?type=A&name='. $aRecord .'.'. $zoneName .' ';
$response = self::curlCloudFlare($requestType, $url, $jsonEncodedData);
if ($response['status'] != 200)
Utils::logError('Unable to get the record ID for ' . $aRecord . ' @ Cloudflare - ' . $response['result']['result']);
return $response['result']['result'][0]['id'];
}
private static function curlCloudFlare($requestType, $url, $jsonEncodedData)
{
$curl = curl_init();
$opts = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $requestType,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $jsonEncodedData,
CURLOPT_HTTPHEADER => ['Content-Type: application/json',
'Content-Length: ' . strlen($jsonEncodedData),
'X-Auth-Email: ' . env('CLOUDFLARE_EMAIL', ''),
'X-Auth-Key: ' . env('CLOUDFLARE_API_KEY', '')
],
];
curl_setopt_array($curl, $opts);
$result = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$data['status'] = $status;
$data['result'] = \json_decode($result, true);
curl_close($curl);
return $data;
}
}