]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - usr.sbin/ypserv/ypinit.sh
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / usr.sbin / ypserv / ypinit.sh
1 #!/bin/sh
2 # $FreeBSD$
3 #
4 # ypinit.sh - setup a master or slave server.
5 # (Taken from OpenBSD and modified for FreeBSD.)
6 #
7 DOMAINNAME=/bin/domainname
8 HOSTNAME=/bin/hostname
9 YPWHICH=/usr/bin/ypwhich
10 YPXFR=/usr/libexec/ypxfr
11 YP_DIR=/var/yp
12 MAKEDBM=/usr/sbin/yp_mkdb
13 MAPLIST="master.passwd.byname master.passwd.byuid passwd.byname passwd.byuid \
14          group.byname group.bygid hosts.byname hosts.byaddr services.byname \
15          rpc.byname rpc.bynumber networks.byname networks.byaddr netgroup \
16          netgroup.byuser netgroup.byhost netid.byname publickey.byname \
17          bootparams ethers.byname ethers.byaddr amd.host mail.aliases \
18          ypservers protocols.byname protocols.bynumber netmasks.byaddr"
19
20 ERROR_EXISTS="NO"
21 umask 077
22
23 #set -xv
24
25 ERROR=USAGE                             # assume usage error
26
27 if [ $# -eq 1 ]
28 then
29         if [ $1 = "-m" ]                # ypinit -m
30         then
31                 DOMAIN=`${DOMAINNAME}`
32                 SERVERTYPE=MASTER
33                 ERROR=
34         fi
35
36         if [ $1 = "-u" ]                # ypinit -u
37         then
38                 DOMAIN=`${DOMAINNAME}`
39                 SERVERTYPE=UPDATE
40                 ERROR=
41         fi
42 fi
43
44 if [ $# -eq 2 ]
45 then
46         if [ $1 = "-m" ]                # ypinit -m domainname
47         then
48                 DOMAIN=${2}
49                 SERVERTYPE=MASTER
50                 ERROR=
51         fi
52
53         if [ $1 = "-s" ]                # ypinit -s master_server
54         then
55                 DOMAIN=`${DOMAINNAME}`
56                 SERVERTYPE=SLAVE
57                 MASTER=${2}
58                 ERROR=
59         fi
60
61         if [ $1 = "-u" ]                # ypinit -u domainname
62         then
63                 DOMAIN=${2}
64                 SERVERTYPE=UPDATE
65                 ERROR=
66         fi
67 fi
68
69 if [ $# -eq 3 ]
70 then
71         if [ $1 = "-s" ]                # ypinit -s master_server domainname
72         then
73                 DOMAIN=${3}
74                 SERVERTYPE=SLAVE
75                 MASTER=${2}
76                 ERROR=
77         fi
78 fi
79
80 if [ "${ERROR}" = "USAGE" ]; then
81         cat << \__usage 1>&2
82 usage: ypinit -m [domainname]
83        ypinit -s master_server [domainname]
84        ypinit -u [domainname]
85
86 The `-m' flag builds a master YP server, and the `-s' flag builds
87 a slave YP server.  When building a slave YP server, `master_server'
88 must be an existing, reachable YP server.
89 The `-u' is for updating the ypservers map on a master server.
90 __usage
91
92         exit 1
93 fi
94
95 # Check if domainname is set, don't accept an empty domainname
96 if [ -z "${DOMAIN}" ]; then
97         cat << \__no_domain 1>&2
98 The local host's YP domain name has not been set.  Please set it with
99 the domainname(1) command or pass the domain as an argument to ypinit(8).
100 __no_domain
101
102         exit 1
103 fi
104
105 # Check if hostname is set, don't accept an empty hostname
106 HOST=`${HOSTNAME}`
107 if [ -z "${HOST}" ]; then
108         cat << \__no_hostname 1>&2
109 The local host's hostname has not been set.  Please set it with the
110 hostname(1) command.
111 __no_hostname
112
113         exit 1
114 fi
115
116 # Check if we have contact with master.
117 # If we can't list the maps on the master, then we fake it with a
118 # hard-coded list of maps. The FreeBSD ypxfr command will work even
119 # if ypbind isn't running or if we are bound to ourselves instead of
120 # the master (the slave should be bound to itself, but since it has
121 # no maps yet, we can't get a maplist from it).
122 if [ "${SERVERTYPE}" = "SLAVE" ];
123 then
124         COUNT=`${YPWHICH} -d ${DOMAIN} -m 2>/dev/null | grep -i ${MASTER} | wc -l | tr -d " "`
125         if [ "$COUNT" = "0" ]
126         then
127                 echo "Can't enumerate maps from ${MASTER}. Please check that it is running." 1>&2
128                 echo "Note: using hardcoded maplist for map transfers." 1>&2
129                 YPMAPLIST=${MAPLIST}
130         else
131                 YPMAPLIST=`${YPWHICH} -d ${DOMAIN} -m | cut -d\  -f1`
132         fi
133         echo "" 1>&2
134 fi
135
136 # Check if user is root
137 ID=`id -u`
138 if [ "${ID}" != "0" ]; then
139         echo "You have to be the superuser to run this.  Please login as root." 1>&2
140         exit 1
141 fi
142
143 # Check if the YP directory exists.
144
145 if [ ! -d ${YP_DIR} -o -f ${YP_DIR} ]
146 then
147         echo "The directory ${YP_DIR} doesn't exist.  Restore it from the distribution." 1>&2
148         exit 1
149
150 fi
151
152 echo -n "Server Type: ${SERVERTYPE} Domain: ${DOMAIN}"
153 if [ "${SERVERTYPE}" = "SLAVE" ]; then
154         echo -n " Master: ${MASTER}"
155 fi
156 echo ""
157
158 if [ "${SERVERTYPE}" != "UPDATE" ];
159 then
160         cat << \__notice1
161
162 Creating an YP server will require that you answer a few questions.
163 Questions will all be asked at the beginning of the procedure.
164
165 __notice1
166
167         echo -n "Do you want this procedure to quit on non-fatal errors? [y/n: n]  "
168         read DOEXIT
169
170         case ${DOEXIT} in
171         y*|Y*)
172                 ERROR_EXIT="YES"
173                 ;;
174
175         *)      ERROR_EXIT="NO"
176                 echo ""
177                 echo "Ok, please remember to go back and redo manually whatever fails."
178                 echo "If you don't, something might not work. "
179                 ;;
180         esac
181
182         if [ -d "${YP_DIR}/${DOMAIN}" ]; then
183                 echo ""
184                 echo -n "Can we destroy the existing ${YP_DIR}/${DOMAIN} and its contents? [y/n: n]  "
185                 read KILL
186
187                 ERROR=
188                 case ${KILL} in
189                 y*|Y*)
190                         ERROR="DELETE"
191                         ;;
192
193                 *)      ERROR=
194                         ;;
195                 esac
196
197                 if [ "${ERROR}" = "DELETE" ]; then
198                         if ! rm -rf ${YP_DIR}/${DOMAIN}; then
199                                 echo "Can't clean up old directory ${YP_DIR}/${DOMAIN}." 1>&2
200                                 exit 1
201                         fi
202                 else
203                         echo "OK, please clean it up by hand and start again.  Bye"
204                         exit 0
205                 fi
206         fi
207
208         if ! mkdir "${YP_DIR}/${DOMAIN}"; then
209                 echo "Can't make new directory ${YP_DIR}/${DOMAIN}." 1>&2
210                 exit 1
211         fi
212 fi
213
214 if [ "${SERVERTYPE}" = "MASTER" ];
215 then
216
217         if [ ! -f ${YP_DIR}/Makefile ]
218         then
219                 if [ ! -f ${YP_DIR}/Makefile.dist ]
220                 then
221                         echo "Can't find ${YP_DIR}/Makefile.dist. " 1>&2
222                         exit 1
223                 fi
224                 cp ${YP_DIR}/Makefile.dist ${YP_DIR}/Makefile
225         fi
226
227 fi
228
229 if [ "${SERVERTYPE}" = "SLAVE" ];
230 then
231
232         echo "There will be no further questions. The remainder of the procedure"
233         echo "should take a few minutes, to copy the databases from ${MASTER}."
234
235         for MAP in ${YPMAPLIST}
236         do
237                 echo "Transfering ${MAP}..."
238                 if ! ${YPXFR} -p ${YP_DIR} -h ${MASTER} -c -d ${DOMAIN} ${MAP}; then
239                         echo "Can't transfer map ${MAP}." 1>&2
240                         ERROR_EXISTS="YES"
241                         if [ "${ERROR_EXIT}" = "YES" ]; then
242                                 exit 1
243                         fi
244                 fi
245         done
246
247         echo ""
248         if [ "${ERROR_EXISTS}" = "YES"  ]; then
249                 echo "${HOST} has been setup as an YP slave server with errors. " 1>&2
250                 echo "Please remember fix any problem that occurred." 1>&2
251         else
252                 echo "${HOST} has been setup as an YP slave server without any errors. "
253         fi
254
255         echo "Don't forget to update map ypservers on ${MASTER}."
256         exit 0
257 fi
258
259 LIST_OK="NO"
260
261 while [ "${LIST_OK}" = "NO" ];
262 do
263         if [ "${SERVERTYPE}" = "MASTER" ];
264         then
265                 HOST_LIST="${HOST}"
266                 echo ""
267                 echo "At this point, we have to construct a list of this domains YP servers."
268                 echo "${HOST} is already known as master server."
269                 echo "Please continue to add any slave servers, one per line. When you are"
270                 echo "done with the list, type a <control D>."
271                 echo "  master server   :  ${HOST}"
272         fi
273
274         if [ "${SERVERTYPE}" = "UPDATE" ];
275         then
276                 HOST_LIST="${HOST}"
277                 NEW_LIST=""
278                 MASTER_NAME=""
279                 SHORT_HOST=`echo ${HOST} | cut -d. -f1`
280                 if [ -f ${YP_DIR}/${DOMAIN}/ypservers ];
281                 then
282                         for srv in `${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep -v "^YP" | tr "\t" " " | cut -d\  -f1`;
283                         do
284                                 short_srv=`echo ${srv} | cut -d. -f1`
285                                 if [ "${SHORT_HOST}" != "${short_srv}" ]
286                                 then
287                                         if [ "${NEW_LIST}" = "" ];
288                                         then
289                                                 NEW_LIST="${srv}"
290                                         else
291                                                 NEW_LIST="${NEW_LIST} ${srv}"
292                                         fi
293                                 fi
294                         done;
295                         MASTER_NAME=`${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep "^YP_MASTER_NAME" | tr "\t" " " | cut -d\  -f2`
296                 fi
297                 echo ""
298                 echo "Update the list of hosts running YP servers in domain ${DOMAIN}."
299                 echo "Master for this domain is ${MASTER_NAME}."
300                 echo ""
301                 echo "First verify old servers, type \\\\ to remove a server."
302                 echo "Then add new servers, one per line. When done type a <control D>."
303                 echo ""
304                 echo "  master server   :  ${HOST}"
305                 if [ "${NEW_LIST}" != "" ]; then
306                         for node in $NEW_LIST; do
307                                 echo -n "       verify host     : [${node}] "
308                                 read verify
309                                 if [ "${verify}" != "\\" ]; then
310                                         HOST_LIST="${HOST_LIST} ${node}"
311                                 fi
312                         done;
313                 fi
314         fi
315
316         echo -n "       next host to add:  "
317
318         while read h
319         do
320                 echo -n "       next host to add:  "
321                 HOST_LIST="${HOST_LIST} ${h}"
322         done
323
324         echo ""
325         echo "The current list of NIS servers looks like this:"
326         echo ""
327
328         for h in `echo ${HOST_LIST}`;
329         do
330                 echo ${h}
331         done
332
333         echo ""
334         echo -n "Is this correct?  [y/n: y]  "
335         read hlist_ok
336
337         case $hlist_ok in
338         n*)     echo "Let's try the whole thing again...";;
339         N*)     echo "Let's try the whole thing again...";;
340         *)      LIST_OK="YES";;
341         esac
342
343 done
344
345 echo "Building ${YP_DIR}/${DOMAIN}/ypservers..."
346 rm -f ${YP_DIR}/ypservers
347 touch -f ${YP_DIR}/ypservers
348 rm -f ${YP_DIR}/${DOMAIN}/ypservers
349 for host in ${HOST_LIST};
350 do
351         echo "${host} ${host}" >> ${YP_DIR}/ypservers
352         echo "${host} ${host}"
353 done | ${MAKEDBM} - ${YP_DIR}/${DOMAIN}/ypservers
354
355 if [ $? -ne 0 ]; then
356         echo "" 1>&2
357         echo "Couldn't build yp data base ${YP_DIR}/${DOMAIN}/ypservers." 1>&2
358         ERROR_EXISTS="YES"
359         if [ "${ERROR_EXIT}" = "YES" ]; then
360                 exit 1
361         fi
362 fi
363
364 if [ "${SERVERTYPE}" = "MASTER" ]; then
365         CUR_PWD=`pwd`
366         cd ${YP_DIR}
367         echo "Running ${YP_DIR}/Makefile..."
368         if ! make NOPUSH=True UPDATE_DOMAIN=${DOMAIN} YP_DIR=${YP_DIR}; then
369                 echo "" 1>&2
370                 echo "Error running Makefile." 1>&2
371                 ERROR_EXISTS="YES"
372                 if [ "${ERROR_EXIT}" = "YES" ]; then
373                         exit 1
374                 fi
375         fi
376
377         cd ${CUR_PWD}
378
379         echo ""
380         if [ "${ERROR_EXISTS}" = "YES" ]; then
381                 echo "${HOST} has been setup as an YP master server with errors. " 1>&2
382                 echo "Please remember fix any problem that occurred." 1>&2
383         else
384                 echo "${HOST} has been setup as an YP master server without any errors. "
385         fi
386 fi