Rev 5 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | daniel-mar | 1 | #!/usr/bin/perl |
2 | |||
3 | # |
||
11 | daniel-mar | 4 | # VGWhoIs (ViaThinkSoft Global WhoIs, a fork of generic Whois / gwhois) |
5 | daniel-mar | 5 | # Subprogram: 6to4 address decoder |
2 | daniel-mar | 6 | # |
5 | daniel-mar | 7 | # (c) 2012 by Daniel Marschall, ViaThinkSoft <info@daniel-marschall.de> |
2 | daniel-mar | 8 | # |
5 | daniel-mar | 9 | # License: https://www.gnu.org/licenses/gpl-2.0.html (GPL version 2) |
2 | daniel-mar | 10 | # |
11 | |||
12 | # todo: möglichkeit geben, den prefix-check per CLI zu deaktivieren |
||
13 | |||
14 | use warnings; |
||
15 | use strict; |
||
16 | |||
17 | my $prefix_check = 1; |
||
18 | |||
19 | # install with "cpan Net::IP" |
||
20 | use Net::IP qw(ip_expand_address); |
||
21 | |||
22 | sub parse_6to4_ipv6 { |
||
23 | my ($ipv6_addr) = @_; |
||
24 | |||
25 | $ipv6_addr = ip_expand_address($ipv6_addr, 6); |
||
26 | |||
27 | my ($prefix, $client_ipv4, $rest) |
||
28 | = $ipv6_addr =~ /([0-9a-f]{4}):([0-9a-f]{4}:[0-9a-f]{4}):([0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4})/i; |
||
29 | |||
30 | return ($ipv6_addr, "") if !defined $prefix; |
||
31 | return ($ipv6_addr, $prefix) if $prefix_check && ($prefix ne "2002"); |
||
32 | |||
33 | # $client_ipv4 =~ s/://; |
||
34 | $client_ipv4 = hex2ip4($client_ipv4); |
||
35 | |||
36 | return ($ipv6_addr, $prefix, $client_ipv4, $rest); |
||
37 | } |
||
38 | |||
39 | sub print_6to4_info { |
||
40 | my ($ipv6_addr, $prefix, $client_ipv4, $rest) = @_; |
||
41 | |||
42 | if ($prefix_check && ($prefix ne "2002")) { |
||
43 | print STDERR "Invalid 6to4 address $ipv6_addr\n"; |
||
44 | return 1; |
||
45 | } |
||
46 | |||
47 | print "6to4 IPv6 address: ", $ipv6_addr, "\n"; |
||
48 | print "Client public IPv4: ", $client_ipv4, "\n"; |
||
49 | print "Rest address: ", $rest, "\n"; |
||
50 | |||
51 | return 0; |
||
52 | } |
||
53 | |||
54 | sub hex2ip4 { |
||
55 | my ($hex) = @_; |
||
56 | $hex =~ s/[^0-9a-f]//i; |
||
57 | my ($ip4a, $ip4b, $ip4c, $ip4d) = $hex =~ /([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i; |
||
58 | $ip4a = hex($ip4a); |
||
59 | return if !defined $ip4a; |
||
60 | $ip4b = hex($ip4b); |
||
61 | return if !defined $ip4b; |
||
62 | $ip4c = hex($ip4c); |
||
63 | return if !defined $ip4c; |
||
64 | $ip4d = hex($ip4d); |
||
65 | return if !defined $ip4d; |
||
66 | return "$ip4a.$ip4b.$ip4c.$ip4d"; |
||
67 | } |
||
68 | |||
69 | if ($ARGV[0]) { |
||
70 | $_ = join(' ',@ARGV); |
||
71 | } else { |
||
72 | $_ = <>; |
||
73 | chomp; |
||
74 | } |
||
75 | |||
76 | my @info = parse_6to4_ipv6($_); |
||
77 | exit print_6to4_info(@info); |