<?php
declare(strict_types=1);
use Iodev\Whois\Factory;
$scriptDir = '.';
if (preg_match('~^(.+?)/[^/]+$~ui', $_SERVER['SCRIPT_FILENAME'], $m)) {
$scriptDir = $m[1];
}
include "$scriptDir/../vendor/autoload.php";
function main($argv)
{
$action = trim($argv[1] ?? '');
$args = array_slice($argv, 2);
if (empty($action)) {
$action = 'help';
}
switch (mb_strtolower(ltrim($action, '-'))) {
case 'help':
case 'h':
help();
return;
}
switch ($action) {
case 'lookup':
lookup($args[0]);
break;
case 'info':
$opts = parseOpts(implode(' ', array_slice($args, 1)));
info($args[0], $opts);
break;
default:
echo "Unknown action: {$action}\n";
exit(1);
}
}
function parseOpts(string $str): array
{
$result = [];
$rest = trim($str);
while (preg_match('~--([-_a-z\d]+)(\s+|=)(\'([^\']+)\'|[^-\s]+)~ui', $rest, $m, PREG_OFFSET_CAPTURE)) {
$result[$m[1][0]] = $m[4][0] ?? $m[3][0];
$rest = trim(mb_substr($rest, $m[0][1] + mb_strlen($m[0][0])));
}
return $result;
}
function help()
{
echo implode("\n", [
'Welcome to php-whois CLI',
'',
' Syntax:',
' php-whois {action} [arg1 arg2 ... argN]',
' php-whois help|--help|-h',
' php-whois lookup {domain}',
' php-whois info {domain} [--parser {type}] [--host {whois}]',
'',
' Examples',
' php-whois lookup google.com',
' php-whois info google.com',
' php-whois info google.com --parser block',
' php-whois info ya.ru --host whois.nic.ru --parser auto',
'',
'',
]);
}
function lookup(string $domain)
{
echo implode("\n", [
' action: lookup',
" domain: '{$domain}'",
'',
'',
]);
$whois = Factory::get()->createWhois();
$result = $whois->lookupDomain($domain);
var_dump($result);
}
function info(string $domain, array $options = [])
{
$options = array_replace([
'host' => null,
'parser' => null,
'file' => null,
], $options);
echo implode("\n", [
' action: info',
" domain: '{$domain}'",
sprintf(" options: %s", json_encode($options, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)),
'',
'',
]);
$loader = null;
if ($options['file']) {
$loader = new \Iodev\Whois\Loaders\FakeSocketLoader();
$loader->text = file_get_contents($options['file']);
}
$tld = Factory::get()->createWhois($loader)->getTldModule();
$servers = $tld->matchServers($domain);
if (!empty($options['host'])) {
$host = $options['host'];
$filteredServers = array_filter($servers, function (\Iodev\Whois\Modules\Tld\TldServer $server) use ($host) {
return $server->getHost() == $host;
});
if (count($filteredServers) == 0 && count($servers) > 0) {
$filteredServers = [$servers[0]];
}
$servers = array_map(function (\Iodev\Whois\Modules\Tld\TldServer $server) use ($host) {
return new \Iodev\Whois\Modules\Tld\TldServer(
$server->getZone(),
$host,
$server->isCentralized(),
$server->getParser(),
$server->getQueryFormat()
);
}, $filteredServers);
}
if (!empty($options['parser'])) {
try {
$parser = Factory::get()->createTldParser($options['parser']);
} catch (\Throwable $e) {
echo "\nCannot create TLD parser with type '{$options['parser']}'\n\n";
throw $e;
}
$servers = array_map(function (\Iodev\Whois\Modules\Tld\TldServer $server) use ($parser) {
return new \Iodev\Whois\Modules\Tld\TldServer(
$server->getZone(),
$server->getHost(),
$server->isCentralized(),
$parser,
$server->getQueryFormat()
);
}, $servers);
}
[, $info] = $tld->loadDomainData($domain, $servers);
var_dump($info);
}
main($argv);
|