DNS-Files erzeugen
Im Rahmen des inside-network Projektes der lug-gg habe ich 2006 dieses Utility geschrieben.Voraussetzungen:
- DNS (bind9) und dhcp3-server sind installiert
- dialog und ncurses ist installiert
- nslint ist installiert, es wird zur Syntaxprüfung der erzeugten Dateien verwendet
$ aptitude install bind9 dhcp3-server dialog ncurses nslint
Ziel:Alle Dateien, die für die einen DNS- / DHCP-Server erforderlich sind, werden erzeugt.
Da ein DNS kein X benötigt, werden nur Befehle der bash-Shell und Dialog eingesetzt.
Alles ist in einer Scriptdatei, damit ist keine Installation erforderlich.
Es wird ein Unterverzeichnis bind_new angelegt, in dem die Dateien erzeugt werden
- Es werden zunächst die Kenndaten des Benutzers angezeigt.
Die Erzeugung der Dateien kann als normaler Anwender erfolgen.
Zur Übertragung in die Zielverzeichnisse und zum Stoppen und
Starten des DNS müssen Sie aber Superuser sein.

- Als nächstes wird die Range abgefragt, die für den DHCP-server reserviert bleiben soll
Löschen Sie die Werte, wenn Sie keinen dhcp3-server aufsetzen wollen

- Änderung der Werte
Das Script schlägt Ausgangswerte für die Erzeugung einer Zone vor.
Sie können die werte ändern. Selektieren Sie den zu ändernden Wert mit der Leertaste und drücken Sie Enter.
Im nachfolgenden Input-dialog geben Sie den gewünschten Wert ein.
Sie sollten immer nur einen Wert selektieren.

- Die Serialnummer sollte immer geändert werden, wenn Änderungen an den Konfigurationsdateien vorgenommen werden.
Deshalb wird die SERIAL automatisch um 1 erhöht bzw auf ein neues Datum YYYYMMDDnn gesetzt.
Die geänderten Werte werden in der Datei bind_new/.bind_config.ini abgelegt und beim nächsten Aufruf wieder verwendet.

- Es werden die Daten für die bereits in der Zone eingetragenen Rechner gezeigt.
-
Name:IP:Mailserver:CNAME
- Name: Rechnername
- IP: IP ohne Netzanteil
- Mailserver: Mailserver für den angebebenen Rechner
- CNAME: Originalname (IP und Mailserver muß dann leer sein)

-
Hier werden Name, IP und Mailserver eingegeben

-
Hier wird für einen existierenden Rechner ein weiterer Name eingetragen.
Oben wird der der neue Name angegeben, darunter der alte Name

- Und so sieht das dann in der Tabelle aus

-
Nachdem die Dateien erzeugt wurden können sie angezeigt werden

-
Hier der Anfang der Zonendatei.

- Als Superuser können Sie jetzt die Änderungen aktivieren
Dazu wird bind und dhcp angehalten, die Dateien werden aus dem temporären Verzeichnis
in die Zielverzeichnisse /etc/bind und /etc/dhcp3 übertragen
Danach wird bind und dhcp3-server wieder gestartet.

-
Zum Schluss wird ihnen der letzte Teil der Datei /var/log/syslog gezeigt.
Sie sollten dort kontrollieren, ob dns ohne Fehler gestartet wurde.

Das Script wird noch erweitert um:
- Ersetzen allow-update { any; } durch allow-update { key ... } mit md5-Signatur
- Löschen eingetragener Rechner
- erweiterte Fehlerprüfung
Clientseitig
$ aptitude install dhcp3-client
# The primary network interface
auto eth0
iface eth0 inet dhcp
send host-name "lugdh-vm01";
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers;

