Subversion Repositories vgwhois

Rev

Blame | Last modification | View Log | RSS feed

  1. #
  2. #  VGWhoIs (ViaThinkSoft Global WhoIs, a fork of generic Whois / gwhois)
  3. #  Main program
  4. #
  5. #  (c) 2010-2019 by Daniel Marschall, ViaThinkSoft <info@daniel-marschall.de>
  6. #  based on the code (c) 1998-2010 by Juliane Holzt <debian@kju.de>
  7. #  Some early parts by Lutz Donnerhacke <Lutz.Donnerhacke@Jena.Thur.de>
  8. #
  9. #  License: https://www.gnu.org/licenses/gpl-2.0.html (GPL version 2)
  10. #
  11.  
  12. package VGWhoIs::IPv6;
  13.  
  14. use warnings;
  15. use strict;
  16.  
  17. # install with "cpan Net::IP" or "aptitude install libnet-ip-perl"
  18. use Net::IP;
  19.  
  20. # at Debian: install with "aptitude install libmath-bigint-gmp-perl"
  21. use Math::BigInt;
  22.  
  23. # %v6pattern = VGWhoIs::IPv6::getpatternv6()
  24. sub VGWhoIs::IPv6::getpatternv6 {
  25.         my (%pattern);
  26.         my ($method,$host,$additional,$cline,$line,$rehost,$readditional);
  27.  
  28.         foreach my $patternfile (VGWhoIs::Core::getpatternfiles()) {
  29.                 open(PATTERN,"<$patternfile") || die "Cannot open $patternfile. STOP.\n";
  30.  
  31.                 while ( defined($line = <PATTERN>) ) {
  32.                         # chomp $line;
  33.                         $line = VGWhoIs::Utils::trim($line);
  34.  
  35.                         if ( $line =~ /^#/ ) {                       # comment
  36.                         } elsif ( ($cline) = $line =~ /^:(.*)$/ ) {  # method declaration
  37.                                 ($method,$host,$additional) = split(/\|/,$cline,3);
  38.                                 $method=''     if !defined $method;
  39.                                 $host=''       if !defined $host;
  40.                                 $additional='' if !defined $additional;
  41.                         } elsif (( $line =~ /^=/ ) && ($line =~ /:/)) { # do not read IPv4 lines (not containing ':')
  42.                                 ($rehost,$readditional) = VGWhoIs::Core::methodpatternregex('',$host,$additional,$line);
  43.  
  44.                                 # Store the IP inside the CIDR as integer-notation.
  45.                                 ($line) = $line =~ /^=(.*)$/;           # remove leading "="
  46.                                 my ($ipv6,$bits) = split(/\//,$line,2); # split into IP address and CIDR
  47.                                 $ipv6 = Net::IP::ip_expand_address($ipv6, 6);    # Expand the IP address in case it uses nested syntax or something
  48.                                 $bits = 128 if ($bits eq '');           # if no CIDR was found, assume it is a single IPv6 address
  49.                                 my ($ipa,$ipb,$ipc,$ipd,$ipe,$ipf,$ipg,$iph) = split(/:/,$ipv6,8);
  50.                                 $ipa = defined $ipa ? Math::BigInt->new(hex($ipa)) : 0;
  51.                                 $ipb = defined $ipb ? Math::BigInt->new(hex($ipb)) : 0;
  52.                                 $ipc = defined $ipc ? Math::BigInt->new(hex($ipc)) : 0;
  53.                                 $ipd = defined $ipd ? Math::BigInt->new(hex($ipd)) : 0;
  54.                                 $ipe = defined $ipe ? Math::BigInt->new(hex($ipe)) : 0;
  55.                                 $ipf = defined $ipf ? Math::BigInt->new(hex($ipf)) : 0;
  56.                                 $ipg = defined $ipg ? Math::BigInt->new(hex($ipg)) : 0;
  57.                                 $iph = defined $iph ? Math::BigInt->new(hex($iph)) : 0;
  58.                                 my $ip = $ipa<<112|$ipb<<96|$ipc<<80|$ipd<<64|$ipe<<48|$ipf<<32|$ipg<<16|$iph;
  59.  
  60.                                 my $cidr = "$ip/$bits";
  61.  
  62.                                 $pattern{$cidr}{'method'} = $method;
  63.                                 $pattern{$cidr}{'host'}   = $rehost;
  64.                                 $pattern{$cidr}{'add'}    = $readditional;
  65.                         }
  66.                 }
  67.         }
  68.         return (%pattern);
  69. }
  70.  
  71.  
  72. # ($method, $host, $additional) = VGWhoIs::IPv6::getmethodv6($ipv6);
  73. sub VGWhoIs::IPv6::getmethodv6 {
  74.         my ($ipv6) = @_;
  75.         $ipv6 = Net::IP::ip_expand_address($ipv6, 6);
  76.         my ($ipa,$ipb,$ipc,$ipd,$ipe,$ipf,$ipg,$iph) = split(/:/,$ipv6,8);
  77.  
  78.         $ipa = defined $ipa ? Math::BigInt->new(hex($ipa)) : 0;
  79.         $ipb = defined $ipb ? Math::BigInt->new(hex($ipb)) : 0;
  80.         $ipc = defined $ipc ? Math::BigInt->new(hex($ipc)) : 0;
  81.         $ipd = defined $ipd ? Math::BigInt->new(hex($ipd)) : 0;
  82.         $ipe = defined $ipe ? Math::BigInt->new(hex($ipe)) : 0;
  83.         $ipf = defined $ipf ? Math::BigInt->new(hex($ipf)) : 0;
  84.         $ipg = defined $ipg ? Math::BigInt->new(hex($ipg)) : 0;
  85.         $iph = defined $iph ? Math::BigInt->new(hex($iph)) : 0;
  86.  
  87.         my ($ip, $bits, $netmask, $method, $host, $additional, %pattern);
  88.  
  89.         $ip      = $ipa<<112|$ipb<<96|$ipc<<80|$ipd<<64|$ipe<<48|$ipf<<32|$ipg<<16|$iph;
  90.         $netmask = Math::BigInt->new(65536)**8-1;
  91.         %pattern = VGWhoIs::IPv6::getpatternv6();
  92.         $method  = '';
  93.  
  94.         for ($bits=128; $bits>=0 && $method eq ''; $bits--) {
  95.                 $ip        = $ip & $netmask;
  96.                 $netmask <<= 1;
  97.  
  98.                 my $cidr = "$ip/$bits";
  99.  
  100.                 $method     = $pattern{$cidr}{'method'} if defined $pattern{$cidr}{'method'};
  101.                 $host       = $pattern{$cidr}{'host'}   if defined $pattern{$cidr}{'host'};
  102.                 $additional = $pattern{$cidr}{'add'}    if defined $pattern{$cidr}{'add'};
  103.         }
  104.  
  105.         $host = $VGWhoIs::Core::mirror{$method.$host} if defined $VGWhoIs::Core::mirror{$method.$host};
  106.         return ($method,$host,$additional);
  107. }
  108.  
  109. 1;
  110.  
  111.