作者 赵彬吉

update

... ... @@ -12,6 +12,7 @@ use App\Utils\HttpUtils;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Carbon;
use Symfony\Component\Process\Process;
class DomainInfoLogic extends BaseLogic
{
... ... @@ -226,4 +227,44 @@ class DomainInfoLogic extends BaseLogic
return $this->success();
}
/**
* 验证是否cname或者A记录解析到目标服务器
* @param $domain
* @param $server_info
* @return mixed
* @author zbj
* @date 2023/11/13
*/
public function check_cname($domain, $server_info){
$checkA = false;
$checkCname = false;
$process = new Process(['nslookup', '-qt=a', $domain]);
$process->run();
$output = explode(PHP_EOL, $process->getOutput());
foreach ($output as $line){
if($line){
$checkA = strpos($line, $server_info['host']) !== false;
}
}
if($checkA){
return $domain;
}
//是否cname
$process = new Process(['nslookup', '-qt=cname', $domain]);
$process->run();
$output = explode(PHP_EOL, $process->getOutput());
foreach ($output as $line){
if($line){
$checkCname = (strpos($line, $server_info['init_domain']) !== false);
}
}
if($checkCname){
return $domain;
}
return false;
}
}
... ...
... ... @@ -2,6 +2,8 @@
namespace App\Http\Logic\Aside\Project;
use App\Enums\Common\Code;
use App\Exceptions\AsideGlobalException;
use App\Models\Com\NoticeLog;
use App\Models\Devops\ServerConfig;
use App\Models\Project\ProjectRenew;
... ... @@ -36,6 +38,7 @@ use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Str;
use App\Http\Logic\Aside\Domain\DomainInfoLogic;
/**
* Class ProjectLogic
... ... @@ -130,6 +133,9 @@ class ProjectLogic extends BaseLogic
$this->createSite($this->param);
}
DB::commit();
}catch (AsideGlobalException $e){
DB::rollBack();
$this->fail($e->getMessage());
}catch (\Exception $e){
DB::rollBack();
$this->fail('请填写完整后再提交');
... ... @@ -505,18 +511,24 @@ class ProjectLogic extends BaseLogic
/**
* 创建站点
* @param $param
* @throws AsideGlobalException
* @author Akun
* @date 2023/10/17 10:04
*/
public function createSite($param){
if(isset($param['serve_id']) && $param['serve_id'] && isset($param['deploy_optimize']['domain']) && $param['deploy_optimize']['domain']){
$server_model = new ServerConfig();
$server_info = $server_model->read(['id'=>$param['serve_id']],'init_domain');
$server_info = $server_model->read(['id'=>$param['serve_id']],['init_domain','host']);
$domain_model = new DomainInfo();
$domain_info = $domain_model->read(['id'=>$param['deploy_optimize']['domain']],'domain');
if($server_info && $domain_info){
//验证解析
if (!DomainInfoLogic::instance()->check_cname($domain_info['domain'], $server_info)) {
throw new AsideGlobalException(Code::SYSTEM_ERROR,'域名' . $domain_info['domain'] . '未解析至目标服务器');
}
$api_url = 'http://'.$server_info['init_domain'].'/api/createSite';
$api_param = ['domain'=>$domain_info['domain']];
try {
... ...