Download script : create_dns.tar.gz
# ---------------------------------------------------------------------
# Das Script erzeugt alle Dateien für einen Nameserver
# Autor : Detlef Hahn
# Copyright (c) 2005/2006 Detlef Hahn
# --------------------------------------------------------------------
# Versionlog
# 0.1.4 03.03.2006 Detlef Hahn Default für Mailer
# 0.1.3 19.01.2006 Detlef Hahn Verschönerung
# 0.1.3 15.01.2006 Detlef Hahn einfaches DHCP
# 0.1.2 05.01.2006 Detlef Hahn Verarbeitung .ini CNAME
# 0.1.2 11.12.2005 Detlef Hahn Korrektur der Ergänzungen (doppelter
# Eintrag DNS und Mailer)
# 0.1.1 10.12.2005 Helmut Kohl Korrekturen, Ergänzungen
# 0.1 05.12.2005 Detlef Hahn Originalversion
#
# --------------------------------------------------------------------
# ---------------------------------------------------------------------
# Default Variablen fuer Erzeugung der Datenfiles
# ---------------------------------------------------------------------
typeset -x VERSION=0.1.4
typeset -x ETH=eth0
typeset -x TTL=604800
typeset -x DNSNAME="dns-xx"
typeset -x GATEWAYNAME="rtg"
typeset -x MAILNAME="mail-server"
typeset -x DOMAIN=whatever
typeset -x SERIAL=`date +%Y%m%d`01
typeset -x REFRESH=3600
typeset -x RETRY=600
typeset -x EXPIRE=2419200
typeset -x CACHENEG=604800
typeset -x NETZ=10.64.106
typeset -x DNSIP=253
typeset -x IP=${NETZ}.${DNSIP}
typeset -x NETMASK=255.255.255.0
typeset -x BROADCAST=${NETZ}.255
typeset -x GATEWAYIP=254
typeset -x MAILIP=254
typeset -x REVNETZ=106.64.10
typeset -x LOCALHOST=localhost
typeset -x NAMED=named.conf
typeset -x TMPDIR="${HOME}/bind_new"
typeset -x TARGETDIR=/etc/bind
typeset -x DHCP=dhcpd.conf
typeset -x DHCPZONE=${DOMAIN}
typeset -x RANGEVON=100
typeset -x RANGEBIS=150
typeset -x RESOLV=resolv.conf
typeset -x msg
typeset -x defmail
typeset -x DEFMAILER
# ---------------------------------------------------------------------
# Variablen fuer Dialogsteuerung
# teilweise doppelt dmit ein Script besser verständlich
# ---------------------------------------------------------------------
: ${DIALOG=dialog}
: ${DIALOG_OK=0} # Yes oder Ok
: ${DIALOG_NO=1} # No oder Cancel
: ${DIALOG_CANCEL=1} # No oder Cancel
: ${DIALOG_HELP=2} # Help
: ${DIALOG_EXTRA=3} # Extrabutton
: ${DIALOG_EXIT=3} # Extrabutton
: ${DIALOG_ESC=255} # ESC
if [ ! -d ${TMPDIR} ] ; then
mkdir ${TMPDIR}
fi
cd
tempfile=`tempfile 2>/dev/null` || tempfile=${TMPDIR}/test$$
trap "rm -f $tempfile" 0 1 2 5 15
trap 'print $0 [$LINENO]' ERR
# ---------------------------------------------------------------------
# Variablen fuer Scriptsteuerung und optische Darstellung
# ---------------------------------------------------------------------
CUUP=`tput cuu1`
CLR_EOS=`tput ed`
blue="[34;49m"
grev="[39;42m" # gruen und rev
grey="[30;47m" # schwarz auf grau
norm="[0m"
# ---------------------------------------------------------
# Funktionen muessen vor der Verwendung deklariert werden
# ---------------------------------------------------------
kopf() {
typeset -i p
len=${#1} # Laenge Parameter 1
rev=$(tput smso) # terminal capabilities zuweisen
norm=$(tput rmso)
clr_eol=$(tput el) # clear to end of line
((p=(30-l)/2+17))
clear
echo "[37;44m"$clr_eol "[1m" Datum : $(date '+%d.%m.%y')$(tput cup 0 $p) $1 $(tput cup 0 62) Uhrzeit : $(date '+%H:%M')"[0m"
echo "[37;44m"$clr_eol "[1m" `uname -a` "[0m"
echo
}
# ---------------------------------------------------------
# Gibt Parameter aus und wartet auf Benutzer CR
# q beedentet das Script
# ---------------------------------------------------------
cont() {
echo -n "$1 Fortsetzung durch "
read dummy
if [ "${dummy}" = "q" -o "${dummy}" = "Q" ]
then
exit 1
fi
echo -n "${CUUP}${CLR_EOS}"
}
# --------------------------------------------------------
# liest einen Wert und schreibt ihn indirekt in die Variable
# --------------------------------------------------------
function get_input() {
eval VAL=\$$1 # tricky substitution
$DIALOG --inputbox $1 8 40 `echo ${VAL}` 2> $tempfile
ret=$?
newval=$(< $tempfile)
case $ret in
$DIALOG_OK) # zurückschreiben in Ausgangsvariable
eval `echo $1=$newval` # tricky substitution
;;
$DIALOG_CANCEL)
;;
$DIALOG_ESC)
exit 1 # Abbruch
;;
*)
;;
esac
}
# -----------------------------------------------------------------------
# Holt sich die Kenndaten des aufrufenden Benutzers
# -----------------------------------------------------------------------
function show_userdata() {
ids=`id|sed -e 's/([^)]*)//g'`
uid=`echo "$ids" | sed -e 's/^uid=//' -e 's/ .*//'`
gid=`echo "$ids" | sed -e 's/^.* gid=//' -e 's/ .*//'`
user="$USER"
home="$HOME"
tempdir="$TMPDIR"
value="\nUsername: $USER \nUID: $uid \nGID: $gid \nHOME: $home \nTempdir: $TMPDIR"
show=`echo "$value" |sed -e 's/\n/\n /'`
$DIALOG --title "Benutzerdaten " --keep-window --no-shadow --no-collapse --cr-wrap \
--ok-label "Weiter" \
--msgbox "Benutzerdaten: \n${show} " 12 40
}
# --------------------------------------------------------------------
# tauscht IP für Reverse-Netz
# --------------------------------------------------------------------
function rev_netz(){
REVNETZ=$(echo ${NETZ} | sed -e "s/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3.\2.\1/" )
}
# --------------------------------------------------------------------
# Anzeigen der Grunddaten. Diese sollen in der nächsten Version aus
# einer .INI gelesen werden.
# --------------------------------------------------------------------
function show_config() {
rev_netz
echo " DOMAIN = ${DOMAIN}"
echo " DNSNAME = ${DNSNAME}"
echo " GATEWAYNAME = ${GATEWAYNAME}"
echo " MAILNAME = ${MAILNAME}"
echo " TTL = ${TTL}"
echo " SERIAL = ${SERIAL}"
echo " REFRESH = ${REFRESH}"
echo " RETRY = ${RETRY}"
echo " EXPIRE = ${EXPIRE}"
echo " CACHENEG = ${CACHENEG}"
echo " NETZ = ${NETZ}"
echo " DNSIP = ${DNSIP}"
echo " GATEWAYIP = ${GATEWAYIP}"
echo " MAILIP = ${MAILIP}"
}
# --------------------------------------------------------------------
# Ausgabe der Grunddaten
# --------------------------------------------------------------------
function save_config() {
echo "#!/bin/bash" > ${TMPDIR}/.bind_config.ini
show_config | sed -e 's/ //g' >> ${TMPDIR}/.bind_config.ini
(( max = ${#iptab[*]} ))
i=0
while [ $i -lt $max ]
do
echo "iptab[$i]=${iptab[i]}" >> ${TMPDIR}/.bind_config.ini
(( i = i + 1 ))
done
chmod 755 ${TMPDIR}/.bind_config.ini
}
# -----------------------------------------------------------------
# Die Funktion gibt alle Daten aus. Der Anwender kann einen Eintrag
# zur Änderung auswählen. Der geänderte Wert wird wieder angezeigt.
# -----------------------------------------------------------------
function change_values () {
$DIALOG --title "Configdaten" \
--backtitle "Detlef's DNS-Builder V ${VERSION} (c) Basic-Software-Beratungs GmbH" \
--ok-label "ändern" \
--cancel-label "Exit Programm" \
--extra-button --extra-label "Weiter" \
--title "Auswahl Änderung" \
--radiolist "Benutzen Sie UP/Down zur Navigation \n\
mit der Leertaste selektieren Sie den Wert \n\n\
welchen Wert wollen Sie ändern?" 22 61 13 \
DOMAIN "${DOMAIN}" off \
DNSNAME "${DNSNAME}" off \
GATEWAYNAME "${GATEWAYNAME}" off \
MAILNAME "${MAILNAME}" off \
TTL "${TTL}" off \
SERIAL "${SERIAL}" off \
REFRESH "${REFRESH}" off \
RETRY "${REFRESH}" off \
EXPIRE "${EXPIRE}" off \
CACHENEG "${CACHENEG}" off \
NETZ "${NETZ}" off \
DNSIP "${DNSIP}" off \
GATEWAYIP "${GATEWAYIP}" off \
MAILIP "${MAILIP}" off \
2> ${tempfile}
retval=$?
# NETMASK "${NETMASK}" off
# BROADCAST "${BROADCAST}" off
# REVNETZ "${REVNETZ}" off
choice=$( < ${tempfile} ) # schneller als cat file
case $retval in
$DIALOG_OK)
if [ -z "$choice" ] ; then
retval=$DIALOG_EXTRA
else
get_input "$choice"
fi
;;
$DIALOG_EXTRA) # Exit gewählt, keine weiteren Änderungen
;;
$DIALOG_CANCEL) # Abbruch
exit 1
;;
$DIALOG_ESC)
exit 1 # Programm abbrechen
;;
*)
echo "Unexpected return code: $retval (ok would be $DIALOG_OK)";;
esac
BROADCAST=${NETZ}.255 # Wenn sich das Netz ändert muss
IP=${NETZ}.${DNSIP} # sich auch die IP ändern
rev_netz
# DNS, GATEWAY,MAIL wenn diese Werte geändert wurden, muss in itab[0-2] auch
# geändert werden
iptab[0]="${DNSNAME}:${DNSIP}:${MAILNAME}:" # DNS selbst eintragen
iptab[1]="${GATEWAYNAME}:${GATEWAYIP}:${MAILNAME}:" # GATEWAY (rtg) eintragen
if [ ${GATEWAYIP} = ${MAILIP} ] ; then # IP gleich dann CNAME fuer
iptab[2]="${MAILNAME}:::${GATEWAYNAME}" # MAIL-Server eintragen
else
iptab[2]="${MAILNAME}:${MAILIP}:${MAILNAME}:" # MAIL-Server eintragen
fi
if (defmail) ; then
DEFMAIL=$MAILNAME
fi
return $retval
}
# ---------------------------------------------------------------------------
# Der Benutzer kann auswählen ob der Defaultmailer verwendet wird, wenn
# er keinen Mailer explizit angibt
# ---------------------------------------------------------------------------
function ask_defmailer() {
$DIALOG --title "Defaultmailer" --yesno \
"${MAILNAME} verwenden ?" 10 40
defmail=$?
case $defmail in
$DIALOG_OK)
DEFMAILER=${MAILNAME}
;;
$DIALOG_CANCEL)
DEFMAILER=""
;;
esac
}
# ----------------------------------------------------------------------------
# prüft ob ein Rechner mit seinen angegebenen Daten eingetragen werden darf
# ----------------------------------------------------------------------------
function check_new() {
(( max = ${#iptab[*]} ))
val="${1}::::"
rechner=$( echo ${val} | cut -f1 -d: )
renr=$( echo ${val} | cut -f2 -d: )
mx1=$( echo ${val} | cut -f3 -d: )
cname=$( echo ${val} | cut -f4 -d: ) # | sed -e 's/:/ /' )
neu="${rechner}:${renr}:${mx1}:${cname}"
ret=0
msg=""
if [ -z "${rechner}" ] ; then
msg="Name darf nicht leer sein \n"
ret=1
else
echo "${rechner}" | egrep -q "^[a-zA-Z][a-zA-Z0-9]*"
if [ "$?" != "0" ] ; then
msg="Name enthält unzulässige Zeicen"
ret=1
fi
fi
# IP nur prüfen wenn cname leer
if [ -z "${cname}" ] ; then
echo "${renr}" | egrep -q '^[0-9]*$'
if [ "$?" != "0" ] ; then
msg=${msg}"IP enthält unzulässige Zeichen\n"
ret=1
fi
fi
# Rangecheck
if [ "$ret" -eq "0" -a "${DHCP}" != "" ] ; then
if [ "$renr" -ge "${RANGEVON}" -a "${renr}" -le "${RANGEBIS}" ] ; then
msg=${msg}" Feste IP ${renr} im DHCP-Bereich ${RANGEVON} bis ${RANGEBIS} nicht zulässig"
ret=1
fi
fi
if [ "${2}" = "2" ] ; then # beide erforderlich
if [ "${#renr}" -eq "0" -a "${#cname}" -eq "0" ] ; then
msg="${msg} Rechnername und Originalname müssen beide angegeben werden"
ret=1
fi
fi
# cn=0
# rn=0
p=0
while [ $p -lt $max -a "$ret" -eq "0" ]
do
tabrechner="$( echo ${iptab[p]} | cut -f1 -d: )"
tabrenr="$( echo ${iptab[p]} | cut -f2 -d: )"
tabcname="$( echo ${iptab[p]} | cut -f4 -d: )"
if [ "${rechner}" = "${tabrechner}" ] ; then
msg="Den Rechner mit dem Namen ${rechner} gibt es bereits"
(( ret = ret + 1 ))
fi
if [ $2 = "1" ] ; then
if [ "${renr}" = "${tabrenr}" ] ; then
msg="${msg} Den Rechner ${renr} mit der IP ${tabrenr} gibt es bereits an Position $p "
(( ret = ret + 2 ))
fi
if [ "${renr}" -gt 254 -o "${renr}" -eq 0 ] ; then
msg="${msg} Die Rechnernummer muss > 0 und kleiner als 255 sein"
(( ret = ret + 4 ))
fi
fi
(( p = p + 1 ))
done
case $ret in
0)
iptab[max]="${neu}"
(( max = max + 1))
;;
esac
return $ret
}
# ------------------------------------------------------------------------------
# zeigt alle Rechner in der Zone an und erlaubt die Neueingabe von Rechnern
# ------------------------------------------------------------------------------
function show_systems() {
typeset -i p=0 mode=1 m=${1}
returncode=0
while [ $returncode != 1 ] && [ $returncode != 250 ] || [ $mode -lt 3 ]
do
(( n = ${#iptab[*]} ))
zone=""
rm $tempfile
p=0
touch $tempfile
while (( p < n ))
do
zone="${zone}${p}) ${iptab[p]} \n"
echo "${p}) ${iptab[p]}" >> $tempfile
(( p = p + 1 ))
done
rechner=""
renr=""
if [ ${defmail} == "0" ] ; then
mx1=${DEFMAILER}
else
mx1=""
fi
mx1="${MAILER:-${DEFMAILER}}"
cname=""
#--form text height width formheight [ label y x item y x fieldlen inputlen ] ...
case $mode in
1)
exec 3>&1
value=`$DIALOG --no-shadow --keep-window --begin 1 2 --cr-wrap \
--title "Rechner in der Zone" \
--exit-label "Weiter" \
--textbox "${tempfile}" 20 50 \
--and-widget --no-shadow \
--title "Eingabe neuer Rechner" \
--begin 1 53 --ok-label "Enter" \
--extra-button --extra-label "Weiter" \
--cancel-label "Exit Prog." \
--form "UP/Down wechselt zwischen den Feldern \n beendet die Eingabe" \
12 45 0 \
"Rechnername:" 1 1 "$rechner" 1 15 20 0 \
"IP nnn:" 2 1 "$renr " 2 15 5 0 \
"MX-Mailer:" 3 1 "$mx1" 3 15 20 0 \
2>&1 1>&3`
returncode=$?
if [ $returncode == $DIALOG_CANCEL ] ; then
exit 1
fi
exec 3>&-
# ersetze Trennzeichen new-line durch :
val=$(echo ${value} | sed ':a; /$/N; s/\n/:\t/; ta' | sed -e 's/ /:/g')
;;
2)
exec 3>&1
value=`$DIALOG --no-shadow --keep-window --begin 1 2 --cr-wrap \
--title "Rechner in der Zone" \
--exit-label "Weiter" \
--textbox "${tempfile}" 20 50 \
--and-widget --no-shadow \
--title "Eingabe Zweitname" \
--begin 1 53 --ok-label "Enter" \
--extra-button --extra-label "Weiter" \
--cancel-label "Exit Prog." \
--form "Beispiel: mail-server Orignalname rtg\n\
mail-server ist ein weiterer name für den in der Zone existierenden Rechner rtg" \
12 45 0 \
"Rechnername:" 1 1 "$rechner" 1 15 20 0 \
"Originalname:" 2 1 "$cname" 2 15 20 0 \
2>&1 1>&3`
returncode=$?
exec 3>&-
# ersetze Trennzeichen new-line durch :
val=$(echo ${value} | sed ':a; /$/N; s/\n/:\t/; ta' | sed -e 's/ /:::/g')
;;
esac
show=`echo "$val" |sed -e 's/^/ /'`
case $returncode in
3)
if [ $mode -eq 1 ] ; then
(( mode++ ))
else
"$DIALOG" \
--clear \
--title "Last Chance" \
--yesno "Eingabeloop verlassen?" 6 30
case $? in
0)
break # Loop verlassen
;;
1)
returncode=99
mode=1
;;
esac
fi
;;
0)
check_new "${val}" "${mode}"
ret=$?
case $ret in
0)
;;
*) # Eintrag ungültig
$DIALOG --msgbox \
"Angaben ungültig : \n${msg}\nEs erfolgt kein Eintrag\n${show}" 10 40
;;
esac
;;
*)
echo "Return code was $returncode"
exit
;;
esac
done
}
# --------------------------------------------------------------------
# DHCP Range eingeben
# --------------------------------------------------------------------
function dhcp_range() {
DHCPZONE=""
exec 3>&1
value=`$DIALOG --no-shadow --title "DHCP-Range" \
--begin 11 20 --ok-label "Enter" \
--cancel-label "weiter" \
--form "Soll für den Rechner DHCP aufgesetzt werden\n
dann geben Sie bitte die Range ein\nBitte lassen Sie einen Bereich für feste IP-Nummern frei\nUP/Down wechselt zwischen den Feldern \n beendet die Eingabe" \
12 50 0 \
"Range von:" 1 1 "$RANGEVON" 1 15 5 0 \
"Range bis:" 2 1 "$RANGEBIS" 2 15 5 0 \
2>&1 1>&3`
returncode=$?
exec 3>&-
# ersetze Trennzeichen new-line durch :
val=$(echo ${value} | sed ':a; /$/N; s/\n/:\t/; ta' | sed -e 's/ /:/g')
case $returncode in
$DIALOG_OK)
RANGEVON=""
RANGEBIS=""
DHCPZONE=""
if [ ":${val}" != ":" ] ; then
RANGEVON="$(echo ${val} | cut -f1 -d: )"
RANGEBIS="$(echo ${val} | cut -f2 -d: )"
DHCPZONE=${DOMAIN}
fi
;;
esac
if [ ":${DHCPZONE}" != ":" ] ; then
ALLOWUPDATE=" allow-update { any; }; "
else
ALLOWUPDATE=""
fi
return $returncode
}
# -------------------------------------------------------------------
# Das Menu erlaubt das Anzeigen der erzeugten Dateien
# -------------------------------------------------------------------
function menu_show_files() {
retval=$DIALOG_OK
while [ "$retval" -eq "$DIALOG_OK" ]
do
$DIALOG --clear --title "Configfiles anzeigen" \
--extra-button --extra-label "Weiter" \
--cancel-label "Exit Prog." \
--menu "Wählen Sie die Datei aus:" 20 79 9 \
"${DOMAIN}" "Zonenfile (Name IP) " \
"${DOMAIN}.rev" "Reverse (IP Name)" \
"${LOCALHOST}" "localhost" \
"${LOCALHOST}.rev" "localhost.rev" \
"${NAMED}" "named.conf" \
"${DHCP}" "dhcpd.conf" \
"${RESOLV}" "resolv.conf" \
"${NSLINT}" "nslint.log" \
2> ${tempfile}
retval=$?
choice=$( < $tempfile )
case $retval in
$DIALOG_OK)
dialog --title "${choice}" --textbox "$TMPDIR/${choice}" 24 75
;;
$DIALOG_EXTRA)
;;
$DIALOG_CANCEL)
exit 1
;;
esac
done
}
# --------------------------------------------------------------------
function create_db_root() {
cat > $TMPDIR/db.root << "EOF"
; <<>> DiG 9.2.3 <<>> ns . @a.root-servers.net.
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18944
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 3600000 IN NS A.ROOT-SERVERS.NET.
. 3600000 IN NS B.ROOT-SERVERS.NET.
. 3600000 IN NS C.ROOT-SERVERS.NET.
. 3600000 IN NS D.ROOT-SERVERS.NET.
. 3600000 IN NS E.ROOT-SERVERS.NET.
. 3600000 IN NS F.ROOT-SERVERS.NET.
. 3600000 IN NS G.ROOT-SERVERS.NET.
. 3600000 IN NS H.ROOT-SERVERS.NET.
. 3600000 IN NS I.ROOT-SERVERS.NET.
. 3600000 IN NS J.ROOT-SERVERS.NET.
. 3600000 IN NS K.ROOT-SERVERS.NET.
. 3600000 IN NS L.ROOT-SERVERS.NET.
. 3600000 IN NS M.ROOT-SERVERS.NET.
;; ADDITIONAL SECTION:
A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201
C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90
E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53
I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30
K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12
M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33
;; Query time: 81 msec
;; SERVER: 198.41.0.4#53(a.root-servers.net.)
;; WHEN: Sun Feb 1 11:27:14 2004
;; MSG SIZE rcvd: 436
EOF
}
# --------------------------------------------------------------------
# Erzeugt eine Zonendatei Name -> IP
# --------------------------------------------------------------------
function create_domain() {
cat > $tempfile << "EOF"
; /etc/{DOMAIN}
; erstellt mit bsb_dns_config (c) Basic-Software-Beratungs GmbH
;
; BIND Zonefile fuer das Interface {ETH}
;
$TTL {TTL}
{DOMAIN}. IN SOA {DNSNAME}.{DOMAIN}. root.{MAILNAME}.{DOMAIN}. (
{SERIAL} ; Serial
{REFRESH} ; Refresh 604800 = 1 Woche
{RETRY} ; Retry 600 = 10 Minuten
{EXPIRE} ; Expire
{CACHENEG} ) ; Negative Cache TTL
;
NS {DNSNAME}.{DOMAIN}.
MX 10 {MAILNAME}.{DOMAIN}.
$ORIGIN {DOMAIN}.
EOF
cat $tempfile | sed -e "s/{ETH}/"${ETH}"/g" \
-e "s/{DNSNAME}/"${DNSNAME}"/g" \
-e "s/{GATEWAYNAME}/"${GATEWAYNAME}"/g" \
-e "s/{DOMAIN}/"${DOMAIN}"/g" \
-e "s/{MAILNAME}/"${MAILNAME}"/g" \
-e "s/{TTL}/"${TTL}"/g" \
-e "s/{SERIAL}/"${SERIAL}"/g" \
-e "s/{REFRESH}/"${REFRESH}"/g" \
-e "s/{RETRY}/"${RETRY}"/g" \
-e "s/{EXPIRE}/"${EXPIRE}"/g" \
-e "s/{CACHENEG}/"${CACHENEG}"/g" \
-e "s/{NETZ}/"${NETZ}"/g" \
-e "s/{DNSIP}/"${DNSIP}"/g" \
-e "s/{GATEWAYIP}/"${GATEWAYIP}"/g" \
-e "s/{MAILIP}/"${MAILIP}"/g" \
> $TMPDIR/${DOMAIN}
p=0 # feste Stationen selbst nicht mehr eintragen
net=${#NETZ} # Länge Netzanteil
(( net = net + 1)) # + plus Punkt
while (( p < n ))
do
#echo "-${iptab[p]}-"
host=$(echo "${iptab[p]}" | cut -f1 -d: )
ipnr="${NETZ}."$(echo "${iptab[p]}"| cut -f2 -d: )
cname=$(echo "${iptab[p]}" | cut -f4 -d: )
if [ ${#host} -gt 0 ] && [ ${#ipnr} -gt ${net} ] ; then
tmp="${host} ";
rec="${tmp:0:15} A $ipnr"
echo "$rec" >> $TMPDIR/${DOMAIN}
fi
mail=$(echo "${iptab[p]}" | cut -f3 -d: )
if [ ${#mail} -gt 1 ] ; then
rec=" MX 10 ${mail}.${DOMAIN}."
echo "$rec" >> $TMPDIR/${DOMAIN}
fi
# Hier die Abarbeitung der CNAME-Einträge für eine Station
if [ ${#cname} -gt 0 ] ; then
tmp="${host} ";
rec="${tmp:0:15} CNAME ${cname}.${DOMAIN}."
echo "$rec" >> $TMPDIR/${DOMAIN}
fi
echo " " >> $TMPDIR/${DOMAIN}
(( p = p + 1 ))
done
}
# --------------------------------------------------------------------
# erzeugt Zone-reverse IP -> Name
# --------------------------------------------------------------------
function create_domain_rev() {
cat > ${tempfile} << "EOF"
; /etc/{DOMAIN}.rev
; erstellt mit bsb_dns_config (c) Basic-Software-Beratungs GmbH
;
; BIND fuer reverse Namensaufloesung {ETH}
$TTL {TTL} ; Zeit in Sekunden
{REVNETZ}.in-addr.arpa. IN SOA {DNSNAME}.{DOMAIN}. root.{MAILNAME}.{DOMAIN}. (
{SERIAL} ; Serial
{REFRESH} ; Refresh 604800 = 1 Woche
{RETRY} ; Retry 600 = 10 Minuten
{EXPIRE} ; Expire
{CACHENEG} ) ; Negative Cache TTL
;
NS {DNSNAME}.{DOMAIN}. ; wer ist Nameserver
$ORIGIN {REVNETZ}.in-addr.arpa.
EOF
cat $tempfile | sed -e "s/{ETH}/"${ETH}"/g" \
-e "s/{REVNETZ}/"${REVNETZ}"/g" \
-e "s/{DNSNAME}/"${DNSNAME}"/g" \
-e "s/{GATEWAYNAME}/"${GATEWAYNAME}"/g" \
-e "s/{DOMAIN}/"${DOMAIN}"/g" \
-e "s/{MAILNAME}/"${MAILNAME}"/g" \
-e "s/{TTL}/"${TTL}"/g" \
-e "s/{SERIAL}/"${SERIAL}"/g" \
-e "s/{REFRESH}/"${REFRESH}"/g" \
-e "s/{RETRY}/"${RETRY}"/g" \
-e "s/{EXPIRE}/"${EXPIRE}"/g" \
-e "s/{CACHENEG}/"${CACHENEG}"/g" \
-e "s/{DNSIP}/"${DNSIP}"/g" \
-e "s/{GATEWAYIP}/"${GATEWAYIP}"/g" \
-e "s/{MAILIP}/"${MAILIP}"/g" \
> $TMPDIR/${DOMAIN}.rev
(( n = ${#iptab[*]} ))
p=0 # feste Stationen selbst nicht mehr eintragen
while (( p < n ))
do
host=$(echo "${iptab[p]}" | cut -f1 -d: )
ipnr=$(echo "${iptab[p]}"| cut -f2 -d: )
if [ ${#ipnr} -gt 0 ] ; then
tmp="${ipnr} ";
i=0
ok=0
# Nur eintragen, wenn nicht bereits vorhanden
while (( i < ( p - 1 ) ))
do
old=$(echo "${iptab[i]}"| cut -f2 -d: )
if [ "${ipnr}" = "${old}" ] ; then
ok=1;
break
fi
(( i = i + 1 ))
done
if [ $ok = 0 ] ; then
tmp="${ipnr} ";
rec="${tmp:0:12} PTR ${host}.${DOMAIN}."
echo "$rec" >> $TMPDIR/${DOMAIN}.rev
fi
fi
echo " " >> $TMPDIR/${DOMAIN}.rev
(( p = p + 1 ))
done
}
# --------------------------------------------------------------------
# erzeugt Zone-localhost Name <- IP
# --------------------------------------------------------------------
function create_localhost() {
cat > $TMPDIR/${LOCALHOST} << "EOF"
; erstellt mit bsb_dns_config (c) Basic-Software-Beratungs GmbH
;
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ NS localhost.
@ A 127.0.0.1
EOF
}
# --------------------------------------------------------------------
# erzeugt Zone-localhost.rev IP -> Name
# --------------------------------------------------------------------
function create_localhost_rev() {
cat > $TMPDIR/${LOCALHOST}.rev << "EOF"
; erstellt mit bsb_dns_config (c) Basic-Software-Beratungs GmbH
;
; BIND reverse data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ NS localhost.
1.0.0 PTR localhost.
EOF
}
# --------------------------------------------------------------------
# erzeugt named.conf
# Damit eine Prüfung mit nslint vorgenommen werden kann, werden
# die Daten zunächst in ein temporäres Verzeichnis geschrieben.
# Erst nach der Prüfung werden die endgültigen Pfade gesetzt
# --------------------------------------------------------------------
function create_named_conf() {
#if [ "$#" -eq 1 ] ; then
# DIR="$1"
#else
# DIR="$TARGETDIR"
#fi
cat > ${tempfile} << EOF
// erstellt mit bsb_dns_config (c) Basic-Software-Beratungs GmbH
// ----------------------------------------------------------
// named.conf
options {
directory "/var/cache/bind" ;
listen-on port 53 { {NETZ}.{DNSIP}; } ;
listen-on-v6 { none; };
allow-query { {NETZ}.0/24; } ;
auth-nxdomain no; # conform to RFC1035
};
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "{DIR}/db.root";
};
// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912
zone "{DOMAIN}" {
type master;
file "{DIR}/{DOMAIN}";
${ALLOWUPDATE}
};
zone "{REVNETZ}.in-addr.arpa" {
type master;
file "{DIR}/{DOMAIN}.rev";
${ALLOWUPDATE}
};
// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912
zone "localhost" {
type master;
file "{DIR}/{LOCALHOST}";
};
zone "127.in-addr.arpa" {
type master;
file "{DIR}/{LOCALHOST}.rev";
};
EOF
cat ${tempfile} | sed -e "s+{DIR}+"${TARGETDIR}"+g" \
-e "s/{LOCALHOST}/"${LOCALHOST}"/g" \
-e "s/{DOMAIN}/"${DOMAIN}"/g" \
-e "s/{NETZ}/"${NETZ}"/g" \
-e "s/{REVNETZ}/"${REVNETZ}"/g" \
-e "s/{DNSIP}/"${DNSIP}"/g" \
> $TMPDIR/${NAMED}
}
# --------------------------------------------------------------------
# create_resolv_conf
# --------------------------------------------------------------------
create_resolv_conf() {
cat > ${tempfile} << EOF
search {DOMAIN}
nameserver {NETZ}.{DNSIP}
EOF
cat ${tempfile} | sed -e "s/{DOMAIN}/"${DOMAIN}"/g" \
-e "s/{NETZ}/"${NETZ}"/g" \
-e "s/{DNSIP}/"${DNSIP}"/g" \
> $TMPDIR/resolv.conf
}
# --------------------------------------------------------------------
# dhcpd.conf erzeugen, muß nach /etc/dhcp3 kopiert werden
# --------------------------------------------------------------------
function create_dhcpd_conf(){
cat > ${tempfile} << EOF
# dhcp.conf
# erstellt mit bsb_dns_config (c) Basic-Software-Beratungs GmbH
# ----------------------------------------------------------
# automatischer DNS abgleich
ddns-update-style interim;
default-lease-time 600;
max-lease-time 7200;
ignore-client-updates;
# Dieser Server ist Chef der Zone , deshalb wird authoritative angegeben
authoritative;
zone {DOMAIN} {
primary {NETZ}.{DNSIP};
}
zone {REVNETZ}.in-addr.arpa {
primary {NETZ}.{DNSIP};
}
subnet {NETZ}.0 netmask {NETMASK} {
server-identifier {NETZ}.{DNSIP};
option routers {NETZ}.{GATEWAYIP};
option subnet-mask {NETMASK};
option broadcast-address {BROADCAST};
option domain-name "{DOMAIN}";
option domain-name-servers {NETZ}.{DNSIP};
option dhcp-server-identifier {NETZ}.{DNSIP};
range {NETZ}.{RANGEVON} {NETZ}.{RANGEBIS};
}
EOF
cat ${tempfile} | sed -e "s|{DIR}|"${TARGETDIR}"|g" \
-e "s|{LOCALHOST}|"${LOCALHOST}"|g" \
-e "s|{GATEWAYIP}|"${GATEWAYIP}"|g" \
-e "s|{NETZ}|"${NETZ}"|g" \
-e "s|{REVNETZ}|"${REVNETZ}"|g" \
-e "s|{NETMASK}|"${NETMASK}"|g" \
-e "s|{BROADCAST}|"${BROADCAST}"|g" \
-e "s|{DNSIP}|"${DNSIP}"|g" \
-e "s|{DOMAIN}|"${DOMAIN}"|g" \
-e "s|{RANGEVON}|"${RANGEVON}"|g" \
-e "s|{RANGEBIS}|"${RANGEBIS}"|g" \
> ${TMPDIR}/${DHCP}
}
# ---------------------------------------------------------------------
# --------------------------------------------------------------------
# move_files
# --------------------------------------------------------------------
function move_files() {
if [ $uid -ne 0 -o $user != "root" ] ; then
$DIALOG --title "Benutzerhinweis " \
--ok-label "Weiter" \
--msgbox "Sie sind kein Superuser, deshalb können die \
Dateien nicht automatisch in die Verzeichnisse \
verschoben werden. " 12 40
return ;
fi
$DIALOG --yesno "Sie sind Superuser! Soll bind jetzt gestoppt werden und die Dateien in die Zielverzeichnisse übertragen werden?" 0 0
retval=$?
case $retval in
$DIALOG_OK)
# Eigentuemer setzen, wenn root
if [ $uid -eq 0 ] && [ $user = "root" ] ; then
grep "^bind" /etc/passwd > /dev/null
r=$?
if [ $r -eq 0 ] ; then
chown bind:bind ${TMPDIR}/${DOMAIN}
chown bind:bind ${TMPDIR}/${DOMAIN}.rev
chown bind:bind ${TMPDIR}/${LOCALHOST}
chown bind:bind ${TMPDIR}/${LOCALHOST}.rev
chown root:bind ${TMPDIR}/${NAMED}
chown root:root ${TMPDIR}/resolv.conf
else
echo "User bind existiert nicht! Bitte anlegen und chown durchführen "
fi
clear
/etc/init.d/dhcp3-server stop
/etc/init.d/bind9 stop
# Files ins Zielverzeichnis kopieren, Owner, mode beibehalten
cp -p ${TMPDIR}/db.root /etc/bind
cp -p ${TMPDIR}/${DOMAIN} /etc/bind
cp -p ${TMPDIR}/${DOMAIN}.rev /etc/bind
cp -p ${TMPDIR}/${LOCALHOST} /etc/bind
cp -p ${TMPDIR}/${LOCALHOST}.rev /etc/bind
cp -p ${TMPDIR}/${NAMED} /etc/bind
cp -p ${TMPDIR}/${DHCP} /etc/dhcp3
cp -p ${TMPDIR}/${RESOLV} /etc/resolv.conf
/etc/init.d/bind9 start
/etc/init.d/dhcp3-server start
ps ax | grep named | grep -v grep
ps ax | grep dhcp | grep -v grep
cont
echo " <<< *** /var/log/syslog *** >>> "
echo
tail -20 /var/log/syslog
cont
fi
# -----------------------------------------------------------
;;
$DIALOG_CANCEL) # Abbruch
;;
*) # Weiter
;;
esac
}
# --------------------------------------------------------------------
# Beginn Hauptsteuerung
# --------------------------------------------------------------------
kopf "Detlef's DNS-Builder V ${VERSION}"
cat << EOF
Das Script erzeugt die Dateien die für den Betrieb einen DNS
erforderlich sind.
Die Dateien werden in dem Verzeichnis ${TMPDIR} abgelegt.
Läuft das Script mit Superuser-Privilegien, so werden auch
die Rechte an den Dateien richtig gesetzt.
Das Script kann in den Menues vorzeitig abgebrochen werden.
Die Dateien werden dann nicht geschrieben.
Have fun
Detlef Hahn
EOF
cont
# -------------------------------------------------------------------
# Namen und Rechnernummer fuer alle Maschinen anfragen
# -------------------------------------------------------------------
declare -a iptab nametab
typeset -x -i i=3 n=3
iptab[0]="${DNSNAME}:${DNSIP}:${MAILNAME}:" # DNS selbst eintragen
iptab[1]="${GATEWAYNAME}:${GATEWAYIP}:${MAILNAME}:" # GATEWAY (rtg) eintragen
if [ ${GATEWAYIP} = ${MAILIP} ] ; then # IP gleich dann CNAME fuer
iptab[2]="${MAILNAME}:::${GATEWAYNAME}" # MAIL-Server eintragen
else
iptab[2]="${MAILNAME}:${MAILIP}:${MAILNAME}:" # MAIL-Server eintragen
fi
# -------------------------------------------------------------------
show_userdata # funktion aufrufen
if [ -f ${TMPDIR}/.bind_config.ini ] ; then
. ${TMPDIR}/.bind_config.ini
tmpdate=`date +%Y%m%d` # Tagesdatum erzeugen
tmpserial=${SERIAL:0:8} # yyyymmdd extrahieren
if [ "${tmpdate}" != "${tmpserial}" ] ; then # Tageswechsel?
SERIAL=`date +%Y%m%d`01 # ja, neu hochzaehlen
else
(( SERIAL = SERIAL + 1 )) # weiterzaehlen
fi
fi
dhcp_range # Muss vor Eingabe der Rechnernummern erfolgen
# damit Range beräcksichtigt werden kann
# -------------------------------------------------------------------
# Grunddaten eingeben bzw ändern
# -------------------------------------------------------------------
retval="$DIALOG_OK"
while [ "$retval" = "$DIALOG_OK" ]
do
change_values # änderungen der Configdaten
retval=$?
done
ask_defmailer
show_systems "${i}" # Anzeigen der ersten 3 Einträge
# -------------------------------------------------------------------
# Jetzt sollten alle Daten vorhanden sein
# Die Ausgabedateien werden erzeugt
# -------------------------------------------------------------------
rm ${TMPDIR}/${DOMAIN} ${TMPDIR}/${DOMAIN}.rev ${TMPDIR}/${LOCALHOST} \
${TMPDIR}/${LOCALHOST}.rev ${TMPDIR}/${NAMED} ${TMPDIR}/${DHCP}
create_db_root
create_domain
create_domain_rev
create_localhost
create_localhost_rev
create_named_conf
create_resolv_conf
if [ "${DHCPZONE}" != "" ] ; then
create_dhcpd_conf # nur wenn DHCP gefordert
fi
save_config # .ini wegschreiben
# ------------------------------------------------------------
# -----------------------------------------------------------
# Prüfen
# -----------------------------------------------------------
NSLINT=".nslint.log"
nslint -c $TMPDIR/named.conf 2> ${TMPDIR}/${NSLINT}
menu_show_files # erzeugte Dateien anzeigen
move_files # Dateien ins Zielverzeichnis verschieben
# aufräumen
# -----------------------------------------------------------
rm ${TMPDIR}/file*
ls -la ${TMPDIR}
