<?
/*
    The component of HSDN Network Operations Center
    Copyright (C) 2005-2013 Information Networks Ltd.
    All Rights Reserved.
*/
class whois_as
{
    static 
$arin_server = 'whois.arin.net';
    static 
$referral_print = false;
    static 
$return = array();
    static 
$asn = '';

    static 
$extra_arguments = array
    (
        
'whois.arin.net' => array('a ', ''),
        
'whois.ripe.net' => array('-BC AS', ''),
        
'whois.nic.ad.jp' => array('AS ', ''),
    );

    static function 
whois($asn)
    {
        
self::$asn = $asn;

        
$server = self::$arin_server;
        
$buffer = self::whois_request(self::$asn, $server);
        
self::$return[$server] = $buffer;

        return 
self::$return;
    }

    static function 
whois_request($asn, $whois_server, $whois_port = 43)
    {
        if (!
$whois_server) return false;

        if (isset(
self::$extra_arguments[$whois_server]) && $arguments = self::$extra_arguments[$whois_server])
        {
            
$asn = $arguments[0].$asn.$arguments[1];
        }
        else
        {
            
$asn = 'AS'.$asn;
        }

        if (!
$sock = self::connect_socket(gethostbyname($whois_server), $whois_port))
        {
            
self::print_out('<p>Ошибка соединения с '.$whois_server.' для '.$asn."!</p>\n");
            return 
false;
        }
        
self::sendto_socket($sock, $asn);
        
$buffer = self::read_socket($sock);

        if (
$whois_server == 'whois.ripe.net')
        {
            
$buffer = preg_replace("|^(.*db-terms-conditions.pdf).*(% Information related to 'AS[\d]+'+)|isU", "\\1\n\n\\2", $buffer);
        }

        if (!
self::find_referral_server($buffer, $server, $port) || self::$referral_print)
        {
            
self::print_out('<p>Whois по данным сервера '.$whois_server.' для '.$asn.":</p>\n");
            
self::print_out('<div class="block-text">'.display::block_prepare($buffer)."</div>\n");
        }

        
self::$return[$server] = self::whois_request(self::$asn, $server, $port);

        return 
$buffer;
    }

    static function 
find_referral_server($buffer, &$server, &$port)
    {
        
$server_string = '';
        
$pharse_string = split("\n", $buffer);

        for (
$i = 0; $i < count($pharse_string); $i++) 
        {
            if (
eregi("^ReferralServer\:", $pharse_string[$i]))
            {
                
$server_string = preg_replace("/^ReferralServer\: (.+)$/is", "\\1", trim(rtrim($pharse_string[$i])));
            }

            if (
eregi("whois -h whois.nic.ad.jp", $pharse_string[$i]))
            {
                
$server_string = 'whois://whois.nic.ad.jp:43';
            }

            if (
eregi("Please see http://www.afrinic.net/ for further details", $pharse_string[$i]))
            {
                
$server_string = 'whois://whois.afrinic.net:43';
            }
        }

        if (
$parse_server = parse_url($server_string))    
        {
            if (isset(
$parse_server['host']))
            {
                
$server = trim($parse_server['host']);
            }
            elseif (
strpos($server_string, '//') !== FALSE)
            {
                
$server = explode('//', $server_string, 2);
                
$server = end($server);
            }
            
$port = isset($parse_server['port']) ? trim($parse_server['port']) : 43;
        }
        return 
$server;
    }

    static function 
connect_socket($server, $port = 43)
    {
        
$sock = @fsockopen($server, $port, $errnum, $errstr, 10);
        return 
$sock;
    }

    static function 
sendto_socket($sock, $request)
    {
        
fputs($sock, $request."\r\n");
    }

    static function 
read_socket($sock)
    {
        
$buffer = '';
        while (!
feof($sock)) 
        {
            
$buffer .= fgets($sock, 128);
        }
        
fclose($sock);

        return 
$buffer;
    }

    static function 
print_out($string)
    {
        print 
$string;
        
flush();
    }
}

?>