1#!/bin/sh 2# 3# $NetBSD: ypinit.sh,v 1.10 2001/08/01 07:01:03 garbled 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 16INSTALL=/usr/bin/install 17MAKEDBM=/usr/sbin/makedbm 18YPWHICH=/usr/bin/ypwhich 19YPXFR=/usr/sbin/ypxfr 20 21progname=`basename $0` 22yp_dir=/var/yp 23tmpfile=`mktemp /tmp/ypservers.XXXXXX` || exit 1 24trap "rm -f ${tmpfile} ; exit 0" EXIT INT QUIT 25 26umask 077 # protect created directories 27 28if [ `${ID} -u` != 0 ]; then 29 echo 1>&2 "$progname: you must be root to run this" 30 exit 1 31fi 32 33args=`getopt cl:ms: $*` 34if [ $? -eq 0 ]; then 35 set -- $args 36 for i; do 37 case $i in 38 "-c") 39 servertype=client 40 shift 41 ;; 42 "-m") 43 servertype=master 44 shift 45 ;; 46 "-s") 47 servertype=slave 48 master=${2} 49 shift 50 shift 51 ;; 52 "-l") 53 noninteractive=yes 54 serverlist=${2} 55 shift 56 shift 57 ;; 58 "--") 59 shift 60 break 61 ;; 62 esac 63 done 64 65 if [ $# -eq 1 ]; then 66 domain=${1} 67 shift; 68 else 69 domain=`${DOMAINNAME}` 70 fi 71fi 72 73if [ -z ${servertype} ]; then 74 cat 1>&2 << __usage 75usage: ${progname} -c [domainname] [-l server1,...,serverN] 76 ${progname} -m [domainname] [-l server1,...,serverN] 77 ${progname} -s master_server [domainname] [-l server1,...,serverN] 78 79The \`-c' flag sets up a YP client, the \`-m' flag builds a master YP 80server, and the \`-s' flag builds a slave YP server. When building a 81slave YP server, \`master_server' must be an existing, reachable YP server. 82__usage 83 exit 1 84fi 85 86# Check if domainname is set, don't accept an empty domainname 87if [ -z "${domain}" ]; then 88 cat << __no_domain 1>&2 89$progname: The local host's YP domain name has not been set. 90 Please set it with the domainname(1) command or pass the domain as 91 an argument to ${progname}. 92__no_domain 93 94 exit 1 95fi 96 97# Check if hostname is set, don't accept an empty hostname 98host=`${HOSTNAME}` 99if [ -z "${host}" ]; then 100 cat 1>&2 << __no_hostname 101$progname: The local host's hostname has not been set. 102 Please set it with the hostname(1) command. 103__no_hostname 104 105 exit 1 106fi 107if [ "${servertype}" = "slave" -a "${host}" = "${master}" ]; then 108 echo 1>&2 \ 109 "$progname: cannot setup a YP slave server off the local host." 110 exit 1 111fi 112 113# Check if the YP directory exists. 114if [ ! -d ${yp_dir} -o -f ${yp_dir} ]; then 115 cat 1>&2 << __no_dir 116$progname: The directory ${yp_dir} does not exist. 117 Restore it from the distribution. 118__no_dir 119 120 exit 1 121fi 122 123echo "Server type: ${servertype}" 124echo "Domain: ${domain}" 125if [ "${servertype}" = "slave" ]; then 126 echo "Master: ${master}" 127fi 128echo "" 129 130binding_dir=${yp_dir}/binding 131if [ ! -d ${binding_dir} ]; then 132$progname: The directory ${binding_dir} does not exist. 133 Restore it from the distribution. 134__no_dir 135 exit 1 136fi 137 138if [ -z "${noninteractive}" ]; then 139 cat << __client_setup 140A YP client needs a list of YP servers to bind to. 141Whilst ypbind supports -broadcast, its use is not recommended. 142__client_setup 143 144 done= 145 while [ -z "${done}" ]; do 146 > ${tmpfile} 147 cat <<__list_of_servers 148 149Please enter a list of YP servers, in order of preference. 150When finished, press RETURN on a blank line or enter EOF. 151 152__list_of_servers 153 154 if [ "${servertype}" != "client" ]; then 155 echo ${host} >> ${tmpfile} 156 echo " next host: ${host}"; 157 fi 158 echo -n " next host: "; 159 160 while read nextserver ; test -n "${nextserver}" 161 do 162 echo ${nextserver} >> ${tmpfile} 163 echo -n " next host: "; 164 done 165 166 if [ -s ${tmpfile} ]; then 167 echo "" 168 echo "The current servers are:" 169 echo "" 170 cat ${tmpfile} 171 echo "" 172 echo -n "Is this correct? [y/n: n] " 173 read DONE 174 case ${DONE} in 175 y*|Y*) 176 done=yes 177 ;; 178 esac 179 else 180 echo "" 181 echo "You have not supplied any servers." 182 fi 183 if [ -z "${done}" ]; then 184 echo -n "Do you wish to abort? [y/n: n] " 185 read ABORT 186 case ${ABORT} in 187 y*|Y*) 188 exit 0 189 ;; 190 esac 191 fi 192 done 193else # interacive 194 if [ "${servertype}" != "client" ]; then 195 echo ${host} >> ${tmpfile} 196 fi 197 echo "${serverlist}" | sed -e 's/,/\ 198/g' >> ${tmpfile} 199#the above newline is required 200 echo "" 201 echo "The current servers are:" 202 echo "" 203 cat ${tmpfile} 204 echo "" 205fi # interactive 206 207if [ -s ${tmpfile} ]; then 208 ${INSTALL} -c -m 0444 ${tmpfile} ${binding_dir}/${domain}.ypservers 209fi 210 211if [ "${servertype}" = "client" ]; then 212 exit 0 213fi 214 215cat << __notice1 216 217Installing the YP database may require that you answer a few questions. 218Any configuration questions will be asked at the beginning of the procedure. 219 220__notice1 221 222if [ -d "${yp_dir}/${domain}" ]; then 223 echo "Can we destroy the existing ${yp_dir}/${domain}" 224 echo -n "and its contents? [y/n: n] " 225 read KILL 226 227 case ${KILL} in 228 y*|Y*) 229 rm -rf ${yp_dir}/${domain} 230 if [ $? != 0 ]; then 231 echo 1>&2 \ 232 "$progname: Can't clean up old directory ${yp_dir}/${domain}" 233 exit 1 234 fi 235 ;; 236 237 *) 238 echo "OK, please clean it up by hand and start again." 239 exit 0 240 ;; 241 esac 242fi 243 244if ! mkdir "${yp_dir}/${domain}"; then 245 echo 1>&2 "$progname: Can't make new directory ${yp_dir}/${domain}" 246 exit 1 247fi 248 249case ${servertype} in 250master) 251 if [ ! -f ${yp_dir}/Makefile ]; then 252 if [ ! -f ${yp_dir}/Makefile.main ]; then 253 echo 1>&2 \ 254 "$progname: Can't find ${yp_dir}/Makefile.main" 255 exit 1 256 fi 257 cp ${yp_dir}/Makefile.main ${yp_dir}/Makefile 258 fi 259 260 subdir=`grep "^SUBDIR=" ${yp_dir}/Makefile` 261 262 if [ -z "${subdir}" ]; then 263 echo 1>&2 \ 264 "$progname: Can't find line starting with 'SUBDIR=' in ${yp_dir}/Makefile" 265 exit 1 266 fi 267 268 newsubdir="SUBDIR=" 269 for dir in `echo ${subdir} | cut -c8-255`; do 270 if [ "${dir}" != "${domain}" ]; then 271 newsubdir="${newsubdir} ${dir}" 272 fi 273 done 274 newsubdir="${newsubdir} ${domain}" 275 276 if [ -f ${yp_dir}/Makefile.tmp ]; then 277 rm ${yp_dir}/Makefile.tmp 278 fi 279 280 mv ${yp_dir}/Makefile ${yp_dir}/Makefile.tmp 281 sed -e "s/^${subdir}/${newsubdir}/" ${yp_dir}/Makefile.tmp > \ 282 ${yp_dir}/Makefile 283 rm ${yp_dir}/Makefile.tmp 284 285 if [ ! -f ${yp_dir}/Makefile.yp ]; then 286 echo 1>&2 "$progname: Can't find ${yp_dir}/Makefile.yp" 287 exit 1 288 fi 289 290 cp ${yp_dir}/Makefile.yp ${yp_dir}/${domain}/Makefile 291 292 # Create `ypservers' with own name, so that yppush won't 293 # lose when we run "make". 294 ( 295 cd ${yp_dir}/${domain} 296 echo "$host $host" > ypservers 297 ${MAKEDBM} ypservers ypservers 298 ) 299 300 echo "Done. Be sure to run \`make' in ${yp_dir}." 301 302 ;; 303 304slave) 305 echo "" 306 307 maps=`${YPWHICH} -d ${domain} -h ${master} -f -m 2>/dev/null | \ 308 awk '{ if (substr($2, 1, length("'$master'")) == "'$master'") \ 309 print $1; }'` 310 311 if [ -z "${maps}" ]; then 312 cat 1>&2 << __no_maps 313$progname: Can't find any maps for ${domain} on ${master} 314 Please check that the appropriate YP service is running. 315__no_maps 316 exit 1 317 fi 318 319 for map in ${maps}; do 320 echo "Transferring ${map}..." 321 if ! ${YPXFR} -h ${master} -c -d ${domain} ${map}; then 322 echo 1>&2 "$progname: Can't transfer map ${map}" 323 exit 1 324 fi 325 done 326 327 cat << __dont_forget 328 329Don't forget to update the \`ypservers' on ${master}, 330by adding an entry similar to: 331 ${host} ${host} 332 333__dont_forget 334 exit 0 335 336 ;; 337 338*) 339 echo 1>&2 "$progname: unknown servertype \`${servertype}'" 340 exit 1 341esac 342