|
|
|
<?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', '实际解析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 {
|
|
|
|
$process = new Process(['nslookup', '-qt=a', $value->domain]);
|
|
|
|
$process->run();
|
|
|
|
$output = explode(PHP_EOL, $process->getOutput());
|
|
|
|
$ip = isset($output[4]) ? $output[4] : '';
|
|
|
|
|
|
|
|
$data[] = [
|
|
|
|
$value->project_id,
|
|
|
|
$project_info['company'],
|
|
|
|
$value->domain,
|
|
|
|
$server_ip_info['ip'],
|
|
|
|
$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;
|
|
|
|
}
|
|
|
|
} |
...
|
...
|
|