Automation init...4

This commit is contained in:
최준흠 2024-09-22 19:04:18 +09:00
parent 5a5bf6802a
commit b3f23cb4ea
15 changed files with 455 additions and 280 deletions

View File

@ -26,13 +26,7 @@ class AccountController extends MVController
$this->class_name = 'Account';
helper($this->class_name);
}
final protected function getMySocket(): CloudflareSocket
{
if ($this->_mySocket === null) {
$this->_mySocket = new CloudflareSocket();
}
return $this->_mySocket;
}
final protected function getModel(): AccountModel
{
if ($this->_model === null) {
@ -53,7 +47,7 @@ class AccountController extends MVController
}
protected function create_process_submit(): AccountEntity
{
$account = new Account($this->getMySocket(), $this->getModel());
$account = new Account();
return $account->create($this->formDatas);
}
public function create(): RedirectResponse

View File

@ -2,24 +2,27 @@
namespace App\Controllers\Cloudflare;
use App\Controllers\MVController;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\RedirectResponse;
use App\Traits\AuthTrait;
use App\Models\Cloudflare\RecordModel;
use App\Models\Cloudflare\AccountModel;
use App\Libraries\MySocket\CloudflareSocket;
use App\Libraries\MyCloudflare\Record;
use App\Models\Cloudflare\ZoneModel;
use App\Models\Cloudflare\AccountModel;
use App\Models\Cloudflare\API\RecordModel;
use App\Entities\Cloudflare\RecordEntity;
use App\Controllers\MVController;
class RecordController extends MVController
{
use AuthTrait;
private $_model = null;
private $_accountModel = null;
private $_zoneModel = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
@ -27,13 +30,6 @@ class RecordController extends MVController
$this->class_name = 'Record';
helper($this->class_name);
}
final protected function getMySocket(): CloudflareSocket
{
if ($this->_mySocket === null) {
$this->_mySocket = new CloudflareSocket();
}
return $this->_mySocket;
}
final protected function getModel(): RecordModel
{
if ($this->_model === null) {
@ -48,6 +44,13 @@ class RecordController extends MVController
}
return $this->_accountModel;
}
final protected function getZoneModel(): ZoneModel
{
if ($this->_zoneModel === null) {
$this->_zoneModel = new ZoneModel();
}
return $this->_zoneModel;
}
protected function create_init(): void
{
$this->fields = ['id', 'apikey'];
@ -61,11 +64,9 @@ class RecordController extends MVController
}
protected function create_process_submit(): RecordEntity
{
$Record = new Record(
$this->getMySocket(),
$this->getModel(),
$this->getAccountModel()->getEntityByPK($this->formDatas['account_uid'])
);
$zone_entity = $this->getZoneModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]);
$account_entity = $this->getAccountModel()->getEntityByPK($zone_entity->getParent());
$Record = new Record($account_entity, $zone_entity);
return $Record->create($this->formDatas);
}
public function create(): RedirectResponse

View File

@ -2,6 +2,7 @@
namespace App\Controllers\Cloudflare;
use App\Controllers\MVController;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface;
@ -13,7 +14,7 @@ use App\Models\Cloudflare\AccountModel;
use App\Libraries\MySocket\CloudflareSocket;
use App\Libraries\MyCloudflare\Zone;
use App\Entities\Cloudflare\ZoneEntity;
use App\Controllers\MVController;
class ZoneController extends MVController
{
@ -27,13 +28,6 @@ class ZoneController extends MVController
$this->class_name = 'Zone';
helper($this->class_name);
}
final protected function getMySocket(): CloudflareSocket
{
if ($this->_mySocket === null) {
$this->_mySocket = new CloudflareSocket();
}
return $this->_mySocket;
}
final protected function getModel(): ZoneModel
{
if ($this->_model === null) {
@ -61,11 +55,8 @@ class ZoneController extends MVController
}
protected function create_process_submit(): ZoneEntity
{
$zone = new Zone(
$this->getMySocket(),
$this->getModel(),
$this->getAccountModel()->getEntityByPK($this->formDatas['account_uid'])
);
$account_entity = $this->getAccountModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]);
$zone = new Zone($account_entity);
return $zone->create($this->formDatas);
}
public function create(): RedirectResponse

View File

