#!/bin/sh # version 2.1 # simple script to quickly setup a dns server for cluster # so you can find some error. plz report: clic-dev-public@mandrakesoft.com # ########## WORKDIR="/tmp/serverdns" ########## CONFFILE="/etc/clusterserver.conf" if [ ! -f ${CONFFILE} ]; then echo "Cant find ${CONFFILE} !" exit 1 fi . ${CONFFILE} ############################################################## ############################################################## ## !!!!!! DONT TOUCH BEHIND THOSE LINE !!!!! ## (execpt you know waht you are doing.....) ############################################################## ############################################################## # check server is not in RANGE ip check_range_ip() { echo " - Checking IP of SERVER in RANGE IP" for i in `seq ${STARTNODE} ${FINISHNODE}` ; do if [ "$i" = "${IPSERVERREVERSE}" ]; then echo "!!!! WARNING !!!!" echo "IP of DNS Server found twice in DNS !!" echo "change the range ip of nodes in ${CONFFILE}" exit 1 fi done if [ "${STARTNODE}" -ge "${FINISHNODE}" ]; then echo "FINISHNODE is greater than STARTNODE !!" echo "check ${CONFFILE}" exit 1 fi if [ "${FINISHNODE}" -gt "254" ]; then echo "Be carefull ! IP out of 1 to 254 RANGE" exit 1 fi } check_hostname() { if [ ${NAMEOFSERVER} = "localhost" ]; then echo "Strange name for a DNS server ?" echo "cant configure a DNS server with such a name !" echo "EXITING ! " exit 1 fi } check_domain() { if [ ${DOMAINNAME} = "localdomain" ]; then echo "Strange DOMAIN for a DNS server ?" echo "cant configure a DNS server with such a DOMAINNAME !" echo "please edit /etc/sysconfig/network" echo "and choose a corect DOMAINNAME" echo "EXITING ! " exit 1 fi } # check service named start_service() { CHECK_NAMED_STAT=`pidof named` if [ -z "${CHECK_NAMED_STAT}" ]; then echo " - Starting NAMED service:" /etc/rc.d/init.d/named start else echo " - Restarting NAMED service:" /etc/rc.d/init.d/named restart fi } # check Work dir check_workdir() { if [ -d "${WORKDIR}" ]; then echo " - ${WORKDIR} directory exist" rm -rf ${WORKDIR} mkdir ${WORKDIR} else echo " - Creating ${WORKDIR} directory" mkdir ${WORKDIR} fi } # check zone dir check_zonedir() { if [ -d "${ZONE_DIR}" ]; then echo " - ${ZONE_DIR} directory exist" else echo " - Creating ${ZONE_DIR} directory" mkdir -p ${ZONE_DIR} fi } # create all typical file create_typical_file() { # create db.DOMAINNAME.hosts cd ${WORKDIR} echo " - Creating Typical files of a DNS server" cat > ${WORKDIR}/db.DOMAINNAME.hosts <<EOF \$TTL 3D @ IN SOA NAMEOFSERVER.DOMAINNAME. root.NAMEOFSERVER.DOMAINNAME. ( $SERIAL ; Serial 8H ; Refresh 2H ; Retry 4W ; Expire 1D) ; Minimum TTL TXT "TEXTINFO" IN NS NAMEOFSERVER.DOMAINNAME. localhost A 127.0.0.1 dns IN CNAME NAMEOFSERVER.DOMAINNAME. NAMEOFSERVER.DOMAINNAME. IN A $IPSERVER EOF # create named.conf cat > ${WORKDIR}/named.conf <<EOF key mykey { algorithm hmac-md5; secret "$DNSKEY"; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { mykey; }; }; options { directory "$NAMED_DIR"; pid-file "$NAMED_DIR/named.pid"; allow-query { any; }; forwarders { IPOFFORWARDER; }; }; zone "localhost" { type master; file "zone/db.localhost"; }; zone "0.0.127.in-addr.arpa" { type master; file "zone/db.127.0.0"; }; zone "REVERSEIP.in-addr.arpa" { type master; file "zone/db.REVERSEIP.hosts"; forwarders { }; }; zone "DOMAINNAME" { type master; file "zone/db.DOMAINNAME.hosts"; forwarders { }; }; zone "." { type hint; file "zone/root.hints"; }; EOF # create db.REVERSEIP.hosts cat > ${WORKDIR}/db.REVERSEIP.hosts <<EOF \$TTL 3D @ IN SOA NAMEOFSERVER.DOMAINNAME. root.NAMEOFSERVER.DOMAINNAME. ( $SERIAL ; serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 86400 ) ; Minimum TTL NS NAMEOFSERVER.DOMAINNAME. $IPSERVERREVERSE IN PTR NAMEOFSERVER.DOMAINNAME. EOF # create root.hints cat > ${WORKDIR}/root.hints <<EOF ; <<>> DiG 8.1 <<>> @A.ROOT-SERVERS.NET. ; (1 server found) ;; res options: init recurs defnam dnsrch ;; got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10 ;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13 ;; QUERY SECTION: ;; ., type = NS, class = IN ;; ANSWER SECTION: . 6D IN NS G.ROOT-SERVERS.NET. . 6D IN NS J.ROOT-SERVERS.NET. . 6D IN NS K.ROOT-SERVERS.NET. . 6D IN NS L.ROOT-SERVERS.NET. . 6D IN NS M.ROOT-SERVERS.NET. . 6D IN NS A.ROOT-SERVERS.NET. . 6D IN NS H.ROOT-SERVERS.NET. . 6D IN NS B.ROOT-SERVERS.NET. . 6D IN NS C.ROOT-SERVERS.NET. . 6D IN NS D.ROOT-SERVERS.NET. . 6D IN NS E.ROOT-SERVERS.NET. . 6D IN NS I.ROOT-SERVERS.NET. . 6D IN NS F.ROOT-SERVERS.NET. ;; ADDITIONAL SECTION: G.ROOT-SERVERS.NET. 5w6d16h IN A 192.112.36.4 J.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.10 K.ROOT-SERVERS.NET. 5w6d16h IN A 193.0.14.129 L.ROOT-SERVERS.NET. 5w6d16h IN A 198.32.64.12 M.ROOT-SERVERS.NET. 5w6d16h IN A 202.12.27.33 A.ROOT-SERVERS.NET. 5w6d16h IN A 198.41.0.4 H.ROOT-SERVERS.NET. 5w6d16h IN A 128.63.2.53 B.ROOT-SERVERS.NET. 5w6d16h IN A 128.9.0.107 C.ROOT-SERVERS.NET. 5w6d16h IN A 192.33.4.12 D.ROOT-SERVERS.NET. 5w6d16h IN A 128.8.10.90 E.ROOT-SERVERS.NET. 5w6d16h IN A 192.203.230.10 I.ROOT-SERVERS.NET. 5w6d16h IN A 192.36.148.17 F.ROOT-SERVERS.NET. 5w6d16h IN A 192.5.5.241 ;; Total query time: 215 msec ;; FROM: roke.uio.no to SERVER: A.ROOT-SERVERS.NET. 198.41.0.4 ;; WHEN: Sun Feb 15 01:22:51 1998 ;; MSG SIZE sent: 17 rcvd: 436 EOF # create db.127.0.0 cat > ${WORKDIR}/db.127.0.0 <<EOF \$TTL 3D @ IN SOA DOMAINNAME. root.DOMAINNAME. ( $SERIAL ; Serial 28800 ; Refresh 7200 ; Retry 604800 ; Expire 86400) ; Minimum TTL NS NAMEOFSERVER.DOMAINNAME. localhost IN A 127.0.0.1 EOF cat > ${WORKDIR}/db.localhost <<EOF \$TTL 3D @ IN SOA DOMAINNAME. root.DOMAINNAME. ( $SERIAL ; Serial 28800 ; Refresh 7200 ; Retry 604800 ; Expire 86400) ; Minimum TTL NS NAMEOFSERVER.DOMAINNAME. 1 IN PTR localhost. EOF # create rndc.conf cat > ${WORKDIR}/rndc.conf <<EOF /* * Copyright (C) 2000, 2001 Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* $Id: setup_dns_server,v 1.3 2002/12/04 10:39:23 uid620 Exp $ */ /* * Sample rndc configuration file. */ options { default-server localhost; default-key "mykey"; }; server localhost { key "mykey"; }; key "mykey" { algorithm hmac-md5; secret "$DNSKEY"; }; EOF } # save old conffile if exist save_old_conf() { echo " - Saving old confile: ${CONFFILE}" if [ -f ${CONFFILE} ]; then cp -f ${CONFFILE} ${CONFFILE}.${DATE}.sauv fi } # generate list nodes for db.REVERSE.HOSTS gen_reverse_list() { for i in `seq ${STARTNODE} ${FINISHNODE}` do echo "${i} IN PTR ${NODENAME}${i}.${DOMAINNAME}." done } # generate list nodes for db.DOMAINNAME.hosts gen_domain_list() { for i in `seq ${STARTNODE} ${FINISHNODE}` do echo "${NODENAME}${i} IN A ${NORMIP}.${i}" echo "n${i} IN CNAME ${NODENAME}${i}.${DOMAINNAME}." done } # db.127.0.0 setup_127() { echo " - Setting db.127.0.0 file" CONF_127="${WORKDIR}/db.127.0.0" perl -pi -e 's/DOMAINNAME/'$DOMAINNAME'/g' ${CONF_127} perl -pi -e 's/NAMEOFSERVER/'$NAMEOFSERVER'/g' ${CONF_127} } # db.localhost setup_localhost() { echo " - Setting db.locahost file" CONF_127="${WORKDIR}/db.localhost" perl -pi -e 's/DOMAINNAME/'$DOMAINNAME'/g' ${CONF_127} perl -pi -e 's/NAMEOFSERVER/'$NAMEOFSERVER'/g' ${CONF_127} } # named.conf setup_named() { CONF_NAMED="${WORKDIR}/named.conf" echo " - Setting named.conf file" if [ -z ${IPOFFORWARDER} ]; then perl -pi -e 's/IPOFFORWARDER\;//g' ${CONF_NAMED} else perl -pi -e 's/IPOFFORWARDER/'$IPOFFORWARDER'/g' ${CONF_NAMED} fi perl -pi -e 's/REVERSEIP/'$REVERSEIP'/g' ${CONF_NAMED} perl -pi -e 's/DOMAINNAME/'$DOMAINNAME'/g' ${CONF_NAMED} #perl -pi -e 's/DNSKEY/'$DNSKEY'/g' ${CONF_NAMED} } # update dnskey in rndc file setup_rndc() { CONF_RNDC="${WORKDIR}/rndc.conf" # perl -pi -e 's/DNSKEY/'$DNSKEY'/g' ${CONF_NAMED} } # db.REVERSEIP.hosts setup_dbreverse() { CONF_REVERSE="${WORKDIR}/db.${REVERSEIP}.hosts" echo " - Setting db.${REVERSEIP}.hosts file" cp -f ${WORKDIR}/db.REVERSEIP.hosts ${WORKDIR}/db.${REVERSEIP}.hosts perl -pi -e 's/DOMAINNAME/'$DOMAINNAME'/g' ${CONF_REVERSE} perl -pi -e 's/REVERSEIP/'$REVERSEIP'/g' ${CONF_REVERSE} perl -pi -e 's/NAMEOFSERVER/'$NAMEOFSERVER'/g' ${CONF_REVERSE} echo " - Generating list nodes for db.${REVERSE}.HOSTS" gen_reverse_list >> ${CONF_REVERSE} } # db.DOMAINNAME.hosts setup_dbdomain() { CONF_DOMAIN="${WORKDIR}/db.${DOMAINNAME}.hosts" echo " - Setting db.${DOMAINNAME}.hosts file" cp -f ${WORKDIR}/db.DOMAINNAME.hosts ${WORKDIR}/db.${DOMAINNAME}.hosts perl -pi -e 's/DOMAINNAME/'$DOMAINNAME'/g' ${CONF_DOMAIN} perl -pi -e 's/NAMEOFSERVER/'$NAMEOFSERVER'/g' ${CONF_DOMAIN} perl -pi -e 's/TEXTINFO/'$TEXTINFO'/g' ${CONF_DOMAIN} # perl -pi -e 's/IPSERVER/'$IPSERVER'/g' ${CONF_DOMAIN} echo " - Generating list nodes for db.${DOMAINNAME}.HOSTS" gen_domain_list >> ${CONF_DOMAIN} } # configuration of /etc/resolv.conf setup_resolv() { echo " - Setting resolv.conf file" cat > /etc/resolv.conf <<EOF domain $DOMAINNAME search $DOMAINNAME $ADDSEARCH nameserver $IPSERVER EOF } setup_hosts() { echo " - Setting hosts" cat > /etc/hosts <<EOF 127.0.0.1 localhost.localdomain localhost $IPSERVER $HOSTNAME EOF } # install file in correct place install_file() { echo " - Installing files in correct place" CONFFILE="/etc/named.conf" save_old_conf cp -f ${CONF_NAMED} /etc/named.conf CONFFILE="/etc/hosts" save_old_conf CONFFILE="${ZONE_DIR}/db.${DOMAINNAME}.hosts" save_old_conf cp -f ${CONF_DOMAIN} ${ZONE_DIR}/db.${DOMAINNAME}.hosts CONFFILE="${ZONE_DIR}/db.${REVERSEIP}.hosts" save_old_conf cp -f ${CONF_REVERSE} ${ZONE_DIR}/db.${REVERSEIP}.hosts cp -f ${WORKDIR}/root.hints ${ZONE_DIR}/root.hints CONFFILE="${ZONE_DIR}/db.127.0.0" save_old_conf cp -f ${CONF_127} ${ZONE_DIR}/db.127.0.0 CONFFILE="${ZONE_DIR}/db.localhost" save_old_conf cp -f ${CONF_127} ${ZONE_DIR}/db.localhost CONFFILE="/etc/rndc.conf" save_old_conf cp -f ${WORKDIR}/rndc.conf /etc/rndc.conf } # launch all functions launch_all() { check_range_ip check_hostname check_domain check_workdir check_zonedir create_typical_file setup_named setup_dbdomain setup_dbreverse setup_127 setup_localhost setup_rndc setup_resolv setup_hosts install_file } # check config of DNS check_all() { echo " - Checking config file" named-checkconf echo named-checkzone db.127.0.0 /var/named/zone/db.127.0.0 echo named-checkzone db.localhost /var/named/zone/db.localhost echo named-checkzone ${REVERSEIP} /var/named/zone/db.${REVERSEIP}.hosts echo named-checkzone ${DOMAINNAME} /var/named/zone/db.${DOMAINNAME}.hosts } #################################################### # main program #################################################### echo echo " Setting up DNS server with default configuration !" echo " Look in ${CONFFILE} to adjust DNS config" echo echo " Using those values to setup the DNS:" echo " |-----------------------------------------------------------" echo " | Hostname | ${NAMEOFSERVER}" echo " |-----------------------------------------------------------" echo " | IP of DNS server: | ${IPSERVER}" echo " |-----------------------------------------------------------" echo " | Domainname: | ${DOMAINNAME}" echo " |-----------------------------------------------------------" echo " | Forwarder: | ${IPOFFORWARDER}" echo " |-----------------------------------------------------------" echo " | IP range in DNS: | ${NORMIP}.${STARTNODE} - ${NORMIP}.${FINISHNODE}" echo " |-----------------------------------------------------------" echo " | First node: | ${NODENAME}${STARTNODE}" echo " |-----------------------------------------------------------" echo " | Last node: | ${NODENAME}${FINISHNODE}" echo " |-----------------------------------------------------------" echo " | File of DNS server: | ${ZONE_DIR}" echo " |-----------------------------------------------------------" echo sleep 3 launch_all check_all start_service