113170f18SBill Paul#!/bin/sh 213170f18SBill Paul# 3d64ada50SJens Schweikhardt# ypinit.sh - setup a master or slave server. 413170f18SBill Paul# (Taken from OpenBSD and modified for FreeBSD.) 513170f18SBill Paul# 613170f18SBill PaulDOMAINNAME=/bin/domainname 713170f18SBill PaulHOSTNAME=/bin/hostname 813170f18SBill PaulYPWHICH=/usr/bin/ypwhich 913170f18SBill PaulYPXFR=/usr/libexec/ypxfr 1013170f18SBill PaulYP_DIR=/var/yp 1113170f18SBill PaulMAKEDBM=/usr/sbin/yp_mkdb 1213170f18SBill PaulMAPLIST="master.passwd.byname master.passwd.byuid passwd.byname passwd.byuid \ 1313170f18SBill Paul group.byname group.bygid hosts.byname hosts.byaddr services.byname \ 1413170f18SBill Paul rpc.byname rpc.bynumber networks.byname networks.byaddr netgroup \ 1513170f18SBill Paul netgroup.byuser netgroup.byhost netid.byname publickey.byname \ 16fac7bc23SAlan Somers bootparams ethers.byname ethers.byaddr eui64.byname eui64.byid \ 17fac7bc23SAlan Somers amd.host mail.aliases ypservers protocols.byname protocols.bynumber \ 18fac7bc23SAlan Somers netmasks.byaddr" 1913170f18SBill Paul 2013170f18SBill PaulERROR_EXISTS="NO" 2113170f18SBill Paulumask 077 2213170f18SBill Paul 2313170f18SBill Paul#set -xv 2413170f18SBill Paul 2513170f18SBill PaulERROR=USAGE # assume usage error 2613170f18SBill Paul 2713170f18SBill Paulif [ $# -eq 1 ] 2813170f18SBill Paulthen 2913170f18SBill Paul if [ $1 = "-m" ] # ypinit -m 3013170f18SBill Paul then 3113170f18SBill Paul DOMAIN=`${DOMAINNAME}` 3213170f18SBill Paul SERVERTYPE=MASTER 3313170f18SBill Paul ERROR= 3413170f18SBill Paul fi 3513170f18SBill Paul 3613170f18SBill Paul if [ $1 = "-u" ] # ypinit -u 3713170f18SBill Paul then 3813170f18SBill Paul DOMAIN=`${DOMAINNAME}` 3913170f18SBill Paul SERVERTYPE=UPDATE 4013170f18SBill Paul ERROR= 4113170f18SBill Paul fi 4213170f18SBill Paulfi 4313170f18SBill Paul 4413170f18SBill Paulif [ $# -eq 2 ] 4513170f18SBill Paulthen 4613170f18SBill Paul if [ $1 = "-m" ] # ypinit -m domainname 4713170f18SBill Paul then 4813170f18SBill Paul DOMAIN=${2} 4913170f18SBill Paul SERVERTYPE=MASTER 5013170f18SBill Paul ERROR= 5113170f18SBill Paul fi 5213170f18SBill Paul 5313170f18SBill Paul if [ $1 = "-s" ] # ypinit -s master_server 5413170f18SBill Paul then 5513170f18SBill Paul DOMAIN=`${DOMAINNAME}` 5613170f18SBill Paul SERVERTYPE=SLAVE 5713170f18SBill Paul MASTER=${2} 5813170f18SBill Paul ERROR= 5913170f18SBill Paul fi 6013170f18SBill Paul 6113170f18SBill Paul if [ $1 = "-u" ] # ypinit -u domainname 6213170f18SBill Paul then 6313170f18SBill Paul DOMAIN=${2} 6413170f18SBill Paul SERVERTYPE=UPDATE 6513170f18SBill Paul ERROR= 6613170f18SBill Paul fi 6713170f18SBill Paulfi 6813170f18SBill Paul 6913170f18SBill Paulif [ $# -eq 3 ] 7013170f18SBill Paulthen 7113170f18SBill Paul if [ $1 = "-s" ] # ypinit -s master_server domainname 7213170f18SBill Paul then 7313170f18SBill Paul DOMAIN=${3} 7413170f18SBill Paul SERVERTYPE=SLAVE 7513170f18SBill Paul MASTER=${2} 7613170f18SBill Paul ERROR= 7713170f18SBill Paul fi 7813170f18SBill Paulfi 7913170f18SBill Paul 8013170f18SBill Paulif [ "${ERROR}" = "USAGE" ]; then 8113170f18SBill Paul cat << \__usage 1>&2 8213170f18SBill Paulusage: ypinit -m [domainname] 8313170f18SBill Paul ypinit -s master_server [domainname] 8413170f18SBill Paul ypinit -u [domainname] 8513170f18SBill Paul 8613170f18SBill PaulThe `-m' flag builds a master YP server, and the `-s' flag builds 8713170f18SBill Paula slave YP server. When building a slave YP server, `master_server' 8813170f18SBill Paulmust be an existing, reachable YP server. 8913170f18SBill PaulThe `-u' is for updating the ypservers map on a master server. 9013170f18SBill Paul__usage 9113170f18SBill Paul 9213170f18SBill Paul exit 1 9313170f18SBill Paulfi 9413170f18SBill Paul 9513170f18SBill Paul# Check if domainname is set, don't accept an empty domainname 9613170f18SBill Paulif [ -z "${DOMAIN}" ]; then 9713170f18SBill Paul cat << \__no_domain 1>&2 9813170f18SBill PaulThe local host's YP domain name has not been set. Please set it with 99d8207d54SBill Paulthe domainname(1) command or pass the domain as an argument to ypinit(8). 10013170f18SBill Paul__no_domain 10113170f18SBill Paul 10213170f18SBill Paul exit 1 10313170f18SBill Paulfi 10413170f18SBill Paul 10513170f18SBill Paul# Check if hostname is set, don't accept an empty hostname 10613170f18SBill PaulHOST=`${HOSTNAME}` 10713170f18SBill Paulif [ -z "${HOST}" ]; then 10813170f18SBill Paul cat << \__no_hostname 1>&2 10913170f18SBill PaulThe local host's hostname has not been set. Please set it with the 110d8207d54SBill Paulhostname(1) command. 11113170f18SBill Paul__no_hostname 11213170f18SBill Paul 11313170f18SBill Paul exit 1 11413170f18SBill Paulfi 11513170f18SBill Paul 11613170f18SBill Paul# Check if we have contact with master. 11713170f18SBill Paul# If we can't list the maps on the master, then we fake it with a 11813170f18SBill Paul# hard-coded list of maps. The FreeBSD ypxfr command will work even 11913170f18SBill Paul# if ypbind isn't running or if we are bound to ourselves instead of 12013170f18SBill Paul# the master (the slave should be bound to itself, but since it has 12113170f18SBill Paul# no maps yet, we can't get a maplist from it). 12213170f18SBill Paulif [ "${SERVERTYPE}" = "SLAVE" ]; 12313170f18SBill Paulthen 12413170f18SBill Paul COUNT=`${YPWHICH} -d ${DOMAIN} -m 2>/dev/null | grep -i ${MASTER} | wc -l | tr -d " "` 12513170f18SBill Paul if [ "$COUNT" = "0" ] 12613170f18SBill Paul then 12713170f18SBill Paul echo "Can't enumerate maps from ${MASTER}. Please check that it is running." 1>&2 12813170f18SBill Paul echo "Note: using hardcoded maplist for map transfers." 1>&2 12913170f18SBill Paul YPMAPLIST=${MAPLIST} 13013170f18SBill Paul else 13113170f18SBill Paul YPMAPLIST=`${YPWHICH} -d ${DOMAIN} -m | cut -d\ -f1` 13213170f18SBill Paul fi 13313170f18SBill Paul echo "" 1>&2 13413170f18SBill Paulfi 13513170f18SBill Paul 13613170f18SBill Paul# Check if user is root 13713170f18SBill PaulID=`id -u` 13813170f18SBill Paulif [ "${ID}" != "0" ]; then 13913170f18SBill Paul echo "You have to be the superuser to run this. Please login as root." 1>&2 14013170f18SBill Paul exit 1 14113170f18SBill Paulfi 14213170f18SBill Paul 14313170f18SBill Paul# Check if the YP directory exists. 14413170f18SBill Paul 14513170f18SBill Paulif [ ! -d ${YP_DIR} -o -f ${YP_DIR} ] 14613170f18SBill Paulthen 14713170f18SBill Paul echo "The directory ${YP_DIR} doesn't exist. Restore it from the distribution." 1>&2 14813170f18SBill Paul exit 1 14913170f18SBill Paul 15013170f18SBill Paulfi 15113170f18SBill Paul 15213170f18SBill Paulecho -n "Server Type: ${SERVERTYPE} Domain: ${DOMAIN}" 15313170f18SBill Paulif [ "${SERVERTYPE}" = "SLAVE" ]; then 15413170f18SBill Paul echo -n " Master: ${MASTER}" 15513170f18SBill Paulfi 15613170f18SBill Paulecho "" 15713170f18SBill Paul 15813170f18SBill Paulif [ "${SERVERTYPE}" != "UPDATE" ]; 15913170f18SBill Paulthen 16013170f18SBill Paul cat << \__notice1 16113170f18SBill Paul 16213170f18SBill PaulCreating an YP server will require that you answer a few questions. 16313170f18SBill PaulQuestions will all be asked at the beginning of the procedure. 16413170f18SBill Paul 16513170f18SBill Paul__notice1 16613170f18SBill Paul 16713170f18SBill Paul echo -n "Do you want this procedure to quit on non-fatal errors? [y/n: n] " 16813170f18SBill Paul read DOEXIT 16913170f18SBill Paul 17013170f18SBill Paul case ${DOEXIT} in 17113170f18SBill Paul y*|Y*) 17213170f18SBill Paul ERROR_EXIT="YES" 17313170f18SBill Paul ;; 17413170f18SBill Paul 17513170f18SBill Paul *) ERROR_EXIT="NO" 17613170f18SBill Paul echo "" 17713170f18SBill Paul echo "Ok, please remember to go back and redo manually whatever fails." 17813170f18SBill Paul echo "If you don't, something might not work. " 17913170f18SBill Paul ;; 18013170f18SBill Paul esac 18113170f18SBill Paul 18213170f18SBill Paul if [ -d "${YP_DIR}/${DOMAIN}" ]; then 18313170f18SBill Paul echo "" 18413170f18SBill Paul echo -n "Can we destroy the existing ${YP_DIR}/${DOMAIN} and its contents? [y/n: n] " 18513170f18SBill Paul read KILL 18613170f18SBill Paul 18713170f18SBill Paul ERROR= 18813170f18SBill Paul case ${KILL} in 18913170f18SBill Paul y*|Y*) 19013170f18SBill Paul ERROR="DELETE" 19113170f18SBill Paul ;; 19213170f18SBill Paul 19313170f18SBill Paul *) ERROR= 19413170f18SBill Paul ;; 19513170f18SBill Paul esac 19613170f18SBill Paul 19713170f18SBill Paul if [ "${ERROR}" = "DELETE" ]; then 19813170f18SBill Paul if ! rm -rf ${YP_DIR}/${DOMAIN}; then 19913170f18SBill Paul echo "Can't clean up old directory ${YP_DIR}/${DOMAIN}." 1>&2 20013170f18SBill Paul exit 1 20113170f18SBill Paul fi 20213170f18SBill Paul else 20313170f18SBill Paul echo "OK, please clean it up by hand and start again. Bye" 20413170f18SBill Paul exit 0 20513170f18SBill Paul fi 20613170f18SBill Paul fi 20713170f18SBill Paul 20813170f18SBill Paul if ! mkdir "${YP_DIR}/${DOMAIN}"; then 20913170f18SBill Paul echo "Can't make new directory ${YP_DIR}/${DOMAIN}." 1>&2 21013170f18SBill Paul exit 1 21113170f18SBill Paul fi 21213170f18SBill Paulfi 21313170f18SBill Paul 21413170f18SBill Paulif [ "${SERVERTYPE}" = "MASTER" ]; 21513170f18SBill Paulthen 21613170f18SBill Paul 21713170f18SBill Paul if [ ! -f ${YP_DIR}/Makefile ] 21813170f18SBill Paul then 21913170f18SBill Paul if [ ! -f ${YP_DIR}/Makefile.dist ] 22013170f18SBill Paul then 22113170f18SBill Paul echo "Can't find ${YP_DIR}/Makefile.dist. " 1>&2 22213170f18SBill Paul exit 1 22313170f18SBill Paul fi 22413170f18SBill Paul cp ${YP_DIR}/Makefile.dist ${YP_DIR}/Makefile 22513170f18SBill Paul fi 22613170f18SBill Paul 22713170f18SBill Paulfi 22813170f18SBill Paul 22913170f18SBill Paulif [ "${SERVERTYPE}" = "SLAVE" ]; 23013170f18SBill Paulthen 23113170f18SBill Paul 23213170f18SBill Paul echo "There will be no further questions. The remainder of the procedure" 23313170f18SBill Paul echo "should take a few minutes, to copy the databases from ${MASTER}." 23413170f18SBill Paul 23513170f18SBill Paul for MAP in ${YPMAPLIST} 23613170f18SBill Paul do 237*463a577bSEitan Adler echo "Transferring ${MAP}..." 23813170f18SBill Paul if ! ${YPXFR} -p ${YP_DIR} -h ${MASTER} -c -d ${DOMAIN} ${MAP}; then 23913170f18SBill Paul echo "Can't transfer map ${MAP}." 1>&2 24013170f18SBill Paul ERROR_EXISTS="YES" 24113170f18SBill Paul if [ "${ERROR_EXIT}" = "YES" ]; then 24213170f18SBill Paul exit 1 24313170f18SBill Paul fi 24413170f18SBill Paul fi 24513170f18SBill Paul done 24613170f18SBill Paul 24713170f18SBill Paul echo "" 24813170f18SBill Paul if [ "${ERROR_EXISTS}" = "YES" ]; then 24913170f18SBill Paul echo "${HOST} has been setup as an YP slave server with errors. " 1>&2 25013170f18SBill Paul echo "Please remember fix any problem that occurred." 1>&2 25113170f18SBill Paul else 25213170f18SBill Paul echo "${HOST} has been setup as an YP slave server without any errors. " 25313170f18SBill Paul fi 25413170f18SBill Paul 25513170f18SBill Paul echo "Don't forget to update map ypservers on ${MASTER}." 25613170f18SBill Paul exit 0 25713170f18SBill Paulfi 25813170f18SBill Paul 25913170f18SBill PaulLIST_OK="NO" 26013170f18SBill Paul 26113170f18SBill Paulwhile [ "${LIST_OK}" = "NO" ]; 26213170f18SBill Pauldo 26313170f18SBill Paul if [ "${SERVERTYPE}" = "MASTER" ]; 26413170f18SBill Paul then 26513170f18SBill Paul HOST_LIST="${HOST}" 26613170f18SBill Paul echo "" 26713170f18SBill Paul echo "At this point, we have to construct a list of this domains YP servers." 26813170f18SBill Paul echo "${HOST} is already known as master server." 26913170f18SBill Paul echo "Please continue to add any slave servers, one per line. When you are" 27013170f18SBill Paul echo "done with the list, type a <control D>." 27113170f18SBill Paul echo " master server : ${HOST}" 27213170f18SBill Paul fi 27313170f18SBill Paul 27413170f18SBill Paul if [ "${SERVERTYPE}" = "UPDATE" ]; 27513170f18SBill Paul then 27613170f18SBill Paul HOST_LIST="${HOST}" 27713170f18SBill Paul NEW_LIST="" 27813170f18SBill Paul MASTER_NAME="" 27913170f18SBill Paul SHORT_HOST=`echo ${HOST} | cut -d. -f1` 28013170f18SBill Paul if [ -f ${YP_DIR}/${DOMAIN}/ypservers ]; 28113170f18SBill Paul then 28213170f18SBill Paul for srv in `${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep -v "^YP" | tr "\t" " " | cut -d\ -f1`; 28313170f18SBill Paul do 28413170f18SBill Paul short_srv=`echo ${srv} | cut -d. -f1` 28513170f18SBill Paul if [ "${SHORT_HOST}" != "${short_srv}" ] 28613170f18SBill Paul then 28713170f18SBill Paul if [ "${NEW_LIST}" = "" ]; 28813170f18SBill Paul then 28913170f18SBill Paul NEW_LIST="${srv}" 29013170f18SBill Paul else 29113170f18SBill Paul NEW_LIST="${NEW_LIST} ${srv}" 29213170f18SBill Paul fi 29313170f18SBill Paul fi 29413170f18SBill Paul done; 29513170f18SBill Paul MASTER_NAME=`${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep "^YP_MASTER_NAME" | tr "\t" " " | cut -d\ -f2` 29613170f18SBill Paul fi 29713170f18SBill Paul echo "" 29813170f18SBill Paul echo "Update the list of hosts running YP servers in domain ${DOMAIN}." 29913170f18SBill Paul echo "Master for this domain is ${MASTER_NAME}." 30013170f18SBill Paul echo "" 301a5574348SDmitry Morozovsky echo "First verify old servers, type \\\\ to remove a server." 30213170f18SBill Paul echo "Then add new servers, one per line. When done type a <control D>." 30313170f18SBill Paul echo "" 30413170f18SBill Paul echo " master server : ${HOST}" 30513170f18SBill Paul if [ "${NEW_LIST}" != "" ]; then 30613170f18SBill Paul for node in $NEW_LIST; do 30713170f18SBill Paul echo -n " verify host : [${node}] " 30813170f18SBill Paul read verify 30913170f18SBill Paul if [ "${verify}" != "\\" ]; then 31013170f18SBill Paul HOST_LIST="${HOST_LIST} ${node}" 31113170f18SBill Paul fi 31213170f18SBill Paul done; 31313170f18SBill Paul fi 31413170f18SBill Paul fi 31513170f18SBill Paul 31613170f18SBill Paul echo -n " next host to add: " 31713170f18SBill Paul 31813170f18SBill Paul while read h 31913170f18SBill Paul do 32013170f18SBill Paul echo -n " next host to add: " 32113170f18SBill Paul HOST_LIST="${HOST_LIST} ${h}" 32213170f18SBill Paul done 32313170f18SBill Paul 32413170f18SBill Paul echo "" 32513170f18SBill Paul echo "The current list of NIS servers looks like this:" 32613170f18SBill Paul echo "" 32713170f18SBill Paul 32813170f18SBill Paul for h in `echo ${HOST_LIST}`; 32913170f18SBill Paul do 33013170f18SBill Paul echo ${h} 33113170f18SBill Paul done 33213170f18SBill Paul 33313170f18SBill Paul echo "" 33413170f18SBill Paul echo -n "Is this correct? [y/n: y] " 33513170f18SBill Paul read hlist_ok 33613170f18SBill Paul 33713170f18SBill Paul case $hlist_ok in 33813170f18SBill Paul n*) echo "Let's try the whole thing again...";; 33913170f18SBill Paul N*) echo "Let's try the whole thing again...";; 34013170f18SBill Paul *) LIST_OK="YES";; 34113170f18SBill Paul esac 34213170f18SBill Paul 34313170f18SBill Pauldone 34413170f18SBill Paul 34513170f18SBill Paulecho "Building ${YP_DIR}/${DOMAIN}/ypservers..." 34613170f18SBill Paulrm -f ${YP_DIR}/ypservers 34713170f18SBill Paultouch -f ${YP_DIR}/ypservers 34813170f18SBill Paulrm -f ${YP_DIR}/${DOMAIN}/ypservers 34913170f18SBill Paulfor host in ${HOST_LIST}; 35013170f18SBill Pauldo 35113170f18SBill Paul echo "${host} ${host}" >> ${YP_DIR}/ypservers 35213170f18SBill Paul echo "${host} ${host}" 35313170f18SBill Pauldone | ${MAKEDBM} - ${YP_DIR}/${DOMAIN}/ypservers 35413170f18SBill Paul 35513170f18SBill Paulif [ $? -ne 0 ]; then 35613170f18SBill Paul echo "" 1>&2 35713170f18SBill Paul echo "Couldn't build yp data base ${YP_DIR}/${DOMAIN}/ypservers." 1>&2 35813170f18SBill Paul ERROR_EXISTS="YES" 35913170f18SBill Paul if [ "${ERROR_EXIT}" = "YES" ]; then 36013170f18SBill Paul exit 1 36113170f18SBill Paul fi 36213170f18SBill Paulfi 36313170f18SBill Paul 36413170f18SBill Paulif [ "${SERVERTYPE}" = "MASTER" ]; then 36513170f18SBill Paul CUR_PWD=`pwd` 36613170f18SBill Paul cd ${YP_DIR} 36713170f18SBill Paul echo "Running ${YP_DIR}/Makefile..." 36813170f18SBill Paul if ! make NOPUSH=True UPDATE_DOMAIN=${DOMAIN} YP_DIR=${YP_DIR}; then 36913170f18SBill Paul echo "" 1>&2 37013170f18SBill Paul echo "Error running Makefile." 1>&2 37113170f18SBill Paul ERROR_EXISTS="YES" 37213170f18SBill Paul if [ "${ERROR_EXIT}" = "YES" ]; then 37313170f18SBill Paul exit 1 37413170f18SBill Paul fi 37513170f18SBill Paul fi 37613170f18SBill Paul 37713170f18SBill Paul cd ${CUR_PWD} 37813170f18SBill Paul 37913170f18SBill Paul echo "" 38013170f18SBill Paul if [ "${ERROR_EXISTS}" = "YES" ]; then 38113170f18SBill Paul echo "${HOST} has been setup as an YP master server with errors. " 1>&2 38213170f18SBill Paul echo "Please remember fix any problem that occurred." 1>&2 38313170f18SBill Paul else 38413170f18SBill Paul echo "${HOST} has been setup as an YP master server without any errors. " 38513170f18SBill Paul fi 38613170f18SBill Paulfi 387