@ -2,15 +2,18 @@
namespace App\Controllers\Mangboard;
use App\Controllers\CommonController;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface;
use App\Models\Mangboard\UserModel;
use App\Libraries\MyStorage\MangboardStorage;
use App\Libraries\MySocket\WebSocket;
use App\Libraries\MyCrawler\Yamap;
use App\Libraries\MyCrawler\Yamoon;
use App\Libraries\MyCrawler\Sir;
use App\Libraries\MyCrawler\Inven;
use App\Models\Mangboard\UserModel;
use App\Entities\Mangboard\UserEntity;
use App\Controllers\CommonController;
class CrawlerController extends CommonController
{
@ -59,9 +62,7 @@ class CrawlerController extends CommonController
{
try {
$user_entity = $this->login_process($user_id);
$mySocket = new WebSocket(getenv("yamap.host.url"));
$myStorage = new MangboardStorage($board_name, $user_entity);
$myCrawler = new Yamap($mySocket, $myStorage);
$myCrawler = new Yamap(getenv("yamap.host.url"), $board_name, $user_entity);
//추가옵션
$myCrawler->isDebug = in_array('debug', $params);
$myCrawler->isCopy = in_array('copy', $params);
@ -78,9 +79,7 @@ class CrawlerController extends CommonController
{
try {
$user_entity = $this->login_process($user_id);
$mySocket = new WebSocket(getenv("yamoon.host.url"));
$myStorage = new MangboardStorage($board_name, $user_entity);
$myCrawler = new Yamap($mySocket, $myStorage);
$myCrawler = new Yamoon(getenv("yamoon.host.url"), $board_name, $user_entity);
//추가옵션
$myCrawler->isDebug = in_array('debug', $params);
$myCrawler->isCopy = in_array('copy', $params);
@ -97,9 +96,7 @@ class CrawlerController extends CommonController
{
try {
$user_entity = $this->login_process($user_id);
$mySocket = new WebSocket(getenv("sir.host.url"));
$myStorage = new MangboardStorage($board_name, $user_entity);
$myCrawler = new Yamap($mySocket, $myStorage);
$myCrawler = new Sir(getenv("sir.host.url"), $board_name, $user_entity);
//추가옵션
$myCrawler->isDebug = in_array('debug', $params);
$myCrawler->isCopy = in_array('copy', $params);
@ -118,9 +115,7 @@ class CrawlerController extends CommonController
// exit;
try {
$user_entity = $this->login_process($user_id);
$mySocket = new WebSocket(getenv("inven.host.url"));
$myStorage = new MangboardStorage($board_name, $user_entity);
$myCrawler = new Yamap($mySocket, $myStorage);
$myCrawler = new Inven(getenv("inven.host.url"), $board_name, $user_entity);
//추가옵션
$myCrawler->isDebug = in_array('debug', $params);
$myCrawler->isCopy = in_array('copy', $params);

View File

@ -2,20 +2,22 @@
namespace App\Libraries\MyCloudflare;
use Cloudflare\API\Adapter\Guzzle;
use App\Models\Cloudflare\AccountModel;
use App\Libraries\MyCloudflare\MyCloudflare;
use App\Entities\Cloudflare\AccountEntity;
class Account extends MyCloudflare
{
public function __construct($mySocket, $myStorage)
private $_myStorage = null;
public function __construct()
{
parent::__construct($mySocket, $myStorage);
parent::__construct();
}
final protected function getMyStorage(): AccountModel
{
if ($this->_myStorage === null) {
throw new \Exception("MyStorage가 정의되지 않았습니다.");
$this->_myStorage = new AccountModel();
}
return $this->_myStorage;
}
@ -33,19 +35,36 @@ class Account extends MyCloudflare
// "legacy_flags":{"enterprise_zone_quota":{"maximum":0,"current":0,"available":0}},
// "created_on":"2017-06-26T05:44:49.470184Z"}
// ]
protected function getArrayByResult($result): array
{
$formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()->getTitleField()] = $result->name;
$formDatas['type'] = $result->type;
$formDatas['status'] = 'use';
$formDatas['updated_at'] = $result->created_on;
$formDatas['created_at'] = $result->created_on;
return $formDatas;
}
public function create(array $formDatas): AccountEntity
{
//Socket용
$cf = $this->getMySocket()->getAccount($formDatas['apikey'])->addAccount($formDatas['id']);
$cf = $this->getMySocket()->request($formDatas['apikey'])
->post('accounts', [
'name' => $formDatas[$this->getMyStorage()->getTitleField()],
'type' => $formDatas['type'],
]);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
//Storage용
$formDatas[$this->getMyStorage()->PK()] = $cf->id;
$formDatas[$this->getMyStorage()->getTitleField()] = $cf->name;
$formDatas['type'] = $cf->type;
$formDatas['status'] = 'use';
$formDatas['updated_at'] = $cf->created_on;
$formDatas['created_at'] = $cf->created_on;
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->getMyStorage()->create($formDatas);
log_message("notice", "Account::" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
protected function reload_entity($cf): AccountEntity
{
return $this->getMyStorage()->modify(new AccountEntity, $this->getArrayByResult($cf));
}
}

View File

@ -2,26 +2,66 @@
namespace App\Libraries\MyCloudflare;
use Cloudflare\API\Adapter\Guzzle;
use App\Libraries\MySocket\CloudflareSocket;
use App\Libraries\CommonLibrary;
abstract class MyCloudflare extends CommonLibrary
{
private $_mySocket = null;
protected $_myStorage = null;
protected function __construct($mySocket, $myStorage)
protected function __construct()
{
parent::__construct();
$this->_mySocket = $mySocket;
$this->_myStorage = $myStorage;
}
abstract protected function getArrayByResult($result): array;
abstract protected function reload_entity($cf): mixed;
abstract protected function getMyStorage(): mixed;
//-----------------------필수항목-------------------//
final protected function getMySocket(): CloudflareSocket
{
if ($this->_mySocket === null) {
throw new \Exception("MySocket이 정의되지 않았습니다.");
$this->_mySocket = new CloudflareSocket();
}
return $this->_mySocket;
}
//-----------------------필수항목-------------------//
final protected function reload_entitys(string $parent, array $cfs): array
{
$entity_uids = [];
if (count($cfs)) {
$cnt = 1;
foreach ($cfs as $cf) {
$entity = $this->reload_entity($cf);
$entity_uids[] = $entity->getPK();
log_message("debug", "{$cnt}번째: {$entity->getTitle()} 저장");
$cnt++;
}
//부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용
$this->getMyStorage()->where($this->getMyStorage()::PARENT, $parent);
$this->getMyStorage()->whereNotIn($this->getMyStorage()->getPKField(), $entity_uids);
$this->getMyStorage()->delete();
}
return $entity_uids;
}
final protected function reload_cfs(Guzzle $request, $uri): array
{
$page = 1; //Page는 1부터 시작해야함
$perpage_max = getenv("cfmgr.request.perpage.max");
$cfs = [];
do {
$query = [
'page' => $page,
'per_page' => $perpage_max,
'match' => 'all'
];
$cf = $request->get($uri, $query);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
$cfs = [$cfs, ...$cf->result];
//Loop 제한 : 한페이지에서 가져온 갯수가 perpage_max보다 적다는것은 더이상 다음페이지기 없으므로 0로 종료시키기 위함
$page = count($cf->result) < $perpage_max ? 0 : $page + 1;
} while (0 < $page);
return $cfs;
}
}

View File

@ -1,127 +1,129 @@
<?php
namespace App\Libraries\Cloudflare\API;
namespace App\Libraries\MyCloudflare;
use App\Libraries\Log\Log;
use Cloudflare\API\Adapter\Guzzle;
use App\Models\Cloudflare\API\RecordModel;
use App\Libraries\MyCloudflare\MyCloudflare;
use App\Entities\Cloudflare\ZoneEntity;
use App\Entities\Cloudflare\RecordEntity;
use App\Entities\Cloudflare\AccountEntity;
class Record extends API
class Record extends MyCloudflare
{
private $_endPoint = null;
private $_entity = null;
public function __construct(\App\Entities\Cloudflare\API\ZoneEntity $parent)
{
parent::__construct($parent);
$this->_model = new \App\Models\Cloudflare\API\RecordModel();
}
final protected function setAdapter()
{
if (!is_null($this->_adapter)) {
throw new \Exception("Adapter가 이미 지정되었습니다.");
private $_myStorage = null;
private $_account_entity = null;
private $_zone_entity = null;
public function __construct(AccountEntity $account_entity, ZoneEntity $zone_entity)
{
parent::__construct();
$this->_account_entity = $account_entity;
$this->_zone_entity = $zone_entity;
}
$accountModel = new \App\Models\Cloudflare\API\AccountModel();
$account = $accountModel->getEntity($this->getParent()->getParentFieldData());
$authModel = new \App\Models\Cloudflare\API\AuthModel();
$auth = $authModel->getEntity($account->getParentFieldData());
$apikey = new \Cloudflare\API\Auth\APIKey($auth->getAuthId(), $auth->getAuthKey());
$this->_adapter = new \Cloudflare\API\Adapter\Guzzle($apikey);
// throw new \Exception(var_export($this->_adapter, true));
}
public function getClassName()
{
return 'Record';
}
protected function getEntityByResult(\stdClass $cfResult): \App\Entities\Cloudflare\API\RecordEntity
{
// throw new \Exception(var_export($cfResult, true));
$entity = is_null($this->_entity) ? new \App\Entities\Cloudflare\API\RecordEntity() : $this->_entity;
// throw new \Exception(var_export($cfResult, true));
$entity->uid = $cfResult->id;
$entity->zone_uid = $cfResult->zone_id;
$entity->host = $cfResult->name;
$entity->type = $cfResult->type;
$entity->content = $cfResult->content;
$entity->ttl = (int) $cfResult->ttl;
$entity->proxiable = $cfResult->proxiable ? "on" : "off";
$entity->proxied = $cfResult->proxied ? "on" : "off";
$entity->locked = "on";
if (isset($cfResult->locked) && $cfResult->locked) {
$entity->locked = "off";
final protected function getMyStorage(): RecordModel
{
if ($this->_myStorage === null) {
$this->_myStorage = new RecordModel();
}
return $this->_myStorage;
}
// $entity->updated_at = $cfResult->modified_on;
$entity->created_at = $cfResult->created_on;
// throw new \Exception(var_export($cfResult, true));
return $entity;
}
public function insert(array $fieldDatas): \App\Entities\Cloudflare\API\RecordEntity
{
//TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용
$options = [
'name' => $fieldDatas['host'],
'type' => $fieldDatas['type'],
'content' => $fieldDatas['content'],
'proxied' => isset($fieldDatas['proxied']) && $fieldDatas['proxied'] === 'on' ? true : false
];
// throw new \Exception(var_export($options, true));
$cfResult = $this->getAdapter()->post('zones/' . $this->getParent()->getPrimaryKey() . '/dns_records', $options);
$cfResult = json_decode($cfResult->getBody());
if (!$cfResult->success) {
throw new \Exception(var_export($cfResult, true));
protected function getRequest(): Guzzle
{
return $this->getMySocket()->request($this->_account_entity->getAPIKey());
}
$entity = $this->getEntityByResult($cfResult->result);
Log::add("warning", "Record API: {$entity->getTitle()} " . __FUNCTION__ . " 완료하였습니다.");
return $entity;
}
public function update(\App\Entities\Cloudflare\API\RecordEntity $entity, array $fieldDatas): \App\Entities\Cloudflare\API\RecordEntity
{
//TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용
$options = [
'type' => isset($fieldDatas['type']) ? $fieldDatas['type'] : $entity->type,
'name' => isset($fieldDatas['host']) ? $fieldDatas['host'] : $entity->host,
'content' => isset($fieldDatas['content']) ? $fieldDatas['content'] : $entity->content,
'proxied' => $entity->proxied == 'on' ? true : false,
'ttl' => intval($entity->ttl)
];
//변경작업: 2024-08-09
if (isset($fieldDatas['proxied']) && $fieldDatas['proxied'] === 'on') {
$options['proxied'] = true;
$options['ttl'] = 1;
} elseif (isset($fieldDatas['proxied']) && $fieldDatas['proxied'] === 'off') {
$options['proxied'] = false;
$options['ttl'] = 120;
protected function getArrayByResult($result): array
{
$formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()::PARENT] = $result->zone_id;
$formDatas[$this->getMyStorage()->getTitleField()] = $result->name;
$formDatas['type'] = $result->type;
$formDatas['content'] = $result->content;
$formDatas['ttl'] = (int) $result->ttl;
$formDatas['proxiable'] = $result->proxiable ? "on" : "off";
$formDatas['proxied'] = $result->proxied ? "on" : "off";
$formDatas['locked'] = "on";
if (isset($result->locked) && $result->locked) {
$formDatas['locked'] = "off";
}
// $formDatas['updated_at'] = $cfResult->modified_on;
$formDatas['created_at'] = $result->created_on;
return $formDatas;
}
//dd($options);
// throw new \Exception(var_export($fieldDatas, true) . "<HR>" . var_export($options, true));
$cfResult = $this->getAdapter()->put('zones/' . $this->getParent()->getPrimaryKey() . '/dns_records/' . $entity->getPrimaryKey(), $options);
$cfResult = json_decode($cfResult->getBody());
if (!$cfResult->success) {
throw new \Exception(var_export($cfResult, true));
public function create(array $formDatas): RecordEntity
{
//Socket용
//도메인생성을 위해 Cloudflare에 전송
$cf = $this->getRequest()->post('zones/' . $this->_zone_entity->getPK() . '/dns_records', [
'name' => $formDatas['host'],
'type' => $formDatas['type'],
'content' => $formDatas['content'],
'proxied' => isset($formDatas['proxied']) && $formDatas['proxied'] === 'on' ? true : false
]);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Record:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
//Storage용
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->create($formDatas);
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
Log::add("warning", "Record API: {$entity->getTitle()} " . __FUNCTION__ . " 완료하였습니다.");
return $this->getEntityByResult($cfResult->result);
}
public function delete(\App\Entities\Cloudflare\API\RecordEntity $entity)
{
$cfResult = $this->getAdapter()->delete('zones/' . $this->getParent()->getPrimaryKey() . '/dns_records/' . $entity->getPrimaryKey());
$cfResult = json_decode($cfResult->getBody());
if (!$cfResult->success) {
throw new \Exception(var_export($cfResult, true));
public function update(RecordEntity $entity, array $formDatas): RecordEntity
{
//TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용
$datas = [
'type' => isset($formDatas['type']) ? $formDatas['type'] : $entity->type,
'name' => isset($formDatas['host']) ? $formDatas['host'] : $entity->host,
'content' => isset($formDatas['content']) ? $formDatas['content'] : $entity->content,
'proxied' => $entity->proxied == 'on' ? true : false,
'ttl' => intval($entity->ttl)
];
//변경작업: 2024-08-09
if (isset($formDatas['proxied']) && $formDatas['proxied'] === 'on') {
$datas['proxied'] = true;
$datas['ttl'] = 1;
} elseif (isset($formDatas['proxied']) && $formDatas['proxied'] === 'off') {
$datas['proxied'] = false;
$datas['ttl'] = 120;
}
$cf = $this->getRequest()->put('zones/' . $this->_zone_entity->getPK() . '/dns_records', $datas);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Record:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
Log::add("warning", "Record API: {$entity->getTitle()} " . __FUNCTION__ . " 완료하였습니다.");
}
public function sync(\App\Entities\Cloudflare\API\RecordEntity $entity): \App\Entities\Cloudflare\API\RecordEntity
{
$cfResult = $this->getAdapter()->get('zones/' . $this->getParent()->getPrimaryKey() . '/dns_records/' . $entity->getPrimaryKey());
$cfResult = json_decode($cfResult->getBody());
if (!$cfResult->success) {
throw new \Exception(var_export($cfResult, true));
public function delete(RecordEntity $entity): void
{
$cf = $this->getRequest()->delete('zones/' . $this->_zone_entity->getPK() . '/dns_records/' . $entity->getPK());
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception("Record:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
}
public function sync(RecordEntity $entity): RecordEntity
{
$cf = $this->getRequest()->get('zones/' . $this->_zone_entity->getPK() . '/dns_records/' . $entity->getPK());
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
$formDatas = $this->getArrayByResult($cf->result);
return $this->$this->getMyStorage()->create($formDatas);
}
protected function reload_entity($cf): RecordEntity
{
return $this->getMyStorage()->modify(new RecordEntity, $this->getArrayByResult($cf));
}
public function reload(): void
{
$cfs = $this->reload_cfs($this->getRequest(), 'zones/' . $this->_zone_entity->getPK() . '/dns_records');
log_message("notice", "-----{$this->_zone_entity->getTitle()} 처리[" . count($cfs) . "개] 시작-----");
$entitys = $this->reload_entitys($this->_zone_entity->getPK(), $cfs);
log_message("notice", "-----{$this->_zone_entity->getTitle()} DB 처리[" . count($entitys) . "개] 완료-----");
}
Log::add("warning", "Record API: {$entity->getTitle()} " . __FUNCTION__ . " 완료하였습니다.");
return $this->getEntityByResult($cfResult->result);
}
protected function getCFResults_List(int $page): array
{
$this->_endPoint = is_null($this->_endPoint) ? new \Cloudflare\API\Endpoints\DNS($this->getAdapter()) : $this->_endPoint;
return $this->_endPoint->listRecords($this->getParent()->getPrimaryKey(), '', '', '', $page, CF_ADAPTER_PERPAGE_MAX)->result;
}
}

View File

@ -0,0 +1,127 @@
<?php
namespace App\Libraries\Cloudflare\API;
use App\Libraries\Log\Log;
class Record extends API
{
private $_endPoint = null;
private $_entity = null;
public function __construct(\App\Entities\Cloudflare\API\ZoneEntity $parent)
{
parent::__construct($parent);
$this->_model = new \App\Models\Cloudflare\API\RecordModel();
}
final protected function setAdapter()
{
if (!is_null($this->_adapter)) {
throw new \Exception("Adapter가 이미 지정되었습니다.");
}
$accountModel = new \App\Models\Cloudflare\API\AccountModel();
$account = $accountModel->getEntity($this->getParent()->getParentFieldData());
$authModel = new \App\Models\Cloudflare\API\AuthModel();
$auth = $authModel->getEntity($account->getParentFieldData());
$apikey = new \Cloudflare\API\Auth\APIKey($auth->getAuthId(), $auth->getAuthKey());
$this->_adapter = new \Cloudflare\API\Adapter\Guzzle($apikey);
// throw new \Exception(var_export($this->_adapter, true));
}
public function getClassName()
{
return 'Record';
}
protected function getEntityByResult(\stdClass $cfResult): \App\Entities\Cloudflare\API\RecordEntity
{
// throw new \Exception(var_export($cfResult, true));
$entity = is_null($this->_entity) ? new \App\Entities\Cloudflare\API\RecordEntity() : $this->_entity;
// throw new \Exception(var_export($cfResult, true));
$entity->uid = $cfResult->id;
$entity->zone_uid = $cfResult->zone_id;
$entity->host = $cfResult->name;
$entity->type = $cfResult->type;
$entity->content = $cfResult->content;
$entity->ttl = (int) $cfResult->ttl;
$entity->proxiable = $cfResult->proxiable ? "on" : "off";
$entity->proxied = $cfResult->proxied ? "on" : "off";
$entity->locked = "on";
if (isset($cfResult->locked) && $cfResult->locked) {
$entity->locked = "off";
}
// $entity->updated_at = $cfResult->modified_on;
$entity->created_at = $cfResult->created_on;
// throw new \Exception(var_export($cfResult, true));
return $entity;
}
public function insert(array $fieldDatas): \App\Entities\Cloudflare\API\RecordEntity
{
//TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용
$options = [
'name' => $fieldDatas['host'],
'type' => $fieldDatas['type'],
'content' => $fieldDatas['content'],
'proxied' => isset($fieldDatas['proxied']) && $fieldDatas['proxied'] === 'on' ? true : false
];
// throw new \Exception(var_export($options, true));
$cfResult = $this->getAdapter()->post('zones/' . $this->getParent()->getPrimaryKey() . '/dns_records', $options);
$cfResult = json_decode($cfResult->getBody());
if (!$cfResult->success) {
throw new \Exception(var_export($cfResult, true));
}
$entity = $this->getEntityByResult($cfResult->result);
Log::add("warning", "Record API: {$entity->getTitle()} " . __FUNCTION__ . " 완료하였습니다.");
return $entity;
}
public function update(\App\Entities\Cloudflare\API\RecordEntity $entity, array $fieldDatas): \App\Entities\Cloudflare\API\RecordEntity
{
//TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용
$options = [
'type' => isset($fieldDatas['type']) ? $fieldDatas['type'] : $entity->type,
'name' => isset($fieldDatas['host']) ? $fieldDatas['host'] : $entity->host,
'content' => isset($fieldDatas['content']) ? $fieldDatas['content'] : $entity->content,
'proxied' => $entity->proxied == 'on' ? true : false,
'ttl' => intval($entity->ttl)
];
//변경작업: 2024-08-09
if (isset($fieldDatas['proxied']) && $fieldDatas['proxied'] === 'on') {
$options['proxied'] = true;
$options['ttl'] = 1;
} elseif (isset($fieldDatas['proxied']) && $fieldDatas['proxied'] === 'off') {
$options['proxied'] = false;
$options['ttl'] = 120;
}
//dd($options);
// throw new \Exception(var_export($fieldDatas, true) . "<HR>" . var_export($options, true));
$cfResult = $this->getAdapter()->put('zones/' . $this->getParent()->getPrimaryKey() . '/dns_records/' . $entity->getPrimaryKey(), $options);
$cfResult = json_decode($cfResult->getBody());
if (!$cfResult->success) {
throw new \Exception(var_export($cfResult, true));
}
Log::add("warning", "Record API: {$entity->getTitle()} " . __FUNCTION__ . " 완료하였습니다.");
return $this->getEntityByResult($cfResult->result);
}
public function delete(\App\Entities\Cloudflare\API\RecordEntity $entity)
{
$cfResult = $this->getAdapter()->delete('zones/' . $this->getParent()->getPrimaryKey() . '/dns_records/' . $entity->getPrimaryKey());
$cfResult = json_decode($cfResult->getBody());
if (!$cfResult->success) {
throw new \Exception(var_export($cfResult, true));
}
Log::add("warning", "Record API: {$entity->getTitle()} " . __FUNCTION__ . " 완료하였습니다.");
}
public function sync(\App\Entities\Cloudflare\API\RecordEntity $entity): \App\Entities\Cloudflare\API\RecordEntity
{
$cfResult = $this->getAdapter()->get('zones/' . $this->getParent()->getPrimaryKey() . '/dns_records/' . $entity->getPrimaryKey());
$cfResult = json_decode($cfResult->getBody());
if (!$cfResult->success) {
throw new \Exception(var_export($cfResult, true));
}
Log::add("warning", "Record API: {$entity->getTitle()} " . __FUNCTION__ . " 완료하였습니다.");
return $this->getEntityByResult($cfResult->result);
}
protected function getCFResults_List(int $page): array
{
$this->_endPoint = is_null($this->_endPoint) ? new \Cloudflare\API\Endpoints\DNS($this->getAdapter()) : $this->_endPoint;
return $this->_endPoint->listRecords($this->getParent()->getPrimaryKey(), '', '', '', $page, CF_ADAPTER_PERPAGE_MAX)->result;
}
}

View File

@ -3,63 +3,67 @@
namespace App\Libraries\MyCloudflare;
use App\Models\Cloudflare\ZoneModel;
use App\Models\Cloudflare\AccountModel;
use App\Libraries\MyCloudflare\MyCloudflare;
use App\Entities\Cloudflare\ZoneEntity;
use App\Entities\Cloudflare\AccountEntity;
use Cloudflare\API\Adapter\Guzzle;
class Zone extends MyCloudflare
{
private $_myStorage = null;
private $_account_entity = null;
public function __construct($mySocket, $myStorage, AccountEntity $account_entity)
public function __construct(AccountEntity $account_entity)
{
parent::__construct($mySocket, $myStorage);
parent::__construct();
$this->_account_entity = $account_entity;
}
final protected function getMyStorage(): ZoneModel
{
if ($this->_myStorage === null) {
throw new \Exception("MyStorage가 정의되지 않았습니다.");
$this->_myStorage = new ZoneModel();
}
return $this->_myStorage;
}
private function getArrayByResult($cf): array
protected function getRequest(): Guzzle
{
$formDatas['uid'] = $cf->id;
$formDatas['account_uid'] = $cf->account->id;
$formDatas['domain'] = $cf->name;
$formDatas['status'] = $cf->status;
//$formDatas['type'] = $cf->type; // full 이게있는데 뭔지 잘모름
return $this->getMySocket()->request($this->_account_entity->getAPIKey());
}
protected function getArrayByResult($result): array
{
$formDatas[$this->getMyStorage()->getPKField()] = $result->id;
$formDatas[$this->getMyStorage()::PARENT] = $result->account->id;
$formDatas[$this->getMyStorage()->getTitleField()] = $result->name;
$formDatas['status'] = $result->status;
//$formDatas['type'] = $result->type; // full 이게있는데 뭔지 잘모름
$formDatas['name_servers'] = 'none';
if (isset($cf->name_servers)) {
$formDatas['name_servers'] = is_array($cf->name_servers) ?
if (isset($result->name_servers)) {
$formDatas['name_servers'] = is_array($result->name_servers) ?
implode(
',',
$cf->name_servers
) : $cf->name_servers;
$result->name_servers
) : $result->name_servers;
}
$formDatas['original_name_servers'] = 'none';
if (isset($cf->original_name_servers)) {
$formDatas['original_name_servers'] = is_array($cf->original_name_servers) ?
if (isset($result->original_name_servers)) {
$formDatas['original_name_servers'] = is_array($result->original_name_servers) ?
implode(
',',
$cf->original_name_servers
) : $cf->original_name_servers;
$result->original_name_servers
) : $result->original_name_servers;
}
$formDatas['updated_at'] = $cf->modified_on;
$formDatas['created_at'] = $cf->created_on;
$formDatas['plan'] = $cf->plan->name;
$formDatas['updated_at'] = $result->modified_on;
$formDatas['created_at'] = $result->created_on;
$formDatas['plan'] = $result->plan->name;
return $formDatas;
}
//Cfzone에서 가져온 값을 zone에 setting
final public function getCFSetting(ZoneEntity $entity): ZoneEntity
{
$cf = $this->getMySocket()->getAdapter($this->_account_entity->getAPIKey())
->patch('zones/' . $entity->getPK() . '/settings/');
$cf = $this->getRequest()->patch('zones/' . $entity->getPK() . '/settings/');
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
foreach ($cf->result as $cf) {
switch ($cf->id) {
@ -78,36 +82,28 @@ class Zone extends MyCloudflare
}
final public function setCFSetting(ZoneEntity $entity, string $field, string $value): ZoneEntity
{
$cf = $this->getMySocket()->getAdapter($this->_account_entity->getAPIKEY())
->patch('zones/' . $entity->getPK() . '/settings/' . $field, array('value' => $value));
$cf = $this->getRequest()->patch('zones/' . $entity->getPK() . '/settings/' . $field, array('value' => $value));
$cf = json_decode($cf->getBody());
if (!$cf->success || $cf->result->id !== $field) {
throw new \Exception(__FUNCTION__ . "에서 {$field}->{$value} 변경실패:\n" . var_export($cf, true));
throw new \Exception("Zone:" . __FUNCTION__ . "에서 {$field}->{$value} 변경실패:\n" . var_export($cf, true));
}
//최종 결과값은 body->result->id='필드명',body->result->value='on/off'이런식으로 받음
$entity->$field = $cf->result->value;
return $entity;
}
//Result 형태
public function create(array $formDatas, $jump_start = false): ZoneEntity
{
//Socket용
// $cf = $this->getMySocket()->getZone($this->_account_entity->getAPIKEY())
// ->addZone($formDatas[ZoneModel::TITLE], $jump_start, $this->_account_entity->getPK());
//도메인생성을 위해 Cloudflare에 전송
$options = [
$cf = $this->getRequest()->post('zones/', [
'accountId' => $this->_account_entity->getPK(),
'name' => $formDatas['domain'],
'jump_start' => $jump_start,
];
$cf = $this->getMySocket()->getAdapter($this->_account_entity->getAPIKey())
->post('zones/', $options);
]);
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
//Storage용
$formDatas = $this->getArrayByResult($cf->result);
$entity = $this->$this->getMyStorage()->create($formDatas);
@ -115,44 +111,47 @@ class Zone extends MyCloudflare
$entity = $this->setCFSetting($entity, 'ipv6', 'off');
$entity = $this->setCFSetting($entity, 'development_mode', 'off');
$entity = $this->setCFSetting($entity, 'security_level', 'medium');
log_message("notice", "Zone::" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
public function update(ZoneEntity $entity, array $fieldDatas): ZoneEntity
public function update(ZoneEntity $entity, array $formDatas): ZoneEntity
{
//ipv6 , //development_mode , //security_level
foreach ($fieldDatas as $field => $value) {
foreach ($formDatas as $field => $value) {
$entity = $this->setCFSetting($entity, $field, $value);
}
log_message("notice", "Zone::" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
return $entity;
}
public function delete(ZoneEntity $entity): void
{
$cf = $this->getMySocket()->getAdapter($this->_account_entity->getAPIKey())
->delete('zones/' . $entity->getPK());
$cf = $this->getRequest()->delete('zones/' . $entity->getPK());
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
log_message("notice", "Zone::" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
}
public function sync(ZoneEntity $entity): ZoneEntity
{
$cf = $this->getMySocket()->getAdapter($this->_account_entity->getAPIKey())
->get('zones/' . $entity->getPK());
$cf = $this->getRequest()->get('zones/' . $entity->getPK());
$cf = json_decode($cf->getBody());
if (!$cf->success) {
throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true));
}
log_message("notice", "Zone::" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다.");
$formDatas = $this->getArrayByResult($cf->result);
return $this->$this->getMyStorage()->create($formDatas);
}
// protected function getCFResults_List(int $page): array
// {
// $this->_endPoint = is_null($this->_endPoint) ? new \Cloudflare\API\Endpoints\Zones($this->getAdapter()) : $this->_endPoint;
// return $this->_endPoint->listZones('', '', $page, CF_ADAPTER_PERPAGE_MAX)->result;
// }
public function reload() {}
protected function reload_entity($cf): ZoneEntity
{
return $this->getMyStorage()->modify(new ZoneEntity, $this->getArrayByResult($cf));
}
public function reload(): void
{
$cfs = $this->reload_cfs($this->getRequest(), 'zones');
log_message("notice", "-----{$this->_account_entity->getTitle()} 처리[" . count($cfs) . "개] 시작-----");
$entitys = $this->reload_entitys($this->_account_entity->getPK(), $cfs);
log_message("notice", "-----{$this->_account_entity->getTitle()} DB 처리[" . count($entitys) . "개] 완료-----");
}
}

View File

@ -3,12 +3,13 @@
namespace App\Libraries\MyCrawler;
use Symfony\Component\DomCrawler\Crawler;
use App\Entities\Mangboard\UserEntity;
class Inven extends MyCrawler
{
public function __construct($mySocket, $myStorage)
public function __construct(string $host, string $board_name, UserEntity $user_entity)
{
parent::__construct($mySocket, $myStorage);
parent::__construct($host, $board_name, $user_entity);
}
protected function getUrlByMediaType(Crawler $node, string $media_type, string $attr): null|string
{

View File

@ -2,45 +2,48 @@
namespace App\Libraries\MyCrawler;
use App\Entities\Mangboard\BoardEntity;
use App\Entities\Mangboard\BoardsEntity;
use App\Libraries\CommonLibrary;
use App\Libraries\MySocket\WebSocket;
use App\Libraries\MyStorage\MangboardStorage;
use App\Models\Mangboard\BoardModel;
use App\Models\Mangboard\BoardsModel;
use App\Traits\FileTrait;
use Symfony\Component\DomCrawler\Crawler;
use App\Traits\FileTrait;
use App\Models\Mangboard\BoardsModel;
use App\Models\Mangboard\BoardModel;
use App\Libraries\MyStorage\MangboardStorage;
use App\Libraries\MySocket\WebSocket;
use App\Libraries\CommonLibrary;
use App\Entities\Mangboard\UserEntity;
use App\Entities\Mangboard\BoardsEntity;
use App\Entities\Mangboard\BoardEntity;
abstract class MyCrawler extends CommonLibrary
{
use FileTrait;
private $_host = "";
private $_board_name = "";
private $_user_entity = null;
private $_mySocket = null;
private $_myStorage = null;
private $_board_model = null;
private $_user_model = null;
private $_user_entity = null;
private $_boards_entity = null;
private $_board_name = "";
protected function __construct($mySocket, $myStorage)
protected function __construct(string $host, string $board_name, UserEntity $user_entity)
{
parent::__construct();
$this->_mySocket = $mySocket;
$this->_myStorage = $myStorage;
$this->_host = $host;
$this->_board_name = $board_name;
$this->_user_entity = $user_entity;
}
abstract protected function getDetailSelector(array $listInfo): array;
//-----------------------필수항목-------------------//
final protected function getMySocket(): WebSocket
{
if ($this->_mySocket === null) {
throw new \Exception("MySocket이 정의되지 않았습니다.");
$this->_mySocket = new WebSocket($this->_host);
}
return $this->_mySocket;
}
final protected function getMyStorage(): MangboardStorage
{
if ($this->_myStorage === null) {
throw new \Exception("MyStorage가 정의되지 않았습니다.");
$this->_myStorage = new MangboardStorage($this->_board_name, $this->_user_entity);
}
return $this->_myStorage;
}

View File

@ -2,14 +2,15 @@
namespace App\Libraries\MyCrawler;
use DateTime;
use Symfony\Component\DomCrawler\Crawler;
use DateTime;
use App\Entities\Mangboard\UserEntity;
class Sir extends MyCrawler
{
public function __construct($mySocket, $myStorage)
public function __construct(string $host, string $board_name, UserEntity $user_entity)
{
parent::__construct($mySocket, $myStorage);
parent::__construct($host, $board_name, $user_entity);
}
protected function changeURLByCrawler(string $url): string
{

View File

@ -2,13 +2,14 @@
namespace App\Libraries\MyCrawler;
use App\Entities\Mangboard\UserEntity;
use Symfony\Component\DomCrawler\Crawler;
class Yamap extends MyCrawler
{
public function __construct($mySocket, $myStorage)
public function __construct(string $host, string $board_name, UserEntity $user_entity)
{
parent::__construct($mySocket, $myStorage);
parent::__construct($host, $board_name, $user_entity);
}
protected function getDetailSelector(array $listInfo): array
{

View File

@ -3,12 +3,13 @@
namespace App\Libraries\MyCrawler;
use Symfony\Component\DomCrawler\Crawler;
use App\Entities\Mangboard\UserEntity;
class Yamoon extends MyCrawler
{
public function __construct($mySocket, $myStorage)
public function __construct(string $host, string $board_name, UserEntity $user_entity)
{
parent::__construct($mySocket, $myStorage);
parent::__construct($host, $board_name, $user_entity);
}
//작성내용
// <div class="panel panel-default">

View File

@ -2,14 +2,15 @@
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;
// use App\Entities\Cloudflare\AccountEntity;
// use Cloudflare\API\Endpoints\Zones;
// use Cloudflare\API\Endpoints\DNS;
// use Cloudflare\API\Endpoints\Accounts;
class CloudflareSocket extends CommonLibrary
{
@ -18,7 +19,6 @@ class CloudflareSocket extends CommonLibrary
private static int $_request_timewait = 60;
private $_accountModel = null;
private $_clients = [];
protected $_apikey = "";
public function __construct()
{
parent::__construct();
@ -40,7 +40,7 @@ class CloudflareSocket extends CommonLibrary
);
}
}
public function getAdapter(string $apikey): Guzzle
public function request(string $apikey): Guzzle
{
if (!array_key_exists($apikey, $this->_clients)) {
throw new \Exception(+__FUNCTION__ . " => {$apikey}에 해당하는 Adapter를 찾을수 없습니다.");
@ -54,16 +54,16 @@ class CloudflareSocket extends CommonLibrary
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));
}
// public function getAccount(string $apikey): Accounts
// {
// return new Accounts($this->request($apikey));
// }
// public function getZone(string $apikey): Zones
// {
// return new Zones($this->request($apikey));
// }
// public function getRecord(string $apikey): DNS
// {
// return new DNS($this->request($apikey));
// }
}