*BSD News Article 37197


Return to BSD News archive

Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!bunyip.cc.uq.oz.au!munnari.oz.au!spool.mu.edu!howland.reston.ans.net!cs.utexas.edu!uunet!zib-berlin.de!irz401!uriah.sax.de!not-for-mail
From: j@uriah.sax.de (J Wunsch)
Newsgroups: comp.os.386bsd.questions
Subject: Re: How to convert /etc/hosts to /etc/named.db
Date: 26 Oct 1994 14:37:00 +0100
Organization: Private U**X site; member IN e.V.
Lines: 116
Message-ID: <38lm1sINN117@bonnie.sax.de>
References: <CxHyLr.BIH@un.seqeb.gov.au>
NNTP-Posting-Host: bonnie.sax.de

pc012@un.seqeb.gov.au (Patrick Collins) writes:

>I want to configure a FreeBSD system as a domain name server. Is there an 
>easy way to convert a large /etc/hosts file to the format required for
>/etc/named.db automatically or do we just use one of the text processing 
>tools. Does anyone have any scripts written ?

The O'Reilly book says there is one, but i forgot where to find it.
Anyway, 'tis a nice homework for ``How do i use perl'':-) The script
is assuming that you're running it on the machine that is intended to
become the name server. It writes two files, one for the domain
resolution, one for the reverse lookup.  Of course, no kind of
warranty etc. blahblah:

#!/usr/bin/perl

open(H, "/etc/hosts") || die "Cannot read /etc/hosts\n";

open(F1, ">hosts.db") || die "Cannot create hosts.db\n";
open(F2, ">rev.db") || die "Cannot create rev.db\n";

$hostname = `hostname`; ## should be FQDN
chop $hostname;
$domain = $hostname;
$domain =~ s/^[^.]*\.//;
$user = getlogin;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

$serial = sprintf("%02d%02d%02d01", $year, $mon+1, $mday);

($name,$aliases,$addrtype,$length,@addrs) = gethostbyname($hostname);
($q1,$q2,$q3,$q4) = unpack("CCCC", $addrs[0]);

if($hostname !~ /\./) {
    print STDERR
	"Your hostname doesn't appear to be an FQDN, enter domain: ";
    $domain = <>;
    chop $domain;
    $hostname = "$hostname.$domain";
}

print F1 <<"EOF";
;
\$ORIGIN $domain.\tIN\tSOA\t$hostname $user.$hostname (
\t\t\t\t$serial ; serial
\t\t\t\t   3600 ; refresh (once an hour)
\t\t\t\t    600 ; retry (after 10 minutes)
\t\t\t\t1209600 ; expire (after 14 days w/o update)
\t\t\t\t  86400); minimum (default time-to-live 1 day)
;
\t\t\tIN\tNS\t$hostname.
*\t\t\tIN\tMX\t10\tmail.$domain.
;
EOF

print F2 <<"EOF";
;
\$ORIGIN $q3.$q2.$q1.IN-ADDR.ARPA.\tIN\tSOA\t$hostname $user.$hostname (
\t\t\t\t$serial ; serial
\t\t\t\t   3600 ; refresh (once an hour)
\t\t\t\t    600 ; retry (after 10 minutes)
\t\t\t\t1209600 ; expire (after 14 days w/o update)
\t\t\t\t  86400); minimum (default time-to-live 1 day)
;
\t\t\tIN\tNS\t$hostname.
;
EOF

while(<H>) {
    next if /^[ \t]*#/;
    ($addr, $primary, @aliases) = split;
    if($primary =~ /\./) {
	# name containing dots
	($nm,$dom) = split(/\./, $primary, 2);
	if($dom ne $domain) {
	    print STDERR "Warning: $primary is outside your domain\n";
	    if(!$warned) {
		print STDERR "(and hence probably outside your zone of " .
		    "authority)\n";
		$warned = 1;
	    }
	}
	$primary .= '.';
    }
    &justify($primary);
    print F1 "IN\tA\t$addr\n";
    # introduce a primary mail exchanger
    print F1 "\t\t\tIN\tMX\t10\tmail.$domain.\n";
    print F1 "\t\t\tIN\tHINFO\tCPU\tOS\n;\n";
    foreach $alias (@aliases) {
	next if "$primary.$domain" eq $alias;
	&justify($alias);
	print F1 "IN\tCNAME\t$primary\n";
    }
    print F1 ";\n";
    # now the IN-ADDR.ARPA entry
    ($q11,$q12,$q13,$q14) = split(/\./, $addr);
    next if $q1 != $q11 || $q2 != $q12 || $q3 != $q13;
    $primary = "$primary.$domain." unless $primary =~ /\./;
    print F2 "$q14\t\t\tIN\tPTR\t$primary\n";
}

sub justify
{
    local ($name) = @_;
    $name .= '.' if $name =~ /\..*[^.]$/;
    $i = length($name) / 8;
    print F1 $name . "\t" x (4 - $i);
}


-- 
cheers, J"org                             work:    joerg_wunsch@tcd-dresden.de
                                          private:   joerg_wunsch@uriah.sax.de
Steinbach's Guideline for Systems Programming:
        Never test for an error condition you don't know how to handle.