mirror of
https://github.com/rekryt/iplist.git
synced 2025-10-12 16:39:35 +03:00
chore: implement the ability to specify DNS servers via their domain name
This commit is contained in:
@@ -5,6 +5,7 @@ namespace OpenCCK\Domain\Helper;
|
|||||||
use Amp\Dns\DnsConfig;
|
use Amp\Dns\DnsConfig;
|
||||||
use Amp\Dns\DnsConfigLoader;
|
use Amp\Dns\DnsConfigLoader;
|
||||||
|
|
||||||
|
use Amp\Dns\DnsException;
|
||||||
use Amp\Dns\DnsRecord;
|
use Amp\Dns\DnsRecord;
|
||||||
use Amp\Dns\DnsResolver;
|
use Amp\Dns\DnsResolver;
|
||||||
use Amp\Dns\HostLoader;
|
use Amp\Dns\HostLoader;
|
||||||
@@ -15,6 +16,7 @@ use Throwable;
|
|||||||
|
|
||||||
use function Amp\delay;
|
use function Amp\delay;
|
||||||
use function Amp\Dns\dnsResolver as dnsResolverFactory;
|
use function Amp\Dns\dnsResolver as dnsResolverFactory;
|
||||||
|
use function Amp\Dns\resolve;
|
||||||
use function OpenCCK\getEnv;
|
use function OpenCCK\getEnv;
|
||||||
|
|
||||||
class DNSHelper {
|
class DNSHelper {
|
||||||
@@ -31,12 +33,37 @@ class DNSHelper {
|
|||||||
/**
|
/**
|
||||||
* @param array $dnsServers
|
* @param array $dnsServers
|
||||||
* @return DnsResolver
|
* @return DnsResolver
|
||||||
|
* @throws DnsException
|
||||||
*/
|
*/
|
||||||
private function getResolver(array $dnsServers): DnsResolver {
|
private function getResolver(array $dnsServers): DnsResolver {
|
||||||
|
$resolvedServers = array_filter(
|
||||||
|
array_map(function (string $server): ?string {
|
||||||
|
if (str_contains($server, ':')) {
|
||||||
|
[$host, $port] = explode(':', $server, 2);
|
||||||
|
} else {
|
||||||
|
$host = $server;
|
||||||
|
$port = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filter_var($host, FILTER_VALIDATE_IP)) {
|
||||||
|
$ip = $host; // если это IP, оставляем как есть
|
||||||
|
} else {
|
||||||
|
$ips = resolve($host);
|
||||||
|
if (empty($ips)) {
|
||||||
|
App::getLogger()->warning("Failed to resolve dns server: {$host}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$ip = $ips[0]->getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $port ? "{$ip}:{$port}" : $ip;
|
||||||
|
}, $dnsServers)
|
||||||
|
);
|
||||||
|
|
||||||
return dnsResolverFactory(
|
return dnsResolverFactory(
|
||||||
new Rfc1035StubDnsResolver(
|
new Rfc1035StubDnsResolver(
|
||||||
null,
|
null,
|
||||||
new class ($dnsServers) implements DnsConfigLoader {
|
new class ($resolvedServers) implements DnsConfigLoader {
|
||||||
public function __construct(private readonly array $dnsServers = []) {
|
public function __construct(private readonly array $dnsServers = []) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user