Automation/app/Libraries/MySocket/CloudflareSocket.php
2024-09-22 01:04:33 +09:00

70 lines
2.0 KiB
PHP

<?php
namespace App\Libraries\MySocket;
use Cloudflare\API\Endpoints\Zones;
use Cloudflare\API\Endpoints\DNS;
use Cloudflare\API\Endpoints\Accounts;
use Cloudflare\API\Auth\APIKey;
use Cloudflare\API\Adapter\Guzzle;
use App\Models\Cloudflare\AccountModel;
use App\Libraries\CommonLibrary;
use App\Entities\Cloudflare\AccountEntity;
class CloudflareSocket extends CommonLibrary
{
private static int $_request = 0;
private static int $_request_max = 100;
private static int $_request_timewait = 60;
private $_accountModel = null;
private $_clients = [];
protected $_apikey = "";
public function __construct()
{
parent::__construct();
$this->initAdapters();
self::$_request_max = getenv("cfmgr.request.max");
}
final protected function getAccountModel(): AccountModel
{
if ($this->_accountModel === null) {
$this->_accountModel = new AccountModel();
}
return $this->_accountModel;
}
final public function initAdapters(): void
{
foreach ($this->getAccountModel()->getEntitys() as $entity) {
$this->_clients[$entity->getAPIKey()] = new Guzzle(
new APIKey($entity->getTitle(), $entity->getAPIKey())
);
}
}
public function getAdapter(string $apikey): Guzzle
{
if (!array_key_exists($apikey, $this->_clients)) {
throw new \Exception(+__FUNCTION__ . " => {$apikey}에 해당하는 Adapter를 찾을수 없습니다.");
}
if (self::$_request >= self::$_request_max) {
log_message('warning', sprintf("--Cloudflare API Call %s초 대기 시작--", self::$_request_timewait));
sleep(intval(getenv("cf.mgr.request.time.wait")));
self::$_request = 0;
log_message('warning', sprintf("--Cloudflare API Call %s초 대기 종료--", self::$_request_timewait));
}
self::$_request++;
return $this->_clients[$apikey];
}
public function getAccount(string $apikey): Accounts
{
return new Accounts($this->getAdapter($apikey));
}
public function getZone(string $apikey): Zones
{
return new Zones($this->getAdapter($apikey));
}
public function getRecord(string $apikey): DNS
{
return new DNS($this->getAdapter($apikey));
}
}