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