parent
e31fb58c66
commit
1b33333522
1 changed files with 181 additions and 0 deletions
@ -0,0 +1,181 @@ |
||||
#!/usr/bin/perl |
||||
# $Header: /u/cvsroot/env/b/make-srv,v 1.3 2002/10/30 17:26:42 mayoff Exp $ |
||||
|
||||
use strict; |
||||
use Getopt::Long; |
||||
use Pod::Usage; |
||||
|
||||
my $priority = 0; |
||||
my $weight = 0; |
||||
my $service; |
||||
my $port; |
||||
my $target; |
||||
my $help = 0; |
||||
|
||||
my $result = GetOptions( |
||||
'help|?' => \$help, |
||||
'service=s' => \$service, |
||||
'priority=i' => \$priority, |
||||
'weight=i' => \$weight, |
||||
'port=i' => \$port, |
||||
'target=s' => \$target |
||||
) || pod2usage(2); |
||||
|
||||
pod2usage(1) if $help; |
||||
pod2usage(3) if (!defined($service) || !defined($port) || !defined($target)); |
||||
|
||||
my $data = tinydns_escape( |
||||
pack("nnn", $priority, $weight, $port) |
||||
. dotted_sequence_to_label_sequence($target)); |
||||
|
||||
print ":$service:33:$data\n"; |
||||
|
||||
exit 0; |
||||
|
||||
sub tinydns_escape { |
||||
my ($data) = @_; |
||||
|
||||
$data =~ s{[\000-\037:\\\177-\377]}{ |
||||
sprintf("\\%03o", unpack('C', $&)) |
||||
}ge; |
||||
|
||||
return $data; |
||||
} |
||||
|
||||
sub dotted_sequence_to_label_sequence { |
||||
my ($dotted) = @_; |
||||
my @chars = split(//, $dotted); |
||||
my $l = scalar(@chars); |
||||
my $out = ''; |
||||
my $label = ''; |
||||
|
||||
my $i = 0; |
||||
while (1) { |
||||
my $c; |
||||
if ($i < $l) { |
||||
$c = $chars[$i]; |
||||
$i++; |
||||
} |
||||
|
||||
else { |
||||
$c = '.'; |
||||
} |
||||
|
||||
if ($c eq '.') { |
||||
my $ll = length($label); |
||||
if ($ll > 63) { |
||||
die "$dotted contains a label of length $ll, but max length is 63"; |
||||
} |
||||
if ($ll > 0) { |
||||
$out .= pack('C', $ll); |
||||
$out .= $label; |
||||
$label = ''; |
||||
} |
||||
|
||||
last if ($i >= $l); |
||||
|
||||
next; |
||||
} |
||||
|
||||
if ($c eq '\\') { |
||||
if ($i < $l) { |
||||
$c = $chars[$i]; |
||||
$i++; |
||||
if ($c ge '0' && $c le '7') { |
||||
my $o = $c; |
||||
if ($i < $l) { |
||||
$c = $chars[$i]; |
||||
if ($c ge '0' && $c le '7') { |
||||
$i++; |
||||
$o .= $c; |
||||
if ($i < $l) { |
||||
$c = $chars[$i]; |
||||
if ($c ge '0' && $c le '7') { |
||||
$i++; |
||||
$o .= $c; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
$c = pack('C', oct($o)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
$label .= $c; |
||||
} |
||||
|
||||
$out .= "\000"; |
||||
return $out; |
||||
} |
||||
|
||||
__END__ |
||||
|
||||
=head1 NAME |
||||
|
||||
make-srv - Make an SRV record for tinydns |
||||
|
||||
=head1 SYNOPSIS |
||||
|
||||
make-srv -service I<service> -target I<target> -port I<port> [I<options>] |
||||
|
||||
Options: |
||||
|
||||
=over 4 |
||||
|
||||
=item -priority I<priority> |
||||
|
||||
=item -weight I<weight> |
||||
|
||||
=head1 DESCRIPTION |
||||
|
||||
This command prints a DNS SRV record to standard output in |
||||
C<tinydns-data> format. This record is defined by RFC 2052. |
||||
|
||||
The C<-service> flag specifies the domain name for which |
||||
the SRV record is defined. This name should have the format |
||||
I<service>C<.>I<protocol>C<.>I<domain>. For example: |
||||
C<http.tcp.dqd.com>. You must specify the C<-service> flag. |
||||
|
||||
The C<-target> flag specifies the target domain name of the record. The |
||||
I<target> must be a domain name with an associated A record. (This |
||||
command doesn't verify that, but the RFC says it's a requirement.) You |
||||
must specify the C<-target> flag. |
||||
|
||||
The C<-port> flag specifies the port number of the record. You must |
||||
specify the C<-port> flag. |
||||
|
||||
The C<-priority> and C<-weight> flags specify the priority and weight of |
||||
the record. These flags are optional; I<priority> and I<weight> are |
||||
zero by default. |
||||
|
||||
Example: |
||||
|
||||
$ make-srv -service http.tcp.dqd.com -target zot.dqd.com -port 80 |
||||
:http.tcp.dqd.com:33:\000\000\000\000\000P\003zot\003dqd\003com\000 |
||||
|
||||
You may add the I<ttl>, I<timestamp>, and I<lo> fields to the end of the |
||||
line yourself if necessary. For example, |
||||
|
||||
:http.tcp.dqd.com:33:\000\000\000\000\000P\003zot\003dqd\003com\000:::in |
||||
|
||||
is the same SRV record as in the example above, but will be visible only |
||||
to clients in the C<in> location. See the C<tinydns-data> documentation |
||||
for help with these fields. |
||||
|
||||
=head1 LINKS |
||||
|
||||
=over |
||||
|
||||
=item * |
||||
|
||||
RFC 2052: L<http://www.ietf.org/rfc/rfc2052.txt> |
||||
|
||||
=item * |
||||
|
||||
C<tinydns-data> documentation: L<http://cr.yp.to/djbdns/tinydns-data.html> |
||||
|
||||
=back |
||||
|
||||
=cut |
||||
|
Loading…
Reference in new issue