|
|
<?php
|
|
|
/**
|
|
|
* Created by PhpStorm.
|
|
|
* User: zhl
|
|
|
* Date: 2022/11/05
|
|
|
* Time: 14:11
|
|
|
*/
|
|
|
namespace App\Console\Commands;
|
|
|
|
|
|
use App\Models\BtEvents;
|
|
|
use App\Repositories\BtRepository;
|
|
|
use App\Repositories\ToolRepository;
|
|
|
use Illuminate\Console\Command;
|
|
|
|
|
|
/**
|
|
|
* Class EventExpend
|
|
|
* @package App\Console\Commands
|
|
|
*/
|
|
|
class EventExpend extends Command
|
|
|
{
|
|
|
/**
|
|
|
* The name and signature of the console command.
|
|
|
*
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $signature = 'event:expend';
|
|
|
|
|
|
/**
|
|
|
* The console command description.
|
|
|
*
|
|
|
* @var string
|
|
|
*/
|
|
|
protected $description = '消费提交事件';
|
|
|
|
|
|
/**
|
|
|
* Create a new command instance.
|
|
|
*
|
|
|
* @return void
|
|
|
*/
|
|
|
public function __construct()
|
|
|
{
|
|
|
parent::__construct();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Execute the console command.
|
|
|
*
|
|
|
* @return bool
|
|
|
*/
|
|
|
public function handle()
|
|
|
{
|
|
|
while (true) {
|
|
|
$start_at = date('Y-m-d H:i:s');
|
|
|
$events = BtEvents::where('status', 0)->where('times', '<', BtEvents::MAX_TRIES_TIMES)->where('start_at', '<', $start_at)->orderBy('id', 'asc')->limit(10)->get();
|
|
|
// 没有需要处理的数据
|
|
|
if ($events->isEmpty()) {
|
|
|
echo $start_at . ', empty event.' . PHP_EOL;
|
|
|
sleep(30);
|
|
|
} else {
|
|
|
$this->expend($events);
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param $data
|
|
|
* @return bool
|
|
|
*/
|
|
|
public function expend($data)
|
|
|
{
|
|
|
foreach ($data as $val) {
|
|
|
$param = json_decode($val->param, true);
|
|
|
switch ($val->type) {
|
|
|
case BtEvents::TYPE_CREATE_SITE:
|
|
|
$result = $this->createSiteEvent($val->id, $param);
|
|
|
break;
|
|
|
case BtEvents::TYPE_DELETE_SITE:
|
|
|
$result = $this->deleteSiteEvent($val->id, $param);
|
|
|
break;
|
|
|
case BtEvents::TYPE_CREATE_SSL:
|
|
|
$result = $this->createSiteSsl($val->id, $param);
|
|
|
break;
|
|
|
case BtEvents::TYPE_RENEWAL_SSL:
|
|
|
$result = $this->renewalSiteSsl($val->id, $param);
|
|
|
break;
|
|
|
case BtEvents::TYPE_EVENT_CALLBACK:
|
|
|
$result = $this->callbackEvent($val->id, $param);
|
|
|
break;
|
|
|
default:
|
|
|
$result = false;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建站点
|
|
|
* @param $id
|
|
|
* @param $param
|
|
|
* @return bool
|
|
|
*/
|
|
|
public function createSiteEvent($id, $param)
|
|
|
{
|
|
|
if (empty($param) || FALSE == is_array($param))
|
|
|
return false;
|
|
|
|
|
|
$callback = $param['callback'] ?? '';
|
|
|
$domain = $param['domain'] ?? '';
|
|
|
$ssl_open = empty($param['ssl_open']) ? 1 : 0;
|
|
|
$ssl_auto = empty($param['ssl_auto']) ? 1 : 0;
|
|
|
$ssl_auto_day = $param['ssl_auto_day'] ?? 10;
|
|
|
$ssl_auto_day = $ssl_auto_day > 15 ? 15 : max($ssl_auto_day, 5);
|
|
|
if (empty($domain) || FALSE == filter_var($domain, FILTER_VALIDATE_URL)) {
|
|
|
if (FALSE == empty($callback) && filter_var($callback, FILTER_VALIDATE_URL)) {
|
|
|
$param['result_message'] = 'domain信息错误';
|
|
|
BtEvents::createBtEvent(BtEvents::TYPE_EVENT_CALLBACK, json_encode($param));
|
|
|
}
|
|
|
return $this->setEvent($id, BtEvents::STATUS_FINISH, 'domain信息错误');
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
$flag = app(BtRepository::class)->createBtSite($domain, $ssl_open, $ssl_auto, $ssl_auto_day);
|
|
|
$status = $flag ? BtEvents::STATUS_FINISH : BtEvents::STATUS_ERROR;
|
|
|
$note = $flag ? '' : '创建站点失败';
|
|
|
} catch (\Exception $e) {
|
|
|
$status = BtEvents::STATUS_ERROR;
|
|
|
$note = $e->getMessage();
|
|
|
}
|
|
|
|
|
|
if (FALSE == empty($callback) && filter_var($callback, FILTER_VALIDATE_URL)) {
|
|
|
$param['result_status'] = $status == BtEvents::STATUS_FINISH ? 200 : 400;
|
|
|
$param['result_message'] = $note;
|
|
|
BtEvents::createBtEvent(BtEvents::TYPE_EVENT_CALLBACK, json_encode($param));
|
|
|
}
|
|
|
|
|
|
return $this->setEvent($id, $status, $note);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 删除站点
|
|
|
* @param $id
|
|
|
* @param $param
|
|
|
* @return bool
|
|
|
*/
|
|
|
public function deleteSiteEvent($id, $param)
|
|
|
{
|
|
|
if (empty($param) || FALSE == is_array($param))
|
|
|
return false;
|
|
|
$callback = $param['callback'] ?? '';
|
|
|
$domain = $param['domain'] ?? '';
|
|
|
if (empty($domain) || FALSE == filter_var($domain, FILTER_VALIDATE_URL)) {
|
|
|
if (FALSE == empty($callback) && filter_var($callback, FILTER_VALIDATE_URL)) {
|
|
|
$param['result_status'] = 400;
|
|
|
$param['result_message'] = 'domain信息错误';
|
|
|
BtEvents::createBtEvent(BtEvents::TYPE_EVENT_CALLBACK, json_encode($param));
|
|
|
}
|
|
|
return $this->setEvent($id, BtEvents::STATUS_FINISH, 'domain信息错误');
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
$flag = app(BtRepository::class)->deleteBtSite($domain);
|
|
|
$status = $flag ? BtEvents::STATUS_FINISH : BtEvents::STATUS_ERROR;
|
|
|
$note = $flag ? '' : '删除站点失败';
|
|
|
} catch (\Exception $e) {
|
|
|
$status = BtEvents::STATUS_ERROR;
|
|
|
$note = $e->getMessage();
|
|
|
}
|
|
|
|
|
|
if (FALSE == empty($callback) && filter_var($callback, FILTER_VALIDATE_URL)) {
|
|
|
$param['result_status'] = $status == BtEvents::STATUS_FINISH ? 200 : 400;
|
|
|
$param['result_message'] = $note;
|
|
|
BtEvents::createBtEvent(BtEvents::TYPE_EVENT_CALLBACK, json_encode($param));
|
|
|
}
|
|
|
|
|
|
return $this->setEvent($id, $status, $note);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建ssl证书
|
|
|
* @param $id
|
|
|
* @param $param
|
|
|
* @return bool
|
|
|
*/
|
|
|
public function createSiteSsl($id, $param)
|
|
|
{
|
|
|
if (empty($param) || FALSE == is_array($param))
|
|
|
return false;
|
|
|
$callback = $param['callback'] ?? '';
|
|
|
$host = $param['host'] ?? '';
|
|
|
if (empty($host)) {
|
|
|
if (FALSE == empty($callback) && filter_var($callback, FILTER_VALIDATE_URL)) {
|
|
|
$param['result_status'] = 400;
|
|
|
$param['result_message'] = 'host信息错误';
|
|
|
BtEvents::createBtEvent(BtEvents::TYPE_EVENT_CALLBACK, json_encode($param));
|
|
|
}
|
|
|
return $this->setEvent($id, BtEvents::STATUS_FINISH, 'host信息错误');
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
$flag = app(BtRepository::class)->applySsl($host);
|
|
|
$status = $flag ? BtEvents::STATUS_FINISH : BtEvents::STATUS_ERROR;
|
|
|
$note = $flag ? '' : '删除站点失败';
|
|
|
} catch (\Exception $e) {
|
|
|
$status = BtEvents::STATUS_ERROR;
|
|
|
$note = $e->getMessage();
|
|
|
}
|
|
|
|
|
|
if (FALSE == empty($callback) && filter_var($callback, FILTER_VALIDATE_URL)) {
|
|
|
$param['result_status'] = $status == BtEvents::STATUS_FINISH ? 200 : 400;
|
|
|
$param['result_message'] = $note;
|
|
|
BtEvents::createBtEvent(BtEvents::TYPE_EVENT_CALLBACK, json_encode($param));
|
|
|
}
|
|
|
|
|
|
return $this->setEvent($id, $status, $note);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 续签证书
|
|
|
* @param $id
|
|
|
* @param $param
|
|
|
* @return bool
|
|
|
*/
|
|
|
public function renewalSiteSsl($id, $param)
|
|
|
{
|
|
|
if (empty($param) || FALSE == is_array($param))
|
|
|
return false;
|
|
|
$callback = $param['callback'] ?? '';
|
|
|
$host = $param['host'] ?? '';
|
|
|
if (empty($host)) {
|
|
|
if (FALSE == empty($callback) && filter_var($callback, FILTER_VALIDATE_URL)) {
|
|
|
$param['result_status'] = 400;
|
|
|
$param['result_message'] = 'host信息错误';
|
|
|
BtEvents::createBtEvent(BtEvents::TYPE_EVENT_CALLBACK, json_encode($param));
|
|
|
}
|
|
|
return $this->setEvent($id, BtEvents::STATUS_FINISH, 'host信息错误');
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
$flag = app(BtRepository::class)->renewalSsl($host);
|
|
|
$status = $flag ? BtEvents::STATUS_FINISH : BtEvents::STATUS_ERROR;
|
|
|
$note = $flag ? '' : '删除站点失败';
|
|
|
} catch (\Exception $e) {
|
|
|
$status = BtEvents::STATUS_ERROR;
|
|
|
$note = $e->getMessage();
|
|
|
}
|
|
|
|
|
|
if (FALSE == empty($callback) && filter_var($callback, FILTER_VALIDATE_URL)) {
|
|
|
$param['result_status'] = $status == BtEvents::STATUS_FINISH ? 200 : 400;
|
|
|
$param['result_message'] = $note;
|
|
|
BtEvents::createBtEvent(BtEvents::TYPE_EVENT_CALLBACK, json_encode($param));
|
|
|
}
|
|
|
|
|
|
return $this->setEvent($id, $status, $note);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 回调信息
|
|
|
* @param $id
|
|
|
* @param $param
|
|
|
* @return bool
|
|
|
*/
|
|
|
public function callbackEvent($id, $param)
|
|
|
{
|
|
|
if (empty($param) || FALSE == is_array($param))
|
|
|
return false;
|
|
|
$callback = $param['callback'] ?? '';
|
|
|
if (empty($callback) || FALSE == filter_var($callback, FILTER_VALIDATE_URL))
|
|
|
return $this->setEvent($id, BtEvents::STATUS_FINISH, 'callback信息错误');
|
|
|
$status = $param['result_status'];
|
|
|
$message = $param['result_message'];
|
|
|
unset($param['result_status']);
|
|
|
unset($param['result_message']);
|
|
|
$array = [
|
|
|
'status' => $status,
|
|
|
'message' => $message,
|
|
|
'data' => [],
|
|
|
'param' => $param
|
|
|
];
|
|
|
list($code, $result) = app(ToolRepository::class)->curlRequest($callback, $array);
|
|
|
$status = $code == 200 ? BtEvents::STATUS_FINISH : BtEvents::STATUS_ERROR;
|
|
|
return $this->setEvent($id, $status, $result);
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 更新任务状态
|
|
|
* @param $id
|
|
|
* @param $status
|
|
|
* @param string $note
|
|
|
* @return bool
|
|
|
*/
|
|
|
public function setEvent($id, $status, $note = '')
|
|
|
{
|
|
|
$event = BtEvents::where(['id' => $id])->first();
|
|
|
if (empty($event))
|
|
|
return false;
|
|
|
|
|
|
$times = $event->times + 1;
|
|
|
|
|
|
if ($status == BtEvents::STATUS_ERROR && $times < BtEvents::MAX_TRIES_TIMES) {
|
|
|
$status = BtEvents::STATUS_INIT;
|
|
|
// 第一次执行失败以后, 5分钟后再执行一次; 第二次执行失败以后, 10分钟后再执行一次 0->5->15
|
|
|
if ($times == 1)
|
|
|
$event->start_at = date('Y-m-d H:i:s', time() + 300);
|
|
|
if ($times == 2)
|
|
|
$event->start_at = date('Y-m-d H:i:s', time() + 600);
|
|
|
}
|
|
|
$event->stauts = $status;
|
|
|
$event->times = $times;
|
|
|
$event->note = $note;
|
|
|
$event->save();
|
|
|
return true;
|
|
|
}
|
|
|
} |
...
|
...
|
|