作者 刘锟

合并分支 'akun' 到 'master'

Akun



查看合并请求 !394
... ... @@ -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,113 @@ 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]];
$map = [
'status' => ['!=', 2],
'domain_end_time' => ['<', date('Y-m-d H:i:s')]
];
$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']);
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天后到期
$map = [
'status' => ['!=', 2],
'certificate_end_time' => ['<', $end_day]
];
$list = $domainModel->list($map);
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天后到期
$map = [
'status' => ['!=', 2],
'amp_status' => ['=', 1],
'amp_certificate_end_time' => ['<', $end_day]
];
$list = $domainModel->list($map);
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 +153,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 +164,39 @@ 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);
}
/**
* 更新证书
* @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) {
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 +210,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,7 +248,8 @@ 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' => [
... ... @@ -163,22 +257,22 @@ class DomainInfo extends Command
'capture_peer_cert_chain' => 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 +282,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];
}
}
... ...