作者 刘锟

合并分支 'akun' 到 'master'

update



查看合并请求 !763
  1 +<?php
  2 +
  3 +namespace App\Console\Commands\Domain;
  4 +
  5 +use App\Models\Devops\ServersIp;
  6 +use App\Models\Domain\DomainInfo;
  7 +use App\Models\Project\Project;
  8 +use App\Services\BatchExportService;
  9 +use Illuminate\Console\Command;
  10 +use Symfony\Component\Process\Process;
  11 +
  12 +class ProjectDomainCheck extends Command
  13 +{
  14 + protected $signature = 'project_domain_check';
  15 + protected $description = '筛选域名解析不统一的项目';
  16 +
  17 + public function handle()
  18 + {
  19 + $map = ['项目id', '名称', '域名', '项目所选IP', '实际解析IP',];
  20 +
  21 + //获取所有恢复项目
  22 + $domain_model = new DomainInfo();
  23 + $domain_list = $domain_model->select(['id', 'domain', 'project_id'])->where('status', 1)->where('project_id', '>', 0)->where('id', '>', 3)->get();
  24 + $data = [];
  25 + if ($domain_list->count() > 0) {
  26 + $project_model = new Project();
  27 + $server_ip_model = new ServersIp();
  28 +
  29 + foreach ($domain_list as $value) {
  30 + $project_info = $project_model->read(['id' => $value->project_id], ['id', 'serve_id', 'company']);
  31 + $server_ip_info = $server_ip_model->read(['id' => $project_info['serve_id']], ['ip', 'domain']);
  32 +
  33 + if ($this->check_cname($value->domain, $server_ip_info)) {
  34 + continue;
  35 + } else {
  36 + $process = new Process(['nslookup', '-qt=a', $value->domain]);
  37 + $process->run();
  38 + $output = explode(PHP_EOL, $process->getOutput());
  39 + $ip = isset($output[4]) ? $output[4] : '';
  40 +
  41 + $data[] = [
  42 + $value->project_id,
  43 + $project_info['company'],
  44 + $value->domain,
  45 + $server_ip_info['ip'],
  46 + $ip
  47 + ];
  48 + }
  49 + }
  50 + }
  51 +
  52 + //生成文件,发送到客户端
  53 + if ($data) {
  54 + $table = new BatchExportService("域名解析不统一的项目结果导出");
  55 + $file = $table->head($map)->data($data)->save();
  56 + if (!$file) {
  57 + $this->output('文件生成失败,请重试');
  58 + } else {
  59 + $this->output('export success');
  60 + }
  61 + } else {
  62 + $this->output('no data');
  63 + }
  64 + }
  65 +
  66 + /**
  67 + * 验证是否cname或者A记录解析到目标服务器
  68 + * @param $domain
  69 + * @param $server_info
  70 + * @return mixed
  71 + * @author zbj
  72 + * @date 2023/11/13
  73 + */
  74 + public function check_cname($domain, $server_info)
  75 + {
  76 + $process = new Process(['nslookup', '-qt=a', $domain]);
  77 + $process->run();
  78 + $output = explode(PHP_EOL, $process->getOutput());
  79 + foreach ($output as $line) {
  80 + if ($line) {
  81 + $checkA = strpos($line, $server_info['ip']) !== false;
  82 + if ($checkA) {
  83 + return $domain;
  84 + }
  85 + }
  86 + }
  87 +
  88 + //是否cname
  89 + $process = new Process(['nslookup', '-qt=cname', $domain]);
  90 + $process->run();
  91 + $output = explode(PHP_EOL, $process->getOutput());
  92 + foreach ($output as $line) {
  93 + if ($line) {
  94 + $checkCname = (strpos($line, $server_info['domain']) !== false);
  95 + if ($checkCname) {
  96 + return $domain;
  97 + }
  98 + }
  99 + }
  100 + return false;
  101 + }
  102 +
  103 + /**
  104 + * 输出处理日志
  105 + * @param $message
  106 + */
  107 + public function output($message)
  108 + {
  109 + echo date('Y-m-d H:i:s') . ' | ' . $message . PHP_EOL;
  110 + }
  111 +}