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