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