1#!/bin/sh 2# 3# $NetBSD: ypinit.sh,v 1.7 1997/11/18 00:44:19 lukem Exp $ 4# 5# ypinit.sh - setup a master or slave YP server 6# 7# Originally written by Mats O Jansson <moj@stacken.kth.se> 8# Modified by Jason R. Thorpe <thorpej@NetBSD.ORG> 9# Reworked by Luke Mewburn <lukem@netbsd.org> 10# 11 12PATH=/bin:/usr/sbin:/usr/bin:${PATH} 13DOMAINNAME=/bin/domainname 14HOSTNAME=/bin/hostname 15ID=/usr/bin/id 16MAKEDBM=/usr/sbin/makedbm 17YPWHICH=/usr/bin/ypwhich 18YPXFR=/usr/sbin/ypxfr 19 20progname=`basename $0` 21yp_dir=/var/yp 22error=usage # assume usage error 23 24umask 077 # protect created directories 25 26if [ `${ID} -u` != 0 ]; then 27 echo 1>&2 "$progname: you must be root to run this" 28 exit 1 29fi 30 31case $# in 321) 33 if [ $1 = "-m" ]; then # ypinit -m 34 domain=`${DOMAINNAME}` 35 servertype=master 36 error= 37 fi 38 ;; 39 402) 41 if [ $1 = "-m" ]; then # ypinit -m domainname 42 domain=${2} 43 servertype=master 44 error= 45 fi 46 if [ $1 = "-s" ]; then # ypinit -s master_server 47 domain=`${DOMAINNAME}` 48 servertype=slave 49 master=${2} 50 error= 51 fi 52 ;; 53 543) 55 if [ $1 = "-s" ]; then # ypinit -s master_server domainname 56 domain=${3} 57 servertype=slave 58 master=${2} 59 error= 60 fi 61 ;; 62esac 63 64if [ "${error}" = "usage" ]; then 65 cat 1>&2 << __usage 66usage: ${progname} -m [domainname] 67 ${progname} -s master_server [domainname] 68 69The \`-m' flag builds a master YP server, and the \`-s' flag builds 70a slave YP server. When building a slave YP server, \`master_server' 71must be an existing, reachable YP server. 72__usage 73 74 exit 1 75fi 76 77# Check if domainname is set, don't accept an empty domainname 78if [ -z "${domain}" ]; then 79 cat << __no_domain 1>&2 80$progname: The local host's YP domain name has not been set. 81 Please set it with the domainname(1) command or pass the domain as 82 an argument to ${progname}. 83__no_domain 84 85 exit 1 86fi 87 88# Check if hostname is set, don't accept an empty hostname 89host=`${HOSTNAME}` 90if [ -z "${host}" ]; then 91 cat 1>&2 << __no_hostname 92$progname: The local host's hostname has not been set. 93 Please set it with the hostname(1) command. 94__no_hostname 95 96 exit 1 97fi 98 99# Check if the YP directory exists. 100if [ ! -d ${yp_dir} -o -f ${yp_dir} ]; then 101 cat 1>&2 << __no_dir 102$progname: The directory ${yp_dir} does not exist. 103 Restore it from the distribution. 104__no_dir 105 106 exit 1 107fi 108 109echo "Server type: ${servertype}" 110echo "Domain: ${domain}" 111if [ "${servertype}" != "master" ]; then 112 echo "Master: ${master}" 113fi 114echo "" 115cat << __notice1 116 117Installing the YP database may require that you answer a few questions. 118Any configuration questions will be asked at the beginning of the procedure. 119 120__notice1 121 122if [ -d "${yp_dir}/${domain}" ]; then 123 echo "Can we destroy the existing ${yp_dir}/${domain}" 124 echo -n "and its contents? [y/n: n] " 125 read KILL 126 127 error= 128 case ${KILL} in 129 y*|Y*) 130 error="delete" 131 ;; 132 133 *) 134 error= 135 ;; 136 esac 137 138 if [ "${error}" = "delete" ]; then 139 rm -rf ${yp_dir}/${domain} 140 if [ $? != 0 ]; then 141 echo 1>&2 \ 142 "$progname: Can't clean up old directory ${yp_dir}/${domain}" 143 exit 1 144 fi 145 else 146 echo "OK, please clean it up by hand and start again." 147 exit 0 148 fi 149fi 150 151if ! mkdir "${yp_dir}/${domain}"; then 152 echo 1>&2 "$progname: Can't make new directory ${yp_dir}/${domain}" 153 exit 1 154fi 155 156case ${servertype} in 157master) 158 if [ ! -f ${yp_dir}/Makefile ]; then 159 if [ ! -f ${yp_dir}/Makefile.main ]; then 160 echo 1>&2 \ 161 "$progname: Can't find ${yp_dir}/Makefile.main" 162 exit 1 163 fi 164 cp ${yp_dir}/Makefile.main ${yp_dir}/Makefile 165 fi 166 167 subdir=`grep "^SUBDIR=" ${yp_dir}/Makefile` 168 169 if [ -z "${subdir}" ]; then 170 echo 1>&2 \ 171 "$progname: Can't find line starting with 'SUBDIR=' in ${yp_dir}/Makefile" 172 exit 1 173 fi 174 175 newsubdir="SUBDIR=" 176 for dir in `echo ${subdir} | cut -c8-255`; do 177 if [ "${dir}" != "${domain}" ]; then 178 newsubdir="${newsubdir} ${dir}" 179 fi 180 done 181 newsubdir="${newsubdir} ${domain}" 182 183 if [ -f ${yp_dir}/Makefile.tmp ]; then 184 rm ${yp_dir}/Makefile.tmp 185 fi 186 187 mv ${yp_dir}/Makefile ${yp_dir}/Makefile.tmp 188 sed -e "s/^${subdir}/${newsubdir}/" ${yp_dir}/Makefile.tmp > \ 189 ${yp_dir}/Makefile 190 rm ${yp_dir}/Makefile.tmp 191 192 if [ ! -f ${yp_dir}/Makefile.yp ]; then 193 echo 1>&2 "$progname: Can't find ${yp_dir}/Makefile.yp" 194 exit 1 195 fi 196 197 cp ${yp_dir}/Makefile.yp ${yp_dir}/${domain}/Makefile 198 199 # Create `ypservers' with own name, so that yppush won't 200 # lose when we run "make". 201 ( 202 cd ${yp_dir}/${domain} 203 echo "$host $host" > ypservers 204 ${MAKEDBM} ypservers ypservers 205 ) 206 207 echo "Done. Be sure to run \`make' in ${yp_dir}." 208 209 ;; 210 211slave) 212 echo "" 213 214 maps=`${YPWHICH} -d ${domain} -h ${master} -f -m 2>/dev/null | \ 215 awk '{ if (substr($2, 1, length("'$master'")) == "'$master'") \ 216 print $1; }'` 217 218 if [ -z "${maps}" ]; then 219 cat 1>&2 << __no_maps 220$progname: Can't find any maps for ${domain} on ${master} 221 Please check that the appropriate YP service is running. 222__no_maps 223 exit 1 224 fi 225 226 for map in ${maps}; do 227 echo "Transferring ${map}..." 228 if ! ${YPXFR} -h ${master} -c -d ${domain} ${map}; then 229 echo 1>&2 "$progname: Can't transfer map ${map}" 230 exit 1 231 fi 232 done 233 234 cat << __dont_forget 235 236Don't forget to update the \`ypservers' on ${master}, 237by adding an entry similar to: 238 ${host} ${host} 239 240__dont_forget 241 exit 0 242 243 ;; 244 245*) 246 echo 1>&2 "$progname: unknown servertype \`${servertype}'" 247 exit 1 248esac 249