xref: /netbsd/usr.sbin/ypserv/ypinit/Makefile.yp (revision bf9ec67e)
1#	$NetBSD: Makefile.yp,v 1.18 2001/08/06 18:28:19 christos Exp $
2#
3# This is the YP Makefile, used to create and push YP maps.
4#
5
6# Invoke with NOPUSH != "" to prevent the maps from being yppushed upon rebuild
7#
8NOPUSH?=	""
9
10# Password maps in standard YP are insecure, because the pw_passwd
11# field is accessible by any user. FreeBSD, NetBSD and OpenBSD have
12# a common solution: a secure map (generated with makedbm -s) can
13# only be accessed by a client bound to a privileged port.
14#
15# Uncomment out the following if you need compatibility with
16# sites that don't support this feature.
17#
18#INSECURE?=	yes
19
20# In addition, by adding shadow to the list of rules we support
21# linux and solaris type shadow maps.
22
23YPDBDIR=	/var/yp
24DIR=		/etc
25AMDDIR=		/etc/amd
26AMDMAPS=	amd.home
27DOMAIN=		${.CURDIR:T}
28
29AWK=		/usr/bin/awk
30CAT=		/bin/cat
31CP=		/bin/cp
32CUT=		/usr/bin/cut
33ECHO=		/bin/echo
34EGREP=		/usr/bin/egrep
35MAKEDBM=	/usr/sbin/makedbm
36MAKEDBM_S=	${MAKEDBM} -s
37MKALIAS=	/usr/sbin/mkalias
38MKNETID=	/usr/sbin/mknetid
39REVNETGROUP=	/usr/sbin/revnetgroup
40RM=		/bin/rm
41SED=		/usr/bin/sed
42SENDMAIL=	/usr/sbin/sendmail
43SORT=		/usr/bin/sort
44STDETHERS=	/usr/sbin/stdethers
45STDHOSTS=	/usr/sbin/stdhosts
46TOUCH=		/usr/bin/touch
47YPPUSH=		/usr/sbin/yppush
48
49
50# We have a rule for ypservers, but we don't build it by default, since
51# it seldom changes (only when slaves are added/deleted).
52
53all: passwd aliases ${AMDMAPS} ethers group hosts ipnodes netgroup networks rpc services protocols netid
54
55__makedbmesc:	.USEBEFORE
56	if [ -f ${.ALLSRC} ]; then \
57		${SED} -e "s/#.*$$//" ${.ALLSRC} | \
58		${AWK} '{ \
59			if (NF == 0) \
60			    printf("\n"); \
61			else { \
62			    for (i = 1; i <= NF; i++) { \
63				if (i == NF) { \
64				    if (substr($$i, length($$i), 1) == "\\") { \
65					printf("%s", substr($$i, 1, \
66					    length($$i) - 1)); \
67				    } else \
68					printf("%s\n", $$i); \
69				} else \
70				    printf("%s ", $$i); \
71			    } \
72			} \
73		    }' | \
74		${SED} -e "/^[ \t]*$$/d" | \
75		${SORT} | ${MAKEDBM} - ${.ALLSRC:T}; \
76	fi
77
78passwd.time: ${DIR}/master.passwd
79	-@if [ -f ${.ALLSRC} ]; then \
80		umask 077 ; \
81		if [ "${INSECURE}" != "yes" ]; then \
82			${CAT} ${.ALLSRC} | ${CUT} -d: -f1-4,8-10 | \
83			${AWK} 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
84			{ print $$1, $$1":*:"$$3":"$$4":"$$5":"$$6":"$$7 }' -|\
85			${SORT} | ${MAKEDBM} - passwd.byname; \
86			${CAT} ${.ALLSRC} | ${CUT} -d: -f1-4,8-10 |\
87			${AWK} 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
88			{ print $$3, $$1":*:"$$3":"$$4":"$$5":"$$6":"$$7 }' -|\
89			${SORT} | ${MAKEDBM} - passwd.byuid; \
90		else \
91			${CAT} ${.ALLSRC} | ${CUT} -d: -f1-4,8-10 | \
92			${AWK} 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
93			{ print $$1, $$0 }' - | ${SORT} | \
94			${MAKEDBM} - passwd.byname; \
95			${CAT} ${.ALLSRC} | ${CUT} -d: -f1-4,8-10 |\
96			${AWK} 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
97			{ print $$3, $$0 }' - | ${SORT} | \
98			${MAKEDBM} - passwd.byuid; \
99		fi; \
100		${CAT} ${.ALLSRC} | \
101		${AWK} 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
102		{ print $$1, $$0 }' - | ${SORT} | \
103		${MAKEDBM_S} - master.passwd.byname; \
104		${CAT} ${.ALLSRC} | \
105		${AWK} 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
106		{ print $$3, $$0 }' - | ${SORT} | \
107		${MAKEDBM_S} - master.passwd.byuid; \
108		${TOUCH} ${.TARGET}; \
109		${ECHO} "updated passwd"; \
110		if [ ! ${NOPUSH} ]; then \
111			${YPPUSH} -d ${DOMAIN} passwd.byname; \
112			${YPPUSH} -d ${DOMAIN} passwd.byuid; \
113			${YPPUSH} -d ${DOMAIN} master.passwd.byname; \
114			${YPPUSH} -d ${DOMAIN} master.passwd.byuid; \
115			${ECHO} "pushed passwd"; \
116		else \
117			: ; \
118		fi \
119	else \
120		${ECHO} "couldn't find ${.ALLSRC}"; \
121	fi
122
123# XXX: This does not do modify/expire time correctly.
124shadow.time: ${DIR}/master.passwd
125	-@if [ -f ${.ALLSRC} ]; then \
126		umask 077 ; \
127		${CAT} ${.ALLSRC} | ${CUT} -d: -f1-2 | \
128		${AWK} 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
129		{ print $$1, $$0":10779:0:99999:7:::" }' - | \
130		${SORT} | ${MAKEDBM_S} - shadow.byname; \
131		${TOUCH} ${.TARGET}; \
132		${ECHO} "updated shadow"; \
133		if [ ! ${NOPUSH} ]; then \
134			${YPPUSH} -d ${DOMAIN} shadow.byname; \
135			${ECHO} "pushed shadow"; \
136		else \
137			: ; \
138		fi \
139	else \
140		${ECHO} "couldn't find ${.ALLSRC}"; \
141	fi
142
143aliases.time: ${DIR}/mail/aliases
144	-@if [ -f ${.ALLSRC} ]; then \
145		${CP} -p ${.ALLSRC} ${DOMAIN}-aliases; \
146		${SENDMAIL} -bi -oA${PWD}/${DOMAIN}-aliases; \
147		${MAKEDBM} -u ${DOMAIN}-aliases | ${SORT} | \
148		${EGREP} -v '(YP_LAST_MODIFIED|YP_MASTER_NAME)' | \
149		${MAKEDBM} - mail.aliases; \
150		${MKALIAS} mail.aliases mail.byaddr; \
151		${TOUCH} ${.TARGET}; \
152		${RM} ${DOMAIN}-aliases.db ${DOMAIN}-aliases; \
153		${ECHO} "updated aliases"; \
154		if [ ! ${NOPUSH} ]; then \
155			${YPPUSH} -d ${DOMAIN} mail.aliases; \
156			${YPPUSH} -d ${DOMAIN} mail.byaddr; \
157			${ECHO} "pushed aliases"; \
158		else \
159			: ; \
160		fi \
161	else \
162		${ECHO} "couldn't find ${.ALLSRC}"; \
163	fi
164
165
166.for MAP in ${AMDMAPS}
167${MAP}.time: ${AMDDIR}/${MAP} __makedbmesc
168	-@if [ -f ${.ALLSRC} ]; then \
169		${TOUCH} ${.TARGET}; \
170		${ECHO} "updated ${MAP}"; \
171		if [ ! ${NOPUSH} ]; then \
172			${YPPUSH} -d ${DOMAIN} ${MAP}; \
173			${ECHO} "pushed ${MAP}"; \
174		else \
175			: ; \
176		fi \
177	else \
178		${ECHO} "couldn't find ${.ALLSRC}"; \
179	fi
180.endfor # AMDMAPS
181
182
183ethers.time: ${DIR}/ethers
184	-@if [ -f ${.ALLSRC} ]; then \
185		${STDETHERS} ${.ALLSRC} | ${SED} -e s/#.*$$// | \
186		${AWK} 'BEGIN { FS="\t"; OFS="\t"; } { print $$1, $$0 }' | \
187		${SORT} | ${MAKEDBM} - ethers.byaddr; \
188		${STDETHERS} ${.ALLSRC} | \
189		${AWK} 'BEGIN { FS="\t"; OFS="\t"; } { print $$2, $$0 }' | \
190		${SORT} | ${MAKEDBM} - ethers.byname; \
191		${TOUCH} ${.TARGET}; \
192		${ECHO} "updated ethers"; \
193		if [ ! ${NOPUSH} ]; then \
194			${YPPUSH} -d ${DOMAIN} ethers.byaddr; \
195			${YPPUSH} -d ${DOMAIN} ethers.byname; \
196			${ECHO} "pushed ethers"; \
197		else \
198			: ; \
199		fi \
200	else \
201		${ECHO} "couldn't find ${.ALLSRC}"; \
202	fi
203
204
205group.time: ${DIR}/group
206	-@if [ -f ${.ALLSRC} ]; then \
207		${AWK} 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
208		    { print $$1, $$0 }' ${.ALLSRC} | \
209		${SORT} | ${MAKEDBM} - group.byname; \
210		${AWK} 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ \
211		    { print $$3, $$0 }' ${.ALLSRC} | \
212		${SORT} | ${MAKEDBM} - group.bygid; \
213		${TOUCH} ${.TARGET}; \
214		${ECHO} "updated group"; \
215		if [ ! ${NOPUSH} ]; then \
216			${YPPUSH} -d ${DOMAIN} group.byname; \
217			${YPPUSH} -d ${DOMAIN} group.bygid; \
218			${ECHO} "pushed group"; \
219		else \
220			: ; \
221		fi \
222	else \
223		${ECHO} "couldn't find ${.ALLSRC}"; \
224	fi
225
226
227# Solaris 8 does the following:
228# - /etc/hosts and hosts.{byname,byaddr} are IPv4 only.
229# - /etc/inet/ipnodes and ipnodes.{byname,byaddr} are used for protocol
230#   independent name-to-address mapping.
231#
232# For local name resolution, we made /etc/hosts protocol independent.
233# For NIS name resolution, we obey Solaris 8 practice.
234# - We keep hosts.{byname,byaddr} IPv4 only, to be friendly with Solaris 8
235#   clients.
236# - ipnodes.{byname,byaddr} is used for protocol independent mapping.
237# We generate all the mappings from /etc/hosts, for compatibility with NetBSD
238# local name resolution.
239#
240hosts.time: ${DIR}/hosts
241	-@if [ -f ${.ALLSRC} ]; then \
242		${STDHOSTS} ${.ALLSRC} | ${SED} -e s/#.*$$// | \
243		${AWK} '{for (i = 2; i <= NF; i++) print $$i, $$0 }' | \
244		${SORT} | ${MAKEDBM} - hosts.byname; \
245		${STDHOSTS} ${.ALLSRC} | \
246		${AWK} 'BEGIN { OFS="\t"; } { print $$1, $$0 }' | \
247		${SORT} | ${MAKEDBM} - hosts.byaddr; \
248		${TOUCH} ${.TARGET}; \
249		${ECHO} "updated hosts"; \
250		if [ ! ${NOPUSH} ]; then \
251			${YPPUSH} -d ${DOMAIN} hosts.byname; \
252			${YPPUSH} -d ${DOMAIN} hosts.byaddr; \
253			${ECHO} "pushed hosts"; \
254		else \
255			: ; \
256		fi \
257	else \
258		${ECHO} "couldn't find ${.ALLSRC}"; \
259	fi
260
261
262ipnodes.time: ${DIR}/hosts
263	-@if [ -f ${.ALLSRC} ]; then \
264		${STDHOSTS} -n ${.ALLSRC} | ${SED} -e s/#.*$$// | \
265		${AWK} '{for (i = 2; i <= NF; i++) print $$i, $$0 }' | \
266		${SORT} | ${MAKEDBM} - ipnodes.byname; \
267		${STDHOSTS} -n ${.ALLSRC} | \
268		${AWK} 'BEGIN { OFS="\t"; } { print $$1, $$0 }' | \
269		${SORT} | ${MAKEDBM} - ipnodes.byaddr; \
270		${TOUCH} ${.TARGET}; \
271		${ECHO} "updated ipnodes"; \
272		if [ ! ${NOPUSH} ]; then \
273			${YPPUSH} -d ${DOMAIN} ipnodes.byname; \
274			${YPPUSH} -d ${DOMAIN} ipnodes.byaddr; \
275			${ECHO} "pushed ipnodes"; \
276		else \
277			: ; \
278		fi \
279	else \
280		${ECHO} "couldn't find ${.ALLSRC}"; \
281	fi
282
283
284netgroup.time: ${DIR}/netgroup __makedbmesc
285	-@if [ -f ${.ALLSRC} ]; then \
286		${CAT} ${.ALLSRC} | ${REVNETGROUP} -u -f - | \
287		${SORT} | ${MAKEDBM} - netgroup.byuser; \
288		${CAT} ${.ALLSRC} | ${REVNETGROUP} -h -f - | \
289		${SORT} | ${MAKEDBM} - netgroup.byhost; \
290		${TOUCH} ${.TARGET}; \
291		${ECHO} "updated netgroup"; \
292		if [ ! ${NOPUSH} ]; then \
293			${YPPUSH} -d ${DOMAIN} netgroup; \
294			${YPPUSH} -d ${DOMAIN} netgroup.byuser; \
295			${YPPUSH} -d ${DOMAIN} netgroup.byhost; \
296			${ECHO} "pushed netgroup"; \
297		else \
298			: ; \
299		fi \
300	else \
301		${ECHO} "couldn't find ${.ALLSRC}"; \
302	fi
303
304
305networks.time: ${DIR}/networks
306	-@if [ -f ${.ALLSRC} ]; then \
307		${SED} -e "/^#/d" -e s/#.*$$// ${.ALLSRC} | \
308		${AWK} '{print $$1, $$0; \
309		    for (i = 3;i <= NF;i++) print $$i,$$0}' | \
310		${SORT} | ${MAKEDBM} - networks.byname; \
311		${AWK} 'BEGIN { OFS="\t"; } $$1 !~ /^#/ { print $$2, $$0 }' \
312		    ${.ALLSRC} | \
313		${SORT} | ${MAKEDBM} - networks.byaddr; \
314		${TOUCH} ${.TARGET}; \
315		${ECHO} "updated networks"; \
316		if [ ! ${NOPUSH} ]; then \
317			${YPPUSH} -d ${DOMAIN} networks.byname; \
318			${YPPUSH} -d ${DOMAIN} networks.byaddr; \
319			${ECHO} "pushed networks"; \
320		else \
321			: ; \
322		fi \
323	else \
324		${ECHO} "couldn't find ${.ALLSRC}"; \
325	fi
326
327
328protocols.time: ${DIR}/protocols
329	-@if [ -f ${.ALLSRC} ]; then \
330		${AWK} 'BEGIN { OFS="\t"; } $$1 !~ /^#/ { print $$2, $$0 }' \
331		    ${.ALLSRC} | \
332		${SORT} | ${MAKEDBM} - protocols.bynumber; \
333		${SED} -e "/^#/d" -e s/#.*$$// ${.ALLSRC} | \
334		${AWK} '{print $$1, $$0; \
335		    for (i = 3;i <= NF;i++) print $$i,$$0}' | \
336		${SORT} | ${MAKEDBM} - protocols.byname; \
337		${TOUCH} ${.TARGET}; \
338		${ECHO} "updated protocols"; \
339		if [ ! ${NOPUSH} ]; then \
340			${YPPUSH} -d ${DOMAIN} protocols.bynumber; \
341			${YPPUSH} -d ${DOMAIN} protocols.byname; \
342			${ECHO} "pushed protocols"; \
343		else \
344			: ; \
345		fi \
346	else \
347		${ECHO} "couldn't find ${.ALLSRC}"; \
348	fi
349
350
351rpc.time: ${DIR}/rpc
352	-@if [ -f ${.ALLSRC} ]; then \
353		${AWK} 'BEGIN { OFS="\t"; } $$1 !~ /^#/ { print $$2, $$0 }' \
354		    ${.ALLSRC} | \
355		${SORT} | ${MAKEDBM} - rpc.bynumber; \
356		${TOUCH} ${.TARGET}; \
357		${ECHO} "updated rpc"; \
358		if [ ! ${NOPUSH} ]; then \
359			${YPPUSH} -d ${DOMAIN} rpc.bynumber; \
360			${ECHO} "pushed rpc"; \
361		else \
362			: ; \
363		fi \
364	else \
365		${ECHO} "couldn't find ${.ALLSRC}"; \
366	fi
367
368
369services.time: ${DIR}/services
370	-@if [ -f ${.ALLSRC} ]; then \
371		${AWK} 'BEGIN { OFS="\t"; } $$1 !~ /^#/ { print $$2, $$0 }' \
372		    ${.ALLSRC} | \
373		${SORT} | ${MAKEDBM} - services.byname; \
374		${TOUCH} ${.TARGET}; \
375		${ECHO} "updated services"; \
376		if [ ! ${NOPUSH} ]; then \
377			${YPPUSH} -d ${DOMAIN} services.byname; \
378			${ECHO} "pushed services"; \
379		else \
380			: ; \
381		fi \
382	else \
383		${ECHO} "couldn't find ${.ALLSRC}"; \
384	fi
385
386
387netid.time: ${DIR}/passwd ${DIR}/group ${DIR}/hosts ${DIR}/netid
388	-@${MKNETID} -q -d ${DOMAIN} -p ${DIR}/passwd -g ${DIR}/group -h \
389	      ${DIR}/hosts -m ${DIR}/netid | \
390	  ${SORT} | ${MAKEDBM} - netid.byname; \
391	  ${TOUCH} ${.TARGET}; \
392	  ${ECHO} "updated netid"; \
393	  if [ ! ${NOPUSH} ]; then \
394		${YPPUSH} -d ${DOMAIN} netid.byname; \
395		${ECHO} "pushed netid"; \
396	  else \
397		: ; \
398	  fi
399
400
401ypservers.time: ${.CURDIR}/ypservers
402	-@${MAKEDBM} ypservers ypservers; \
403	${TOUCH} ${.TARGET}; \
404	${ECHO} "updated ypservers"; \
405	if [ ! ${NOPUSH} ]; then \
406		${YPPUSH} -d ${DOMAIN} ypservers; \
407		${ECHO} "pushed ypservers"; \
408	else \
409		: ; \
410	fi
411
412
413passwd: passwd.time
414group: group.time
415hosts: hosts.time
416ipnodes: ipnodes.time
417aliases: aliases.time
418.for MAP in ${AMDMAPS}
419${MAP}: ${MAP}.time
420.endfor # AMDMAPS
421ethers: ethers.time
422netgroup: netgroup.time
423networks: networks.time
424rpc: rpc.time
425services: services.time
426shadow: shadow.time
427protocols: protocols.time
428netid: netid.time
429ypservers: ypservers.time
430
431${DIR}/passwd:
432${DIR}/group:
433${DIR}/hosts:
434${DIR}/mail/aliases:
435.for MAP in ${AMDMAPS}
436${AMDDIR}/${MAP}:
437.endfor # AMDMAPS
438${DIR}/ethers:
439${DIR}/master.passwd:
440${DIR}/netgroup:
441${DIR}/networks:
442${DIR}/rpc:
443${DIR}/services:
444${DIR}/protocols:
445${DIR}/netid:
446