131110Swpaul#!/bin/sh 250479Speter# $FreeBSD: releng/11.0/usr.sbin/ypserv/ypinit.sh 289677 2015-10-21 05:37:09Z eadler $ 331110Swpaul# 4108470Sschweikh# ypinit.sh - setup a master or slave server. 531110Swpaul# (Taken from OpenBSD and modified for FreeBSD.) 631110Swpaul# 731110SwpaulDOMAINNAME=/bin/domainname 831110SwpaulHOSTNAME=/bin/hostname 931110SwpaulYPWHICH=/usr/bin/ypwhich 1031110SwpaulYPXFR=/usr/libexec/ypxfr 1131110SwpaulYP_DIR=/var/yp 1231110SwpaulMAKEDBM=/usr/sbin/yp_mkdb 1331110SwpaulMAPLIST="master.passwd.byname master.passwd.byuid passwd.byname passwd.byuid \ 1431110Swpaul group.byname group.bygid hosts.byname hosts.byaddr services.byname \ 1531110Swpaul rpc.byname rpc.bynumber networks.byname networks.byaddr netgroup \ 1631110Swpaul netgroup.byuser netgroup.byhost netid.byname publickey.byname \ 17286892Sasomers bootparams ethers.byname ethers.byaddr eui64.byname eui64.byid \ 18286892Sasomers amd.host mail.aliases ypservers protocols.byname protocols.bynumber \ 19286892Sasomers netmasks.byaddr" 2031110Swpaul 2131110SwpaulERROR_EXISTS="NO" 2231110Swpaulumask 077 2331110Swpaul 2431110Swpaul#set -xv 2531110Swpaul 2631110SwpaulERROR=USAGE # assume usage error 2731110Swpaul 2831110Swpaulif [ $# -eq 1 ] 2931110Swpaulthen 3031110Swpaul if [ $1 = "-m" ] # ypinit -m 3131110Swpaul then 3231110Swpaul DOMAIN=`${DOMAINNAME}` 3331110Swpaul SERVERTYPE=MASTER 3431110Swpaul ERROR= 3531110Swpaul fi 3631110Swpaul 3731110Swpaul if [ $1 = "-u" ] # ypinit -u 3831110Swpaul then 3931110Swpaul DOMAIN=`${DOMAINNAME}` 4031110Swpaul SERVERTYPE=UPDATE 4131110Swpaul ERROR= 4231110Swpaul fi 4331110Swpaulfi 4431110Swpaul 4531110Swpaulif [ $# -eq 2 ] 4631110Swpaulthen 4731110Swpaul if [ $1 = "-m" ] # ypinit -m domainname 4831110Swpaul then 4931110Swpaul DOMAIN=${2} 5031110Swpaul SERVERTYPE=MASTER 5131110Swpaul ERROR= 5231110Swpaul fi 5331110Swpaul 5431110Swpaul if [ $1 = "-s" ] # ypinit -s master_server 5531110Swpaul then 5631110Swpaul DOMAIN=`${DOMAINNAME}` 5731110Swpaul SERVERTYPE=SLAVE 5831110Swpaul MASTER=${2} 5931110Swpaul ERROR= 6031110Swpaul fi 6131110Swpaul 6231110Swpaul if [ $1 = "-u" ] # ypinit -u domainname 6331110Swpaul then 6431110Swpaul DOMAIN=${2} 6531110Swpaul SERVERTYPE=UPDATE 6631110Swpaul ERROR= 6731110Swpaul fi 6831110Swpaulfi 6931110Swpaul 7031110Swpaulif [ $# -eq 3 ] 7131110Swpaulthen 7231110Swpaul if [ $1 = "-s" ] # ypinit -s master_server domainname 7331110Swpaul then 7431110Swpaul DOMAIN=${3} 7531110Swpaul SERVERTYPE=SLAVE 7631110Swpaul MASTER=${2} 7731110Swpaul ERROR= 7831110Swpaul fi 7931110Swpaulfi 8031110Swpaul 8131110Swpaulif [ "${ERROR}" = "USAGE" ]; then 8231110Swpaul cat << \__usage 1>&2 8331110Swpaulusage: ypinit -m [domainname] 8431110Swpaul ypinit -s master_server [domainname] 8531110Swpaul ypinit -u [domainname] 8631110Swpaul 8731110SwpaulThe `-m' flag builds a master YP server, and the `-s' flag builds 8831110Swpaula slave YP server. When building a slave YP server, `master_server' 8931110Swpaulmust be an existing, reachable YP server. 9031110SwpaulThe `-u' is for updating the ypservers map on a master server. 9131110Swpaul__usage 9231110Swpaul 9331110Swpaul exit 1 9431110Swpaulfi 9531110Swpaul 9631110Swpaul# Check if domainname is set, don't accept an empty domainname 9731110Swpaulif [ -z "${DOMAIN}" ]; then 9831110Swpaul cat << \__no_domain 1>&2 9931110SwpaulThe local host's YP domain name has not been set. Please set it with 10031182Swpaulthe domainname(1) command or pass the domain as an argument to ypinit(8). 10131110Swpaul__no_domain 10231110Swpaul 10331110Swpaul exit 1 10431110Swpaulfi 10531110Swpaul 10631110Swpaul# Check if hostname is set, don't accept an empty hostname 10731110SwpaulHOST=`${HOSTNAME}` 10831110Swpaulif [ -z "${HOST}" ]; then 10931110Swpaul cat << \__no_hostname 1>&2 11031110SwpaulThe local host's hostname has not been set. Please set it with the 11131182Swpaulhostname(1) command. 11231110Swpaul__no_hostname 11331110Swpaul 11431110Swpaul exit 1 11531110Swpaulfi 11631110Swpaul 11731110Swpaul# Check if we have contact with master. 11831110Swpaul# If we can't list the maps on the master, then we fake it with a 11931110Swpaul# hard-coded list of maps. The FreeBSD ypxfr command will work even 12031110Swpaul# if ypbind isn't running or if we are bound to ourselves instead of 12131110Swpaul# the master (the slave should be bound to itself, but since it has 12231110Swpaul# no maps yet, we can't get a maplist from it). 12331110Swpaulif [ "${SERVERTYPE}" = "SLAVE" ]; 12431110Swpaulthen 12531110Swpaul COUNT=`${YPWHICH} -d ${DOMAIN} -m 2>/dev/null | grep -i ${MASTER} | wc -l | tr -d " "` 12631110Swpaul if [ "$COUNT" = "0" ] 12731110Swpaul then 12831110Swpaul echo "Can't enumerate maps from ${MASTER}. Please check that it is running." 1>&2 12931110Swpaul echo "Note: using hardcoded maplist for map transfers." 1>&2 13031110Swpaul YPMAPLIST=${MAPLIST} 13131110Swpaul else 13231110Swpaul YPMAPLIST=`${YPWHICH} -d ${DOMAIN} -m | cut -d\ -f1` 13331110Swpaul fi 13431110Swpaul echo "" 1>&2 13531110Swpaulfi 13631110Swpaul 13731110Swpaul# Check if user is root 13831110SwpaulID=`id -u` 13931110Swpaulif [ "${ID}" != "0" ]; then 14031110Swpaul echo "You have to be the superuser to run this. Please login as root." 1>&2 14131110Swpaul exit 1 14231110Swpaulfi 14331110Swpaul 14431110Swpaul# Check if the YP directory exists. 14531110Swpaul 14631110Swpaulif [ ! -d ${YP_DIR} -o -f ${YP_DIR} ] 14731110Swpaulthen 14831110Swpaul echo "The directory ${YP_DIR} doesn't exist. Restore it from the distribution." 1>&2 14931110Swpaul exit 1 15031110Swpaul 15131110Swpaulfi 15231110Swpaul 15331110Swpaulecho -n "Server Type: ${SERVERTYPE} Domain: ${DOMAIN}" 15431110Swpaulif [ "${SERVERTYPE}" = "SLAVE" ]; then 15531110Swpaul echo -n " Master: ${MASTER}" 15631110Swpaulfi 15731110Swpaulecho "" 15831110Swpaul 15931110Swpaulif [ "${SERVERTYPE}" != "UPDATE" ]; 16031110Swpaulthen 16131110Swpaul cat << \__notice1 16231110Swpaul 16331110SwpaulCreating an YP server will require that you answer a few questions. 16431110SwpaulQuestions will all be asked at the beginning of the procedure. 16531110Swpaul 16631110Swpaul__notice1 16731110Swpaul 16831110Swpaul echo -n "Do you want this procedure to quit on non-fatal errors? [y/n: n] " 16931110Swpaul read DOEXIT 17031110Swpaul 17131110Swpaul case ${DOEXIT} in 17231110Swpaul y*|Y*) 17331110Swpaul ERROR_EXIT="YES" 17431110Swpaul ;; 17531110Swpaul 17631110Swpaul *) ERROR_EXIT="NO" 17731110Swpaul echo "" 17831110Swpaul echo "Ok, please remember to go back and redo manually whatever fails." 17931110Swpaul echo "If you don't, something might not work. " 18031110Swpaul ;; 18131110Swpaul esac 18231110Swpaul 18331110Swpaul if [ -d "${YP_DIR}/${DOMAIN}" ]; then 184108470Sschweikh echo "" 18531110Swpaul echo -n "Can we destroy the existing ${YP_DIR}/${DOMAIN} and its contents? [y/n: n] " 18631110Swpaul read KILL 18731110Swpaul 18831110Swpaul ERROR= 18931110Swpaul case ${KILL} in 19031110Swpaul y*|Y*) 19131110Swpaul ERROR="DELETE" 19231110Swpaul ;; 19331110Swpaul 19431110Swpaul *) ERROR= 19531110Swpaul ;; 19631110Swpaul esac 19731110Swpaul 19831110Swpaul if [ "${ERROR}" = "DELETE" ]; then 19931110Swpaul if ! rm -rf ${YP_DIR}/${DOMAIN}; then 20031110Swpaul echo "Can't clean up old directory ${YP_DIR}/${DOMAIN}." 1>&2 20131110Swpaul exit 1 20231110Swpaul fi 20331110Swpaul else 20431110Swpaul echo "OK, please clean it up by hand and start again. Bye" 20531110Swpaul exit 0 20631110Swpaul fi 20731110Swpaul fi 20831110Swpaul 20931110Swpaul if ! mkdir "${YP_DIR}/${DOMAIN}"; then 21031110Swpaul echo "Can't make new directory ${YP_DIR}/${DOMAIN}." 1>&2 21131110Swpaul exit 1 21231110Swpaul fi 21331110Swpaulfi 21431110Swpaul 21531110Swpaulif [ "${SERVERTYPE}" = "MASTER" ]; 21631110Swpaulthen 21731110Swpaul 21831110Swpaul if [ ! -f ${YP_DIR}/Makefile ] 21931110Swpaul then 22031110Swpaul if [ ! -f ${YP_DIR}/Makefile.dist ] 22131110Swpaul then 22231110Swpaul echo "Can't find ${YP_DIR}/Makefile.dist. " 1>&2 22331110Swpaul exit 1 22431110Swpaul fi 22531110Swpaul cp ${YP_DIR}/Makefile.dist ${YP_DIR}/Makefile 22631110Swpaul fi 22731110Swpaul 22831110Swpaulfi 22931110Swpaul 23031110Swpaulif [ "${SERVERTYPE}" = "SLAVE" ]; 23131110Swpaulthen 23231110Swpaul 23331110Swpaul echo "There will be no further questions. The remainder of the procedure" 23431110Swpaul echo "should take a few minutes, to copy the databases from ${MASTER}." 23531110Swpaul 23631110Swpaul for MAP in ${YPMAPLIST} 23731110Swpaul do 238289677Seadler echo "Transferring ${MAP}..." 23931110Swpaul if ! ${YPXFR} -p ${YP_DIR} -h ${MASTER} -c -d ${DOMAIN} ${MAP}; then 24031110Swpaul echo "Can't transfer map ${MAP}." 1>&2 24131110Swpaul ERROR_EXISTS="YES" 24231110Swpaul if [ "${ERROR_EXIT}" = "YES" ]; then 24331110Swpaul exit 1 24431110Swpaul fi 24531110Swpaul fi 24631110Swpaul done 24731110Swpaul 24831110Swpaul echo "" 24931110Swpaul if [ "${ERROR_EXISTS}" = "YES" ]; then 25031110Swpaul echo "${HOST} has been setup as an YP slave server with errors. " 1>&2 25131110Swpaul echo "Please remember fix any problem that occurred." 1>&2 25231110Swpaul else 25331110Swpaul echo "${HOST} has been setup as an YP slave server without any errors. " 25431110Swpaul fi 25531110Swpaul 25631110Swpaul echo "Don't forget to update map ypservers on ${MASTER}." 25731110Swpaul exit 0 25831110Swpaulfi 25931110Swpaul 26031110SwpaulLIST_OK="NO" 26131110Swpaul 26231110Swpaulwhile [ "${LIST_OK}" = "NO" ]; 26331110Swpauldo 26431110Swpaul if [ "${SERVERTYPE}" = "MASTER" ]; 26531110Swpaul then 26631110Swpaul HOST_LIST="${HOST}" 26731110Swpaul echo "" 26831110Swpaul echo "At this point, we have to construct a list of this domains YP servers." 26931110Swpaul echo "${HOST} is already known as master server." 27031110Swpaul echo "Please continue to add any slave servers, one per line. When you are" 27131110Swpaul echo "done with the list, type a <control D>." 27231110Swpaul echo " master server : ${HOST}" 27331110Swpaul fi 27431110Swpaul 27531110Swpaul if [ "${SERVERTYPE}" = "UPDATE" ]; 27631110Swpaul then 27731110Swpaul HOST_LIST="${HOST}" 27831110Swpaul NEW_LIST="" 27931110Swpaul MASTER_NAME="" 28031110Swpaul SHORT_HOST=`echo ${HOST} | cut -d. -f1` 28131110Swpaul if [ -f ${YP_DIR}/${DOMAIN}/ypservers ]; 28231110Swpaul then 28331110Swpaul for srv in `${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep -v "^YP" | tr "\t" " " | cut -d\ -f1`; 28431110Swpaul do 28531110Swpaul short_srv=`echo ${srv} | cut -d. -f1` 28631110Swpaul if [ "${SHORT_HOST}" != "${short_srv}" ] 28731110Swpaul then 28831110Swpaul if [ "${NEW_LIST}" = "" ]; 28931110Swpaul then 29031110Swpaul NEW_LIST="${srv}" 29131110Swpaul else 29231110Swpaul NEW_LIST="${NEW_LIST} ${srv}" 29331110Swpaul fi 29431110Swpaul fi 29531110Swpaul done; 29631110Swpaul MASTER_NAME=`${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep "^YP_MASTER_NAME" | tr "\t" " " | cut -d\ -f2` 29731110Swpaul fi 29831110Swpaul echo "" 29931110Swpaul echo "Update the list of hosts running YP servers in domain ${DOMAIN}." 30031110Swpaul echo "Master for this domain is ${MASTER_NAME}." 30131110Swpaul echo "" 302201051Smarck echo "First verify old servers, type \\\\ to remove a server." 303108470Sschweikh echo "Then add new servers, one per line. When done type a <control D>." 30431110Swpaul echo "" 30531110Swpaul echo " master server : ${HOST}" 30631110Swpaul if [ "${NEW_LIST}" != "" ]; then 30731110Swpaul for node in $NEW_LIST; do 30831110Swpaul echo -n " verify host : [${node}] " 30931110Swpaul read verify 31031110Swpaul if [ "${verify}" != "\\" ]; then 31131110Swpaul HOST_LIST="${HOST_LIST} ${node}" 31231110Swpaul fi 31331110Swpaul done; 31431110Swpaul fi 31531110Swpaul fi 31631110Swpaul 31731110Swpaul echo -n " next host to add: " 31831110Swpaul 31931110Swpaul while read h 32031110Swpaul do 32131110Swpaul echo -n " next host to add: " 32231110Swpaul HOST_LIST="${HOST_LIST} ${h}" 32331110Swpaul done 32431110Swpaul 32531110Swpaul echo "" 32631110Swpaul echo "The current list of NIS servers looks like this:" 32731110Swpaul echo "" 32831110Swpaul 32931110Swpaul for h in `echo ${HOST_LIST}`; 33031110Swpaul do 33131110Swpaul echo ${h} 33231110Swpaul done 33331110Swpaul 33431110Swpaul echo "" 33531110Swpaul echo -n "Is this correct? [y/n: y] " 33631110Swpaul read hlist_ok 33731110Swpaul 33831110Swpaul case $hlist_ok in 33931110Swpaul n*) echo "Let's try the whole thing again...";; 34031110Swpaul N*) echo "Let's try the whole thing again...";; 34131110Swpaul *) LIST_OK="YES";; 34231110Swpaul esac 34331110Swpaul 34431110Swpauldone 34531110Swpaul 34631110Swpaulecho "Building ${YP_DIR}/${DOMAIN}/ypservers..." 34731110Swpaulrm -f ${YP_DIR}/ypservers 34831110Swpaultouch -f ${YP_DIR}/ypservers 34931110Swpaulrm -f ${YP_DIR}/${DOMAIN}/ypservers 35031110Swpaulfor host in ${HOST_LIST}; 35131110Swpauldo 35231110Swpaul echo "${host} ${host}" >> ${YP_DIR}/ypservers 35331110Swpaul echo "${host} ${host}" 35431110Swpauldone | ${MAKEDBM} - ${YP_DIR}/${DOMAIN}/ypservers 35531110Swpaul 35631110Swpaulif [ $? -ne 0 ]; then 35731110Swpaul echo "" 1>&2 35831110Swpaul echo "Couldn't build yp data base ${YP_DIR}/${DOMAIN}/ypservers." 1>&2 35931110Swpaul ERROR_EXISTS="YES" 360108470Sschweikh if [ "${ERROR_EXIT}" = "YES" ]; then 36131110Swpaul exit 1 36231110Swpaul fi 36331110Swpaulfi 36431110Swpaul 36531110Swpaulif [ "${SERVERTYPE}" = "MASTER" ]; then 36631110Swpaul CUR_PWD=`pwd` 36731110Swpaul cd ${YP_DIR} 36831110Swpaul echo "Running ${YP_DIR}/Makefile..." 36931110Swpaul if ! make NOPUSH=True UPDATE_DOMAIN=${DOMAIN} YP_DIR=${YP_DIR}; then 37031110Swpaul echo "" 1>&2 37131110Swpaul echo "Error running Makefile." 1>&2 37231110Swpaul ERROR_EXISTS="YES" 373108470Sschweikh if [ "${ERROR_EXIT}" = "YES" ]; then 37431110Swpaul exit 1 37531110Swpaul fi 37631110Swpaul fi 37731110Swpaul 37831110Swpaul cd ${CUR_PWD} 37931110Swpaul 38031110Swpaul echo "" 38131110Swpaul if [ "${ERROR_EXISTS}" = "YES" ]; then 38231110Swpaul echo "${HOST} has been setup as an YP master server with errors. " 1>&2 38331110Swpaul echo "Please remember fix any problem that occurred." 1>&2 38431110Swpaul else 38531110Swpaul echo "${HOST} has been setup as an YP master server without any errors. " 38631110Swpaul fi 38731110Swpaulfi 388