/usr/local/CPAN/Net-Rendezvous/Net/Rendezvous/RR.pm
package Net::Rendezvous::RR;
use Socket;
$VERSION = 0.5;
sub new {
$self = {};
bless $self, shift;
$self->_init(shift) if @_;
return $self;
}
sub _init {
my $self = shift;
$self->{'_ns'} = '224.0.0.251';
$self->{'_port'} = '5353';
$self->{'_ip_type'} = 'A';
$self->fetch(shift);
return;
}
sub fetch {
my $self = shift;
$self->fqdn(shift) if @_;
use Net::DNS;
my $res = new Net::DNS::Resolver( nameservers => [$self->{'_ns'}], port => $self->{'_port'});
my @temp = split(/\./,$self->fqdn);
$self->name($temp[0]);
$self->type($temp[1], $temp[2]);
my $srv = $res->query($self->fqdn, 'SRV');
my @srvd = split(/ /, ($srv->answer)[0]->rdatastr);
$self->priority($srvd[0]);
$self->weight($srvd[1]);
$self->port($srvd[2]);
$srvd[3] =~ s/\.$//;
$self->hostname($srvd[3]);
foreach ( $srv->additional ) {
$self->{'_' . uc($_->type)} = $_->rdatastr;
}
my $txt = $res->query( $self->fqdn, 'TXT');
my $text = ($txt->answer)[0]->rdatastr;
$text =~ s/^\"//; $text =~ s/\"$//;
foreach ( split(/\" \"/,$text) ) {
next if $_ eq '';
my($key,$val) = split(/=/,$_);
$self->attribute($key, $val);
}
$self->text($text);
return;
}
sub attribute {
my $self = {};
my $key = shift;
if ( @_ ) {
$self->{'_attr'}{$key} = shift;
} else {
return $self->{'_attr'}{$key};
}
return;
}
sub type {
my $self = shift;
if ( @_ ) {
my $type = sprintf '%s/%s', shift, shift;
$type =~ s/_//g;
$self->{'_type'} = $type;
}
return $self->{'_type'};
}
sub address {
my $self = shift;
my $key = '_' . $self->{'_ip_type'};
if ( @_ ) {
$self->{$key} = shift;
}
return $self->{$key};
}
sub sockaddr {
my $self = shift;
return sockaddr_in($self->port, inet_aton($self->address));
}
sub AUTOLOAD {
my $self = shift;
my $key = $AUTOLOAD;
$key =~ s/^.*:://;
$key = '_' . $key;
if ( @_ ) {
$self->{$key} = shift;
}
return $self->{$key};
}