作者 刘锟

合并分支 'akun' 到 'master'

Akun



查看合并请求 !394
@@ -11,7 +11,6 @@ namespace App\Console\Commands\Domain; @@ -11,7 +11,6 @@ namespace App\Console\Commands\Domain;
11 11
12 use Illuminate\Console\Command; 12 use Illuminate\Console\Command;
13 use App\Models\Domain\DomainInfo as DomainInfoModel; 13 use App\Models\Domain\DomainInfo as DomainInfoModel;
14 -use Illuminate\Support\Facades\Log;  
15 14
16 class DomainInfo extends Command 15 class DomainInfo extends Command
17 { 16 {
@@ -36,37 +35,113 @@ class DomainInfo extends Command @@ -36,37 +35,113 @@ class DomainInfo extends Command
36 * @method :post 35 * @method :post
37 * @time :2023/9/11 15:09 36 * @time :2023/9/11 15:09
38 */ 37 */
39 - public function handle(){ 38 + public function handle()
  39 + {
  40 + //更新域名到期时间
  41 + $this->startUpdateDomain();
  42 +
  43 + //主站证书到期更新
  44 + $this->startUpdateCert();
  45 +
  46 + //AMP站证书到期更新
  47 + $this->startUpdateAmpCert();
  48 +
  49 + return true;
  50 + }
  51 +
  52 + /**
  53 + * 更新域名到期时间
  54 + * @author Akun
  55 + * @date 2024/02/26 10:26
  56 + */
  57 + public function startUpdateDomain()
  58 + {
40 $domainModel = new DomainInfoModel(); 59 $domainModel = new DomainInfoModel();
41 - $map = ['status'=>['!=',2]]; 60 + $map = [
  61 + 'status' => ['!=', 2],
  62 + 'domain_end_time' => ['<', date('Y-m-d H:i:s')]
  63 + ];
42 $list = $domainModel->list($map); 64 $list = $domainModel->list($map);
43 - foreach ($list as $v){  
44 - if(empty($v['private_key']) || empty($v['private_cert'])){  
45 - //域名结束时间<2天时,重新生成  
46 - if(!empty($v['certificate_end_time'])){  
47 - 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()))){  
48 - $this->updatePrivate($v);  
49 - }  
50 - }  
51 - }  
52 - $ssl = $this->updateDomainSsl($v['domain']); 65 + foreach ($list as $v) {
53 $time = $this->updateDomain($v['domain']); 66 $time = $this->updateDomain($v['domain']);
54 - if(!empty($time['start']) && !empty($time['end'])){  
55 - $data = [  
56 - 'certificate_start_time'=>$ssl['from'],  
57 - 'certificate_end_time'=>$ssl['to'],  
58 - 'domain_start_time'=>$time['start'],  
59 - 'domain_end_time'=>$time['end']  
60 - ];  
61 - }else{  
62 - $data = [  
63 - 'domain_start_time'=>$time['start'],  
64 - 'domain_end_time'=>$time['end']  
65 - ]; 67 + $data = [
  68 + 'domain_start_time' => $time['start'],
  69 + 'domain_end_time' => $time['end']
  70 + ];
  71 +
  72 + $domainModel->edit($data, ['id' => $v['id']]);
  73 + }
  74 + }
  75 +
  76 + /**
  77 + * 主站证书到期更新
  78 + * @author Akun
  79 + * @date 2024/02/26 10:26
  80 + */
  81 + public function startUpdateCert()
  82 + {
  83 + $domainModel = new DomainInfoModel();
  84 + $end_day = date('Y-m-d H:i:s', time() + 2 * 24 * 3600);//2天后到期
  85 + $map = [
  86 + 'status' => ['!=', 2],
  87 + 'certificate_end_time' => ['<', $end_day]
  88 + ];
  89 + $list = $domainModel->list($map);
  90 + foreach ($list as $v) {
  91 + //更新证书到期时间
  92 + $data = [];
  93 + $ssl = $this->updateDomainSsl($v['domain']);
  94 + $ssl['from'] && $data['certificate_start_time'] = $ssl['from'];
  95 + $ssl['to'] && $data['certificate_end_time'] = $ssl['to'];
  96 +
  97 + $domainModel->edit($data, ['id' => $v['id']]);
  98 +
  99 + if($v['type'] == 1 && ($data['certificate_end_time'] ?? '') < $end_day){
  100 + //申请免费证书
  101 + $this->updatePrivate($v);
  102 + }
  103 + }
  104 + }
  105 +
  106 + /**
  107 + * AMP站证书到期更新
  108 + * @author Akun
  109 + * @date 2024/02/26 10:26
  110 + */
  111 + public function startUpdateAmpCert()
  112 + {
  113 + $domainModel = new DomainInfoModel();
  114 + $end_day = date('Y-m-d H:i:s', time() + 2 * 24 * 3600);//2天后到期
  115 + $map = [
  116 + 'status' => ['!=', 2],
  117 + 'amp_status' => ['=', 1],
  118 + 'amp_certificate_end_time' => ['<', $end_day]
  119 + ];
  120 + $list = $domainModel->list($map);
  121 + foreach ($list as $v) {
  122 + //更新amp站点证书到期时间
  123 + $domain_array = parse_url($v['domain']);
  124 + $host = $domain_array['host'] ?? $domain_array['path'];
  125 + $host_array = explode('.', $host);
  126 + if (count($host_array) <= 2) {
  127 + array_unshift($host_array, 'm');
  128 + } else {
  129 + $host_array[0] = 'm';
  130 + }
  131 + $amp_domain = implode('.', $host_array);
  132 +
  133 + $data = [];
  134 + $ssl = $this->updateDomainSsl($amp_domain);
  135 + $ssl['from'] && $data['amp_certificate_start_time'] = $ssl['from'];
  136 + $ssl['to'] && $data['amp_certificate_start_time'] = $ssl['to'];
  137 +
  138 + $domainModel->edit($data, ['id' => $v['id']]);
  139 +
  140 + if($v['amp_type'] == 1 && ($data['amp_certificate_start_time'] ?? '') < $end_day){
  141 + //申请免费证书
  142 + $this->updateAmpPrivate($v['domain']);
66 } 143 }
67 - $domainModel->edit($data,['id'=>$v['id']]);  
68 } 144 }
69 - return 1;  
70 } 145 }
71 146
72 /** 147 /**
@@ -78,7 +153,7 @@ class DomainInfo extends Command @@ -78,7 +153,7 @@ class DomainInfo extends Command
78 */ 153 */
79 public function updatePrivate($param) 154 public function updatePrivate($param)
80 { 155 {
81 - $url = 'https://' . $param['domain']. '/api/applySsl/'; 156 + $url = 'https://' . $param['domain'] . '/api/applySsl/';
82 $top_domain = $this->getTopDomain($param['domain']); 157 $top_domain = $this->getTopDomain($param['domain']);
83 if ((empty($extend_config) || empty($extend_config[0]['origin'])) && $param['id'] != 3) { 158 if ((empty($extend_config) || empty($extend_config[0]['origin'])) && $param['id'] != 3) {
84 $extend_config = [ 159 $extend_config = [
@@ -89,21 +164,39 @@ class DomainInfo extends Command @@ -89,21 +164,39 @@ class DomainInfo extends Command
89 'project_id' => $param['project_id'], 164 'project_id' => $param['project_id'],
90 'type' => 1, 165 'type' => 1,
91 'route' => 1, 166 'route' => 1,
92 - "domain" =>$param['domain'],  
93 - "rewrite"=> $extend_config ?? [], 167 + "domain" => $param['domain'],
  168 + "rewrite" => $extend_config ?? [],
94 'other_domain' => [$top_domain, '*.' . $top_domain], 169 'other_domain' => [$top_domain, '*.' . $top_domain],
95 'private_key' => '', 170 'private_key' => '',
96 'cert' => '' 171 'cert' => ''
97 ]; 172 ];
98 - $result = $this->curlRequest($url, $param); 173 + return $this->curlRequest($url, $param);
  174 + }
  175 +
  176 + /**
  177 + * 更新证书
  178 + * @param $domain
  179 + * @return array
  180 + * @author Akun
  181 + * @date 2024/02/26 10:25
  182 + */
  183 + public function updateAmpPrivate($domain){
  184 + $url = 'https://' . $domain . '/api/createSiteAmp/';
  185 + $param = [
  186 + "domain" => $domain,
  187 + 'private_key' => '',
  188 + 'cert' => ''
  189 + ];
  190 + return $this->curlRequest($url, $param);
99 } 191 }
100 192
101 - public static function getTopDomain ($url) { 193 + public static function getTopDomain($url)
  194 + {
102 $url = strtolower($url); //首先转成小写 195 $url = strtolower($url); //首先转成小写
103 $url = mb_ereg_replace('^( | )+', '', trim($url)); 196 $url = mb_ereg_replace('^( | )+', '', trim($url));
104 $url = mb_ereg_replace('( | )+$', '', $url); 197 $url = mb_ereg_replace('( | )+$', '', $url);
105 if (!preg_match('/^(http:\/\/|https)/', $url)) { 198 if (!preg_match('/^(http:\/\/|https)/', $url)) {
106 - $url = "https://".$url; 199 + $url = "https://" . $url;
107 } 200 }
108 $hosts = parse_url($url); 201 $hosts = parse_url($url);
109 $host = $hosts['host'] ?? ''; 202 $host = $hosts['host'] ?? '';
@@ -117,10 +210,10 @@ class DomainInfo extends Command @@ -117,10 +210,10 @@ class DomainInfo extends Command
117 $preg = '/[\w].+\.(com|net|org|gov|edu|co|ne)\.[\w]/'; 210 $preg = '/[\w].+\.(com|net|org|gov|edu|co|ne)\.[\w]/';
118 if (($n > 2) && preg_match($preg, $host)) { 211 if (($n > 2) && preg_match($preg, $host)) {
119 //双后缀取后3位 212 //双后缀取后3位
120 - $host = $data[$n - 3].'.'.$data[$n - 2].'.'.$data[$n - 1]; 213 + $host = $data[$n - 3] . '.' . $data[$n - 2] . '.' . $data[$n - 1];
121 } else { 214 } else {
122 //非双后缀取后两位 215 //非双后缀取后两位
123 - $host = $data[$n - 2].'.'.$data[$n - 1]; 216 + $host = $data[$n - 2] . '.' . $data[$n - 1];
124 } 217 }
125 return $host; 218 return $host;
126 } 219 }
@@ -155,7 +248,8 @@ class DomainInfo extends Command @@ -155,7 +248,8 @@ class DomainInfo extends Command
155 * @method :post 248 * @method :post
156 * @time :2023/9/11 15:07 249 * @time :2023/9/11 15:07
157 */ 250 */
158 - public function updateDomainSsl($domain){ 251 + public function updateDomainSsl($domain)
  252 + {
159 try { 253 try {
160 $context = stream_context_create([ 254 $context = stream_context_create([
161 'ssl' => [ 255 'ssl' => [
@@ -163,22 +257,22 @@ class DomainInfo extends Command @@ -163,22 +257,22 @@ class DomainInfo extends Command
163 'capture_peer_cert_chain' => false, 257 'capture_peer_cert_chain' => false,
164 ], 258 ],
165 ]); 259 ]);
166 - $stream = stream_socket_client('ssl://'.$domain.':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);  
167 - if(!$stream) { 260 + $stream = stream_socket_client('ssl://' . $domain . ':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
  261 + if (!$stream) {
168 die("Failed to connect: $errno - $errstr"); 262 die("Failed to connect: $errno - $errstr");
169 } 263 }
170 $remote_cert = stream_context_get_params($stream)['options']['ssl']['peer_certificate']; 264 $remote_cert = stream_context_get_params($stream)['options']['ssl']['peer_certificate'];
171 - if(!$remote_cert) { 265 + if (!$remote_cert) {
172 die("Failed to retrieve certificate"); 266 die("Failed to retrieve certificate");
173 } 267 }
174 $valid_from = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validFrom_time_t']); 268 $valid_from = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validFrom_time_t']);
175 $valid_to = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validTo_time_t']); 269 $valid_to = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validTo_time_t']);
176 fclose($stream); 270 fclose($stream);
177 - }catch (\Exception $e){ 271 + } catch (\Exception $e) {
178 $valid_from = ''; 272 $valid_from = '';
179 $valid_to = ''; 273 $valid_to = '';
180 } 274 }
181 - return ['from'=>$valid_from,'to'=>$valid_to]; 275 + return ['from' => $valid_from, 'to' => $valid_to];
182 } 276 }
183 277
184 /** 278 /**
@@ -188,15 +282,16 @@ class DomainInfo extends Command @@ -188,15 +282,16 @@ class DomainInfo extends Command
188 * @method :post 282 * @method :post
189 * @time :2023/9/11 15:11 283 * @time :2023/9/11 15:11
190 */ 284 */
191 - public function updateDomain($domain){  
192 - $url = 'http://openai.waimaoq.com/v1/whois_api?domain='.$domain; 285 + public function updateDomain($domain)
  286 + {
  287 + $url = 'http://openai.waimaoq.com/v1/whois_api?domain=' . $domain;
193 $response = http_get($url); 288 $response = http_get($url);
194 $start = date('Y-m-d H:i:s'); 289 $start = date('Y-m-d H:i:s');
195 $end = date('Y-m-d H:i:s'); 290 $end = date('Y-m-d H:i:s');
196 - if($response['code'] == 200){ 291 + if ($response['code'] == 200) {
197 $start = $response['text']['creation_date']; 292 $start = $response['text']['creation_date'];
198 $end = $response['text']['expiration_date']; 293 $end = $response['text']['expiration_date'];
199 } 294 }
200 - return ['start'=>$start,'end'=>$end]; 295 + return ['start' => $start, 'end' => $end];
201 } 296 }
202 } 297 }