ProjectDomainCheck.php 3.3 KB
<?php

namespace App\Console\Commands\Domain;

use App\Models\Devops\ServersIp;
use App\Models\Domain\DomainInfo;
use App\Models\Project\Project;
use App\Services\BatchExportService;
use Illuminate\Console\Command;
use Symfony\Component\Process\Process;

class ProjectDomainCheck extends Command
{
    protected $signature = 'project_domain_check';
    protected $description = '筛选域名解析不统一的项目';

    public function handle()
    {
        $map = ['项目id', '名称', '域名', '项目所选IP'];

        //获取所有恢复项目
        $domain_model = new DomainInfo();
        $domain_list = $domain_model->select(['id', 'domain', 'project_id'])->where('status', 1)->where('project_id', '>', 0)->where('id', '>', 3)->get();
        $data = [];
        if ($domain_list->count() > 0) {
            $project_model = new Project();
            $server_ip_model = new ServersIp();

            foreach ($domain_list as $value) {
                $project_info = $project_model->read(['id' => $value->project_id], ['id', 'serve_id', 'company']);
                $server_ip_info = $server_ip_model->read(['id' => $project_info['serve_id']], ['ip', 'domain']);

                if ($this->check_cname($value->domain, $server_ip_info)) {
                    continue;
                } else {
                    $data[] = [
                        $value->project_id,
                        $project_info['company'],
                        $value->domain,
                        $server_ip_info['ip']
                    ];
                }
            }
        }

        //生成文件,发送到客户端
        if ($data) {
            $table = new BatchExportService("域名解析不统一的项目结果导出");
            $file = $table->head($map)->data($data)->save();
            if (!$file) {
                $this->output('文件生成失败,请重试');
            } else {
                $this->output('export success');
            }
        } else {
            $this->output('no data');
        }
    }

    /**
     * 验证是否cname或者A记录解析到目标服务器
     * @param $domain
     * @param $server_info
     * @return mixed
     * @author zbj
     * @date 2023/11/13
     */
    public function check_cname($domain, $server_info)
    {
        $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['ip']) !== 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['domain']) !== false);
                if ($checkCname) {
                    return $domain;
                }
            }
        }
        return false;
    }

    /**
     * 输出处理日志
     * @param $message
     */
    public function output($message)
    {
        echo date('Y-m-d H:i:s') . ' | ' . $message . PHP_EOL;
    }
}