Subversion Repositories vgwhois

Rev

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);