<?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); 
 
 
 
 |