|
...
|
...
|
@@ -11,7 +11,6 @@ namespace App\Console\Commands\Domain; |
|
|
|
|
|
|
|
use Illuminate\Console\Command;
|
|
|
|
use App\Models\Domain\DomainInfo as DomainInfoModel;
|
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
|
|
|
|
class DomainInfo extends Command
|
|
|
|
{
|
|
...
|
...
|
@@ -36,37 +35,106 @@ class DomainInfo extends Command |
|
|
|
* @method :post
|
|
|
|
* @time :2023/9/11 15:09
|
|
|
|
*/
|
|
|
|
public function handle(){
|
|
|
|
public function handle()
|
|
|
|
{
|
|
|
|
//更新域名到期时间
|
|
|
|
$this->startUpdateDomain();
|
|
|
|
|
|
|
|
//主站证书到期更新
|
|
|
|
$this->startUpdateCert();
|
|
|
|
|
|
|
|
//AMP站证书到期更新
|
|
|
|
$this->startUpdateAmpCert();
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 更新域名到期时间
|
|
|
|
* @author Akun
|
|
|
|
* @date 2024/02/26 10:26
|
|
|
|
*/
|
|
|
|
public function startUpdateDomain()
|
|
|
|
{
|
|
|
|
$domainModel = new DomainInfoModel();
|
|
|
|
$map = ['status'=>['!=',2]];
|
|
|
|
$list = $domainModel->list($map);
|
|
|
|
foreach ($list as $v){
|
|
|
|
if(empty($v['private_key']) || empty($v['private_cert'])){
|
|
|
|
//域名结束时间<2天时,重新生成
|
|
|
|
if(!empty($v['certificate_end_time'])){
|
|
|
|
if(($v['certificate_end_time'] > date('Y-m-d H:i:s',time() + 24*3600)) || ($v['certificate_end_time'] < date('Y-m-d H:i:s',time()))){
|
|
|
|
$this->updatePrivate($v);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$ssl = $this->updateDomainSsl($v['domain']);
|
|
|
|
$list = $domainModel->where('status', '!=', 2)->where(function ($query) {
|
|
|
|
$query->whereNull('domain_end_time')->orWhere('domain_end_time', '<', date('Y-m-d H:i:s'));
|
|
|
|
})->get()->toArray();
|
|
|
|
foreach ($list as $v) {
|
|
|
|
$time = $this->updateDomain($v['domain']);
|
|
|
|
if(!empty($time['start']) && !empty($time['end'])){
|
|
|
|
$data = [
|
|
|
|
'certificate_start_time'=>$ssl['from'],
|
|
|
|
'certificate_end_time'=>$ssl['to'],
|
|
|
|
'domain_start_time'=>$time['start'],
|
|
|
|
'domain_end_time'=>$time['end']
|
|
|
|
];
|
|
|
|
}else{
|
|
|
|
$data = [
|
|
|
|
'domain_start_time'=>$time['start'],
|
|
|
|
'domain_end_time'=>$time['end']
|
|
|
|
];
|
|
|
|
$data = [
|
|
|
|
'domain_start_time' => $time['start'],
|
|
|
|
'domain_end_time' => $time['end']
|
|
|
|
];
|
|
|
|
|
|
|
|
$domainModel->edit($data, ['id' => $v['id']]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 主站证书到期更新
|
|
|
|
* @author Akun
|
|
|
|
* @date 2024/02/26 10:26
|
|
|
|
*/
|
|
|
|
public function startUpdateCert()
|
|
|
|
{
|
|
|
|
$domainModel = new DomainInfoModel();
|
|
|
|
$end_day = date('Y-m-d H:i:s', time() + 2 * 24 * 3600);//2天后到期
|
|
|
|
$list = $domainModel->where('status', '!=', 2)->where(function ($query) use ($end_day) {
|
|
|
|
$query->whereNull('certificate_end_time')->orWhere('certificate_end_time', '<', $end_day);
|
|
|
|
})->get()->toArray();
|
|
|
|
foreach ($list as $v) {
|
|
|
|
//更新证书到期时间
|
|
|
|
$data = [];
|
|
|
|
$ssl = $this->updateDomainSsl($v['domain']);
|
|
|
|
$ssl['from'] && $data['certificate_start_time'] = $ssl['from'];
|
|
|
|
$ssl['to'] && $data['certificate_end_time'] = $ssl['to'];
|
|
|
|
|
|
|
|
$domainModel->edit($data, ['id' => $v['id']]);
|
|
|
|
|
|
|
|
if ($v['type'] == 1 && ($data['certificate_end_time'] ?? '') < $end_day) {
|
|
|
|
//申请免费证书
|
|
|
|
$this->updatePrivate($v);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* AMP站证书到期更新
|
|
|
|
* @author Akun
|
|
|
|
* @date 2024/02/26 10:26
|
|
|
|
*/
|
|
|
|
public function startUpdateAmpCert()
|
|
|
|
{
|
|
|
|
$domainModel = new DomainInfoModel();
|
|
|
|
$end_day = date('Y-m-d H:i:s', time() + 2 * 24 * 3600);//2天后到期
|
|
|
|
$list = $domainModel->where('status', '!=', 2)->where('amp_status', 1)->where(function ($query) use ($end_day) {
|
|
|
|
$query->whereNull('amp_certificate_end_time')->orWhere('amp_certificate_end_time', '<', $end_day);
|
|
|
|
})->get()->toArray();
|
|
|
|
foreach ($list as $v) {
|
|
|
|
//更新amp站点证书到期时间
|
|
|
|
$domain_array = parse_url($v['domain']);
|
|
|
|
$host = $domain_array['host'] ?? $domain_array['path'];
|
|
|
|
$host_array = explode('.', $host);
|
|
|
|
if (count($host_array) <= 2) {
|
|
|
|
array_unshift($host_array, 'm');
|
|
|
|
} else {
|
|
|
|
$host_array[0] = 'm';
|
|
|
|
}
|
|
|
|
$amp_domain = implode('.', $host_array);
|
|
|
|
|
|
|
|
$data = [];
|
|
|
|
$ssl = $this->updateDomainSsl($amp_domain);
|
|
|
|
$ssl['from'] && $data['amp_certificate_start_time'] = $ssl['from'];
|
|
|
|
$ssl['to'] && $data['amp_certificate_start_time'] = $ssl['to'];
|
|
|
|
|
|
|
|
$domainModel->edit($data, ['id' => $v['id']]);
|
|
|
|
|
|
|
|
if ($v['amp_type'] == 1 && ($data['amp_certificate_start_time'] ?? '') < $end_day) {
|
|
|
|
//申请免费证书
|
|
|
|
$this->updateAmpPrivate($v['domain']);
|
|
|
|
}
|
|
|
|
$domainModel->edit($data,['id'=>$v['id']]);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
...
|
...
|
@@ -78,7 +146,7 @@ class DomainInfo extends Command |
|
|
|
*/
|
|
|
|
public function updatePrivate($param)
|
|
|
|
{
|
|
|
|
$url = 'https://' . $param['domain']. '/api/applySsl/';
|
|
|
|
$url = 'https://' . $param['domain'] . '/api/applySsl/';
|
|
|
|
$top_domain = $this->getTopDomain($param['domain']);
|
|
|
|
if ((empty($extend_config) || empty($extend_config[0]['origin'])) && $param['id'] != 3) {
|
|
|
|
$extend_config = [
|
|
...
|
...
|
@@ -89,21 +157,40 @@ class DomainInfo extends Command |
|
|
|
'project_id' => $param['project_id'],
|
|
|
|
'type' => 1,
|
|
|
|
'route' => 1,
|
|
|
|
"domain" =>$param['domain'],
|
|
|
|
"rewrite"=> $extend_config ?? [],
|
|
|
|
"domain" => $param['domain'],
|
|
|
|
"rewrite" => $extend_config ?? [],
|
|
|
|
'other_domain' => [$top_domain, '*.' . $top_domain],
|
|
|
|
'private_key' => '',
|
|
|
|
'cert' => ''
|
|
|
|
];
|
|
|
|
$result = $this->curlRequest($url, $param);
|
|
|
|
return $this->curlRequest($url, $param);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function getTopDomain ($url) {
|
|
|
|
/**
|
|
|
|
* 更新证书
|
|
|
|
* @param $domain
|
|
|
|
* @return array
|
|
|
|
* @author Akun
|
|
|
|
* @date 2024/02/26 10:25
|
|
|
|
*/
|
|
|
|
public function updateAmpPrivate($domain)
|
|
|
|
{
|
|
|
|
$url = 'https://' . $domain . '/api/createSiteAmp/';
|
|
|
|
$param = [
|
|
|
|
"domain" => $domain,
|
|
|
|
'private_key' => '',
|
|
|
|
'cert' => ''
|
|
|
|
];
|
|
|
|
return $this->curlRequest($url, $param);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function getTopDomain($url)
|
|
|
|
{
|
|
|
|
$url = strtolower($url); //首先转成小写
|
|
|
|
$url = mb_ereg_replace('^( | )+', '', trim($url));
|
|
|
|
$url = mb_ereg_replace('( | )+$', '', $url);
|
|
|
|
if (!preg_match('/^(http:\/\/|https)/', $url)) {
|
|
|
|
$url = "https://".$url;
|
|
|
|
$url = "https://" . $url;
|
|
|
|
}
|
|
|
|
$hosts = parse_url($url);
|
|
|
|
$host = $hosts['host'] ?? '';
|
|
...
|
...
|
@@ -117,10 +204,10 @@ class DomainInfo extends Command |
|
|
|
$preg = '/[\w].+\.(com|net|org|gov|edu|co|ne)\.[\w]/';
|
|
|
|
if (($n > 2) && preg_match($preg, $host)) {
|
|
|
|
//双后缀取后3位
|
|
|
|
$host = $data[$n - 3].'.'.$data[$n - 2].'.'.$data[$n - 1];
|
|
|
|
$host = $data[$n - 3] . '.' . $data[$n - 2] . '.' . $data[$n - 1];
|
|
|
|
} else {
|
|
|
|
//非双后缀取后两位
|
|
|
|
$host = $data[$n - 2].'.'.$data[$n - 1];
|
|
|
|
$host = $data[$n - 2] . '.' . $data[$n - 1];
|
|
|
|
}
|
|
|
|
return $host;
|
|
|
|
}
|
|
...
|
...
|
@@ -155,30 +242,33 @@ class DomainInfo extends Command |
|
|
|
* @method :post
|
|
|
|
* @time :2023/9/11 15:07
|
|
|
|
*/
|
|
|
|
public function updateDomainSsl($domain){
|
|
|
|
public function updateDomainSsl($domain)
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
$context = stream_context_create([
|
|
|
|
'ssl' => [
|
|
|
|
'capture_peer_cert' => true,
|
|
|
|
'capture_peer_cert_chain' => false,
|
|
|
|
'verify_peer' => false,
|
|
|
|
'verify_peer_name' => false
|
|
|
|
],
|
|
|
|
]);
|
|
|
|
$stream = stream_socket_client('ssl://'.$domain.':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
|
|
|
|
if(!$stream) {
|
|
|
|
$stream = stream_socket_client('ssl://' . $domain . ':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
|
|
|
|
if (!$stream) {
|
|
|
|
die("Failed to connect: $errno - $errstr");
|
|
|
|
}
|
|
|
|
$remote_cert = stream_context_get_params($stream)['options']['ssl']['peer_certificate'];
|
|
|
|
if(!$remote_cert) {
|
|
|
|
if (!$remote_cert) {
|
|
|
|
die("Failed to retrieve certificate");
|
|
|
|
}
|
|
|
|
$valid_from = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validFrom_time_t']);
|
|
|
|
$valid_to = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validTo_time_t']);
|
|
|
|
fclose($stream);
|
|
|
|
}catch (\Exception $e){
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
$valid_from = '';
|
|
|
|
$valid_to = '';
|
|
|
|
}
|
|
|
|
return ['from'=>$valid_from,'to'=>$valid_to];
|
|
|
|
return ['from' => $valid_from, 'to' => $valid_to];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
...
|
...
|
@@ -188,15 +278,16 @@ class DomainInfo extends Command |
|
|
|
* @method :post
|
|
|
|
* @time :2023/9/11 15:11
|
|
|
|
*/
|
|
|
|
public function updateDomain($domain){
|
|
|
|
$url = 'http://openai.waimaoq.com/v1/whois_api?domain='.$domain;
|
|
|
|
public function updateDomain($domain)
|
|
|
|
{
|
|
|
|
$url = 'http://openai.waimaoq.com/v1/whois_api?domain=' . $domain;
|
|
|
|
$response = http_get($url);
|
|
|
|
$start = date('Y-m-d H:i:s');
|
|
|
|
$end = date('Y-m-d H:i:s');
|
|
|
|
if($response['code'] == 200){
|
|
|
|
if ($response['code'] == 200) {
|
|
|
|
$start = $response['text']['creation_date'];
|
|
|
|
$end = $response['text']['expiration_date'];
|
|
|
|
}
|
|
|
|
return ['start'=>$start,'end'=>$end];
|
|
|
|
return ['start' => $start, 'end' => $end];
|
|
|
|
}
|
|
|
|
} |
...
|
...
|
|