Rev 2 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5 | daniel-mar | 1 | # |
2 | # VWhois (ViaThinkSoft 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 | |||
2 | daniel-mar | 12 | package GWhoIs::IPv4; |
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 | # %v4pattern = GWhoIs::IPv4::getpatternv4() |
||
21 | sub GWhoIs::IPv4::getpatternv4 { |
||
22 | my (%pattern); |
||
23 | my ($method,$host,$additional,$cline,$line,$rehost,$readditional); |
||
24 | |||
25 | foreach my $patternfile (GWhoIs::Core::getpatternfiles()) { |
||
26 | open(PATTERN,"<$patternfile") || die "Cannot open $patternfile. STOP.\n"; |
||
27 | |||
28 | while ( defined($line = <PATTERN>) ) { |
||
29 | # chomp $line; |
||
30 | $line = GWhoIs::Utils::trim($line); |
||
31 | |||
32 | if ( $line =~ /^#/ ) { # comment |
||
33 | } elsif ( ($cline) = $line =~ /^:(.*)$/ ) { # method declaration |
||
34 | ($method,$host,$additional) = split(/\|/,$cline,3); |
||
35 | $method='' if !defined $method; |
||
36 | $host='' if !defined $host; |
||
37 | $additional='' if !defined $additional; |
||
38 | } elsif (( $line =~ /^=/ ) && ($line !~ /:/)) { # do not read IPv6 lines (containing ':') |
||
39 | ($rehost,$readditional) = GWhoIs::Core::methodpatternregex('',$host,$additional,$line); |
||
40 | |||
41 | # Store the IP inside the CIDR as integer-notation. So, the pattern "001.2.3.4" will be recognized as "1.2.3.4" too. |
||
42 | ($line) = $line =~ /^=(.*)$/; # remove leading "=" |
||
43 | my ($ipv4,$bits) = split(/\//,$line,2); # split into IP address and CIDR |
||
44 | $ipv4 = Net::IP::ip_expand_address($ipv4, 4); # Expand the IP address in case it uses shortened syntax or something |
||
45 | $bits = 32 if ($bits eq ''); # if no CIDR was found, assume it is a single IPv4 address |
||
46 | my ($ipa,$ipb,$ipc,$ipd) = split(/\./,$ipv4,4); |
||
47 | $ipa=0 if (!defined $ipa); |
||
48 | $ipb=0 if (!defined $ipb); |
||
49 | $ipc=0 if (!defined $ipc); |
||
50 | $ipd=0 if (!defined $ipd); |
||
51 | my $ip = $ipa<<24|$ipb<<16|$ipc<<8|$ipd; |
||
52 | |||
53 | my $cidr = "$ip/$bits"; |
||
54 | |||
55 | $pattern{$cidr}{'method'} = $method; |
||
56 | $pattern{$cidr}{'host'} = $rehost; |
||
57 | $pattern{$cidr}{'add'} = $readditional; |
||
58 | } |
||
59 | } |
||
60 | } |
||
61 | return (%pattern); # TODO: might be undefined |
||
62 | } |
||
63 | |||
64 | # ($method, $host, $additional) = GWhoIs::IPv4::getmethodv4($ipa, $ipb, $ipc, $ipd); |
||
65 | sub GWhoIs::IPv4::getmethodv4 { |
||
66 | my ($ipa, $ipb, $ipc, $ipd) = @_; |
||
67 | my ($ip, $bits, $netmask, $method, $host, $additional, %pattern); |
||
68 | |||
69 | $ip = $ipa<<24 | $ipb<<16 | $ipc<<8 | $ipd; |
||
70 | $netmask = 256**4-1; |
||
71 | %pattern = GWhoIs::IPv4::getpatternv4(); |
||
72 | $method = ''; |
||
73 | |||
74 | for ($bits=32; $bits>=0 && $method eq ''; $bits--) { |
||
75 | $ip = $ip & $netmask; |
||
76 | $netmask <<= 1; |
||
77 | |||
78 | my $cidr = "$ip/$bits"; |
||
79 | |||
80 | $method = $pattern{$cidr}{'method'} if defined $pattern{$cidr}{'method'}; |
||
81 | $host = $pattern{$cidr}{'host'} if defined $pattern{$cidr}{'host'}; |
||
82 | $additional = $pattern{$cidr}{'add'} if defined $pattern{$cidr}{'add'}; |
||
83 | } |
||
84 | |||
85 | $host = $GWhoIs::Core::mirror{$method.$host} if defined $GWhoIs::Core::mirror{$method.$host}; |
||
86 | return ($method,$host,$additional); # TODO: might be undefined (+ everywhere else) |
||
87 | } |
||
88 | |||
89 | 1; |
||
90 |