<?
/*
    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_string2);
                
$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$errstr10);
        return 
$sock;
    }

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

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

        return 
$buffer;
    }

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

?>