use
vars
qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)
;
BEGIN {
@ISA
=
qw(Exporter)
;
@EXPORT
=
qw()
;
%EXPORT_TAGS
= (
all
=> [
qw{
plaintodot plaintodotplus
dottodotplus dottoplain
dottoplain16 dotplustodot
dotplustoplain dotplustoplain16
isprivateasn
}
],
);
@EXPORT_OK
=
qw()
;
Exporter::export_ok_tags(
'all'
);
$VERSION
=
'1.08'
;
}
use
constant
AS16_PRIVATE_START
=> 64512;
use
constant
AS32_PRIVATE_START
=> 4200000000;
use
constant
AS32_PRIVATE_END
=> 4294967294;
sub
new {
my
$class
=
shift
;
my
$self
= {};
my
$asn
=
shift
;
my
$asasdot
=
shift
;
bless
$self
,
$class
;
$self
->_parseasn(
$asn
,
$asasdot
);
return
$self
;
}
sub
_parseasn ($;$) {
my
$self
=
shift
;
my
$inasn
=
shift
;
my
$asasdot
=
shift
;
unless
(
$inasn
) {
croak __PACKAGE__,
": ASN not provided"
;
}
unless
(
$inasn
=~m/^[\d\.]+$/) {
croak __PACKAGE__,
": Invalid ASN (Illegal Characters)"
;
}
if
(
$inasn
=~m/^(\d+)$/) {
if
(
$asasdot
) {
if
(
$inasn
>= AS16_START &&
$inasn
<= AS16_END) {
$self
->{_informat} =
'asdot'
;
$self
->{_asdot} =
$inasn
;
}
else
{
croak __PACKAGE__,
": Invalid ASDOT ASN (ASDOT does NOT permit ASPLAIN notation for ASNs 63356-4294967295)"
;
}
}
elsif
(
$inasn
>= AS16_START &&
$inasn
<= AS16_END) {
$self
->{_informat} =
'asplain16'
;
$self
->{_asplain16} =
$inasn
;
}
elsif
(
$inasn
>= AS32_START &&
$inasn
<= AS32_END) {
$self
->{_informat} =
'asplain32'
;
$self
->{_asplain32} =
$inasn
;
}
else
{
croak __PACKAGE__,
": Invalid ASPLAIN ASN (must be between 1-4294967295)"
;
}
}
elsif
(
$inasn
=~m/^(\d+)\.(\d+)$/) {
my
$firstasn
= $1;
my
$secondasn
= $2;
unless
(
(
$firstasn
>= 0 &&
$firstasn
<= AS16_END) &&
(
$secondasn
>= 0 &&
$secondasn
<= AS16_END) &&
(
(
$firstasn
> 0) ||
(
$secondasn
> 0)
)
) {
croak __PACKAGE__,
": Invalid ASDOT(+) ASN (must be between 0-65535.0-65535 and NOT 0.0)"
;
}
if
(
$asasdot
) {
if
(
$firstasn
> 0) {
$self
->{_informat} =
'asdot'
;
}
else
{
croak __PACKAGE__,
": Invalid ASDOT ASN (ASDOT does NOT permit ASDOT+ notation for ASNs 0-65535)"
;
}
}
else
{
$self
->{_informat} =
'asdotplus'
;
}
$self
->{_asdotsedtet1} =
$firstasn
;
$self
->{_asdotsedtet2} =
$secondasn
;
}
else
{
croak __PACKAGE__,
": Invalid ASN (Illegal Format)"
;
}
return
;
}
sub
_plaintodot ($) {
my
$self
=
shift
;
my
$asplain
=
shift
;
unless
(
$asplain
=~m/^(\d+)$/) {
die
(
"Internal Error: _plaintodot called with invalid plain"
);
}
else
{
my
$asdot
=
int
(
$asplain
/65536);
$asdot
.=
"."
;
$asdot
.= (
$asplain
- (
$asdot
*65536));
return
$asdot
;
}
}
sub
_dottoplain ($) {
my
$self
=
shift
;
my
$asdot
=
shift
;
unless
(
$asdot
=~m/^(\d+)\.(\d+)$/) {
die
(
"Internal Error: _dottoplain called with invalid dot"
);
}
else
{
my
$asplain1
= $1;
my
$asplain2
= $2;
my
$asplain
= (65536 *
$asplain1
);
$asplain
+=
$asplain2
;
return
$asplain
;
}
}
sub
toasdot () {
my
$self
=
shift
;
if
(
$self
->{_informat} eq
'asdot'
) {
if
(
$self
->{_asdot}) {
return
$self
->{_asdot};
}
else
{
my
$value
=
"$self->{_asdotsedtet1}.$self->{_asdotsedtet2}"
;
return
(
$value
);
}
}
elsif
(
$self
->{_informat} eq
'asdotplus'
) {
if
(
$self
->{_asdotsedtet1} == 0) {
return
(
$self
->{_asdotsedtet2});
}
else
{
my
$value
=
"$self->{_asdotsedtet1}.$self->{_asdotsedtet2}"
;
return
(
$value
);
}
}
elsif
(
$self
->{_informat} eq
'asplain16'
) {
my
$value
=
$self
->{_asplain16};
return
(
$value
);
}
elsif
(
$self
->{_informat} eq
'asplain32'
) {
my
$value
=
$self
->{_asplain32};
$value
=
$self
->_plaintodot(
$value
);
return
(
$value
);
}
else
{
die
(
"Internal Error: no acceptable informat defined"
);
}
}
sub
toasdotplus () {
my
$self
=
shift
;
if
(
$self
->{_informat} eq
'asdot'
) {
if
(
$self
->{_asdot}) {
my
$value
=
$self
->_plaintodot(
$self
->{_asdot});
return
(
$value
);
}
else
{
my
$value
=
"$self->{_asdotsedtet1}.$self->{_asdotsedtet2}"
;
return
(
$value
);
}
}
elsif
(
$self
->{_informat} eq
'asdotplus'
) {
my
$value
=
"$self->{_asdotsedtet1}.$self->{_asdotsedtet2}"
;
return
(
$value
);
}
elsif
(
$self
->{_informat} eq
'asplain16'
) {
my
$value
=
$self
->{_asplain16};
$value
=
$self
->_plaintodot(
$value
);
return
(
$value
);
}
elsif
(
$self
->{_informat} eq
'asplain32'
) {
my
$value
=
$self
->{_asplain32};
$value
=
$self
->_plaintodot(
$value
);
return
(
$value
);
}
else
{
die
(
"Internal Error: no acceptable informat defined"
);
}
}
sub
toasplain () {
my
$self
=
shift
;
if
(
$self
->{_informat} eq
'asdot'
) {
if
(
$self
->{_asdot}) {
return
(
$self
->{_asdot});
}
else
{
my
$value
=
"$self->{_asdotsedtet1}.$self->{_asdotsedtet2}"
;
$value
=
$self
->_dottoplain(
$value
);
return
(
$value
);
}
}
elsif
(
$self
->{_informat} eq
'asplain16'
) {
my
$value
=
$self
->{_asplain16};
return
(
$value
);
}
elsif
(
$self
->{_informat} eq
'asplain32'
) {
my
$value
=
$self
->{_asplain32};
return
(
$value
);
}
elsif
(
$self
->{_informat} eq
'asdotplus'
) {
my
$value
=
"$self->{_asdotsedtet1}.$self->{_asdotsedtet2}"
;
$value
=
$self
->_dottoplain(
$value
);
return
(
$value
);
}
else
{
die
(
"Internal Error: no acceptable informat defined"
);
}
}
sub
toasplain16 () {
my
$self
=
shift
;
if
(
$self
->{_informat} eq
'asdot'
) {
if
(
$self
->{_asdot}) {
return
(
$self
->{_asdot});
}
else
{
return
(AS_TRANS);
}
}
elsif
(
$self
->{_informat} eq
'asplain16'
) {
my
$value
=
$self
->{_asplain16};
return
(
$value
);
}
elsif
(
$self
->{_informat} eq
'asplain32'
) {
return
(AS_TRANS);
}
elsif
(
$self
->{_informat} eq
'asdotplus'
) {
if
(
$self
->{_asdotsedtet1} == 0) {
return
(
$self
->{_asdotsedtet2});
}
else
{
return
(AS_TRANS);
}
}
else
{
die
(
"Internal Error: no acceptable informat defined"
);
}
}
sub
gettype () {
my
$self
=
shift
;
my
$informat
=
$self
->{_informat};
$informat
=~s/\d+//g;
return
(
$informat
);
}
sub
isprivate {
my
$self
=
shift
;
my
$asn
=
$self
->toasplain;
if
( (
$asn
>= AS16_PRIVATE_START &&
$asn
<= AS16_PRIVATE_END ) ||
(
$asn
>= AS32_PRIVATE_START &&
$asn
<= AS32_PRIVATE_END ) ) {
return
1;
}
return
0;
}
sub
plaintodot ($) {
my
$inasn
=
shift
;
croak __PACKAGE__,
": No ASN specified"
unless
(
$inasn
);
croak __PACKAGE__,
": Must provide ASPLAIN"
unless
(
$inasn
=~m/^(\d+)$/);
my
$asn
= Net::ASN->new(
$inasn
) || croak __PACKAGE__,
": Could not create new Net::ASN object"
;
return
(
$asn
->toasdot);
}
sub
plaintodotplus ($) {
my
$inasn
=
shift
;
croak __PACKAGE__,
": No ASN specified"
unless
(
$inasn
);
croak __PACKAGE__,
": Must provide ASPLAIN"
unless
(
$inasn
=~m/^(\d+)$/);
my
$asn
= Net::ASN->new(
$inasn
) || croak __PACKAGE__,
": Could not create new Net::ASN object"
;
return
(
$asn
->toasdotplus);
}
sub
dottodotplus ($) {
my
$inasn
=
shift
;
croak __PACKAGE__,
": No ASN specified"
unless
(
$inasn
);
my
$asn
= Net::ASN->new(
$inasn
,1) || croak __PACKAGE__,
": Could not create new Net::ASN object"
;
return
(
$asn
->toasdotplus);
}
sub
dottoplain ($) {
my
$inasn
=
shift
;
croak __PACKAGE__,
": No ASN specified"
unless
(
$inasn
);
my
$asn
= Net::ASN->new(
$inasn
,1) || croak __PACKAGE__,
": Could not create new Net::ASN object"
;
return
(
$asn
->toasplain);
}
sub
dottoplain16 ($) {
my
$inasn
=
shift
;
croak __PACKAGE__,
": No ASN specified"
unless
(
$inasn
);
my
$asn
= Net::ASN->new(
$inasn
,1) || croak __PACKAGE__,
": Could not create new Net::ASN object"
;
return
(
$asn
->toasplain16);
}
sub
dotplustodot ($) {
my
$inasn
=
shift
;
croak __PACKAGE__,
": No ASN specified"
unless
(
$inasn
);
croak __PACKAGE__,
": Must provide ASDOT+"
unless
(
$inasn
=~m/\./);
my
$asn
= Net::ASN->new(
$inasn
) || croak __PACKAGE__,
": Could not create new Net::ASN object"
;
return
(
$asn
->toasdot);
}
sub
dotplustoplain ($) {
my
$inasn
=
shift
;
croak __PACKAGE__,
": No ASN specified"
unless
(
$inasn
);
croak __PACKAGE__,
": Must provide ASDOT+"
unless
(
$inasn
=~m/\./);
my
$asn
= Net::ASN->new(
$inasn
) || croak __PACKAGE__,
": Could not create new Net::ASN object"
;
return
(
$asn
->toasplain);
}
sub
dotplustoplain16 ($) {
my
$inasn
=
shift
;
croak __PACKAGE__,
": No ASN specified"
unless
(
$inasn
);
croak __PACKAGE__,
": Must provide ASDOT+"
unless
(
$inasn
=~m/\./);
my
$asn
= Net::ASN->new(
$inasn
) || croak __PACKAGE__,
": Could not create new Net::ASN object"
;
return
(
$asn
->toasplain16);
}
sub
isprivateasn ($) {
my
$inasn
=
shift
;
croak __PACKAGE__,
": No ASN specified"
unless
(
$inasn
);
my
$asn
= Net::ASN->new(
$inasn
) || croak __PACKAGE__,
": Could not create new Net::ASN object"
;
return
(
$asn
->isprivate);
}
1;