1#! /usr/bin/sh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License, Version 1.0 only
7# (the "License").  You may not use this file except in compliance
8# with the License.
9#
10# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11# or http://www.opensolaris.org/os/licensing.
12# See the License for the specific language governing permissions
13# and limitations under the License.
14#
15# When distributing Covered Code, include this CDDL HEADER in each
16# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17# If applicable, add the following below this CDDL HEADER, with the
18# fields enclosed by brackets "[]" replaced with your own identifying
19# information: Portions Copyright [yyyy] [name of copyright owner]
20#
21# CDDL HEADER END
22#
23#
24# ident	"%Z%%M%	%I%	%E% SMI"
25#
26# Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
27# Use is subject to license terms.
28#
29# ypmap2src -- script to generate source files from YP maps.
30#
31
32
33# Please save a copy of this script before making any changes.
34
35
36usage()
37{
38echo "Usage: $PROG [-t] [[-c custom-map-name] ...] [-d domain] -o output-directory [[source-file] ...]"
39echo " t - Generate source files from TRADITIONAL NIS MAPS, default is NIS2LDAP maps."
40echo " c - Name of the custom map for which source file needs to be generated."
41echo " d - Specify a different domain, default is local system domain name."
42echo " o - Specify the output directory where source files can be generated."
43echo "source-file - The name of the source file for which needs to be generated."
44exit 0
45}
46
47parse_argument()
48{
49while getopts "tc:d:o:" ARG
50do
51  case $ARG in
52
53    t) N2LPREFIX=""
54       MAP_LIST="$NIS_ONLY_MAP_LIST"
55       ;;
56    c) CUST_LIST="$CUST_LIST $OPTARG"
57       ;;
58    d) DOMAIN=$OPTARG
59       MAPDIR=/var/yp/"$DOMAIN"
60       ;;
61    o) OUTDIR=$OPTARG
62       ;;
63    *) echo "ERROR : Invalid argument"
64       usage
65       exit 1
66       ;;
67  esac
68done
69
70# This is to handle if "-t" is supplied after "-c"
71for MAP in $CUST_LIST
72do
73  CUST_MAP_LIST="$CUST_MAP_LIST ${N2LPREFIX}$MAP"
74done
75
76if [ -z "$OUTDIR" ]; then
77  echo "ERROR : output directory has to be specified."
78  usage
79  exit 1
80fi
81
82# Set source list if supplied
83shift `expr $OPTIND - 1`
84CMDLINE_SRC_LIST="$@"
85
86[ $DEBUG -eq 1 ] && echo CMDLINE_SRC_LIST = $CMDLINE_SRC_LIST
87
88# If source(s) supplied on command line, then generate ONLY those file(s).
89
90if [ "$CMDLINE_SRC_LIST" != "" ]; then
91  MAP_LIST=""
92  CMDLINE_SRCS=1
93
94  for SRC in $CMDLINE_SRC_LIST
95  do
96    [ $DEBUG -eq 1 ] && echo Parsing Command line SRC = $SRC
97
98    case $SRC in
99      passwd )
100        MAP=${N2LPREFIX}passwd.byuid
101        MAP_LIST="$MAP_LIST $MAP"
102         ;;
103      group )
104        MAP=${N2LPREFIX}group.byname
105        MAP_LIST="$MAP_LIST $MAP"
106         ;;
107      hosts )
108        MAP=${N2LPREFIX}hosts.byaddr
109        MAP_LIST="$MAP_LIST $MAP"
110         ;;
111      ipnodes )
112        MAP=${N2LPREFIX}ipnodes.byaddr
113        MAP_LIST="$MAP_LIST $MAP"
114         ;;
115      ethers )
116        MAP=${N2LPREFIX}ethers.byname
117        MAP_LIST="$MAP_LIST $MAP"
118         ;;
119      networks )
120        MAP=${N2LPREFIX}networks.byaddr
121        MAP_LIST="$MAP_LIST $MAP"
122         ;;
123      rpc )
124        MAP=${N2LPREFIX}rpc.bynumber
125        MAP_LIST="$MAP_LIST $MAP"
126         ;;
127      services )
128        MAP=${N2LPREFIX}services.byname
129        MAP_LIST="$MAP_LIST $MAP"
130         ;;
131      protocols )
132        MAP=${N2LPREFIX}protocols.bynumber
133        MAP_LIST="$MAP_LIST $MAP"
134         ;;
135      netgroup )
136        MAP=${N2LPREFIX}netgroup
137        MAP_LIST="$MAP_LIST $MAP"
138         ;;
139      bootparams )
140        MAP=${N2LPREFIX}bootparams
141        MAP_LIST="$MAP_LIST $MAP"
142         ;;
143      aliases )
144        MAP=${N2LPREFIX}mail.aliases
145        MAP_LIST="$MAP_LIST $MAP"
146         ;;
147      publickey )
148        MAP=${N2LPREFIX}publickey.byname
149        MAP_LIST="$MAP_LIST $MAP"
150         ;;
151      netid )
152        MAP=${N2LPREFIX}netid.byname
153        MAP_LIST="$MAP_LIST $MAP"
154         ;;
155      netmasks )
156        MAP=${N2LPREFIX}netmasks.byaddr
157        MAP_LIST="$MAP_LIST $MAP"
158         ;;
159      passwd.adjunct )
160        MAP=${N2LPREFIX}passwd.adjunct.byname
161        MAP_LIST="$MAP_LIST $MAP"
162         ;;
163      group.adjunct )
164        MAP=${N2LPREFIX}group.adjunct.byname
165        MAP_LIST="$MAP_LIST $MAP"
166         ;;
167      timezone )
168        MAP=${N2LPREFIX}timezone.byname
169        MAP_LIST="$MAP_LIST $MAP"
170         ;;
171      auto.* )
172        MAP=${N2LPREFIX}${SRC}
173        MAP_LIST="$MAP_LIST $MAP"
174         ;;
175      auth_attr )
176        MAP=${N2LPREFIX}auth_attr
177        MAP_LIST="$MAP_LIST $MAP"
178         ;;
179      exec_attr )
180        MAP=${N2LPREFIX}exec_attr
181        MAP_LIST="$MAP_LIST $MAP"
182         ;;
183      prof_attr )
184        MAP=${N2LPREFIX}prof_attr
185        MAP_LIST="$MAP_LIST $MAP"
186         ;;
187      user_attr )
188        MAP=${N2LPREFIX}user_attr
189        MAP_LIST="$MAP_LIST $MAP"
190         ;;
191      audit_user )
192        MAP=${N2LPREFIX}audit_user
193        MAP_LIST="$MAP_LIST $MAP"
194         ;;
195     *) # Not a default source, could be a custom source.
196        # Then generate source files from all the available
197        # DBM files for this custom source.
198
199        MAPFOUND=0
200
201        for dbmfile in $MAPDIR/${N2LPREFIX}${SRC}.dir \
202            $MAPDIR/${N2LPREFIX}${SRC}.*.dir
203        do
204          MAP=`basename $dbmfile .dir`
205          if [ -f $MAPDIR/${MAP}.pag ]; then
206            MAPFOUND=1
207            CUST_MAP_LIST="$CUST_MAP_LIST $MAP"
208          fi
209        done
210
211        [ $MAPFOUND -eq 0 ] && \
212           echo ERROR : No maps found for $SRC. Skipping..
213        ;;
214   esac
215  done
216
217fi
218
219}
220
221
222is_root_user()
223{
224  case `id` in
225    uid=0\(root\)*) return 0
226                    ;;
227    * )             return 1
228                    ;;
229  esac
230}
231
232
233create_passwd()
234{
235SRCFILE=passwd
236SHADOW=shadow
237
238makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
239
240# Remove the YP operational lines
241grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
242  grep -v "YP_DOMAIN_NAME $DOMAIN" |
243  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
244
245# Remove the key
246cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
247
248# Sort the entries in ascending order of uid
249sort -n -t: -k3,3 $TMPDIR/${MAP}.cut > $TMPDIR/${MAP}.sort
250
251# If passwd.adjunct is used, the actual password is stored in
252# this map, and the passwd map contains "##<uid>" as the passwd.
253# In that case, do not generate the shadow file.
254
255UID=`head -1 $TMPDIR/${MAP}.sort | cut -f1 -d:`
256PSWD=`head -1 $TMPDIR/${MAP}.sort | cut -f2 -d:`
257if [ "$PSWD" != "##${UID}" ]; then
258
259  #Create the shadow file with blank passwd aging information
260  cut -f 1,2 -d: $TMPDIR/${MAP}.sort |
261      sed 's/$/:::::::/' > $OUTDIR/$SHADOW
262
263  #Make the shadow file readable to root only
264  chmod 400 $OUTDIR/$SHADOW
265
266  #Create the passwd file with "x" as the passwd
267  awk ' BEGIN { FS = ":"; OFS = ":"}
268        {$2 = "x"; print}' $TMPDIR/${MAP}.sort > $OUTDIR/$SRCFILE
269else
270  cp $TMPDIR/${MAP}.sort $OUTDIR/$SRCFILE
271fi
272
273}
274
275
276create_group()
277{
278SRCFILE=group
279
280makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
281
282# Remove the YP operational lines
283grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
284  grep -v "YP_DOMAIN_NAME $DOMAIN" |
285  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
286
287# Remove the key
288cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
289
290# Sort the entries in ascending order of gid
291sort -n -t: -k3,3 $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
292}
293
294
295create_hosts()
296{
297SRCFILE=hosts
298
299makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
300
301# Remove the YP operational lines
302grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
303  grep -v "YP_DOMAIN_NAME $DOMAIN" |
304  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
305
306# Remove the key
307cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
308
309# Sort the hosts ip addresses in ascending order
310sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4 $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
311}
312
313
314create_ipnodes()
315{
316SRCFILE=ipnodes
317
318makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
319
320# Remove the YP operational lines
321grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
322  grep -v "YP_DOMAIN_NAME $DOMAIN" |
323  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
324
325# Remove the key
326cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
327
328grep -v "::" $TMPDIR/${MAP}.cut >$TMPDIR/${MAP}.V4
329grep "::" $TMPDIR/${MAP}.cut >$TMPDIR/${MAP}.V6
330
331# Sort the ip addresses in ascending order
332sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4 $TMPDIR/${MAP}.V4 > $OUTDIR/$SRCFILE
333
334# V6 addresses due to hex chars, can't be sorted this way.
335# So just do the default string sort.
336sort $TMPDIR/${MAP}.V6 >> $OUTDIR/$SRCFILE
337}
338
339
340create_ethers()
341{
342SRCFILE=ethers
343
344makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
345
346# Remove the YP operational lines
347grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
348  grep -v "YP_DOMAIN_NAME $DOMAIN" |
349  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
350
351# Remove the key
352cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
353
354# Sort ethernet addresses based on host names
355sort -b -k2 $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
356}
357
358
359create_networks()
360{
361SRCFILE=networks
362
363makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
364
365# Remove the YP operational lines
366grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
367  grep -v "YP_DOMAIN_NAME $DOMAIN" |
368  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
369
370# Remove the key
371cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
372
373# Sort networks based on their names
374sort $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
375}
376
377
378create_rpc()
379{
380SRCFILE=rpc
381
382makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
383
384# Remove the YP operational lines
385grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
386  grep -v "YP_DOMAIN_NAME $DOMAIN" |
387  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
388
389# Remove the key
390cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
391
392# Sort entries in the increasing order of RPC number
393sort -n -k2 $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
394}
395
396
397create_services()
398{
399SRCFILE=services
400
401makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
402
403# Remove the YP operational lines
404grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
405  grep -v "YP_DOMAIN_NAME $DOMAIN" |
406  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
407
408# Remove the key
409cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
410
411# Sort entries in the increasing order of RPC number
412sort -n -k2 $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
413}
414
415
416create_protocols()
417{
418SRCFILE=protocols
419
420makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
421
422# Remove the YP operational lines
423grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
424  grep -v "YP_DOMAIN_NAME $DOMAIN" |
425  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
426
427# Remove the key
428cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
429
430# Sort entries in the increasing order of RPC number
431sort -n -k2 $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
432}
433
434
435create_netgroup()
436{
437SRCFILE=netgroup
438
439makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
440
441# Remove the YP operational lines
442grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
443  grep -v "YP_DOMAIN_NAME $DOMAIN" |
444  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
445
446cp $TMPDIR/${MAP}.grep $OUTDIR/$SRCFILE
447}
448
449
450create_bootparams()
451{
452SRCFILE=bootparams
453
454makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
455
456# Remove the YP operational lines
457grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
458  grep -v "YP_DOMAIN_NAME $DOMAIN" |
459  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
460
461# Sort the entries
462sort $TMPDIR/${MAP}.grep > $OUTDIR/$SRCFILE
463}
464
465
466create_aliases()
467{
468SRCFILE=aliases
469
470makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
471
472# Remove the YP operational lines
473grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
474  grep -v "YP_DOMAIN_NAME $DOMAIN" |
475  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
476
477# Replace first " " with ": " to make it similar to aliases
478sed 's/ /: /' $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.sed
479
480# Sort aliases entries alphabetically
481sort $TMPDIR/${MAP}.sed > $OUTDIR/$SRCFILE
482}
483
484
485create_publickey()
486{
487SRCFILE=publickey
488
489makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
490
491# Remove the YP operational lines
492grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
493  grep -v "YP_DOMAIN_NAME $DOMAIN" |
494  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
495
496# Sort entries alphabetically
497sort $TMPDIR/${MAP}.grep > $OUTDIR/$SRCFILE
498}
499
500
501create_netid()
502{
503SRCFILE=netid
504
505makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
506
507# Remove the YP operational lines
508grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
509  grep -v "YP_DOMAIN_NAME $DOMAIN" |
510  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
511
512# netid source files is used to add other domain
513# entries. So, filter out local domain entries
514grep -v "@${DOMAIN}" $TMPDIR/${MAP}.grep > $OUTDIR/$SRCFILE
515}
516
517
518create_netmasks()
519{
520SRCFILE=netmasks
521
522makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
523
524# Remove the YP operational lines
525grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
526  grep -v "YP_DOMAIN_NAME $DOMAIN" |
527  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
528
529# Sort the network numbers in ascending order
530sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4 $TMPDIR/${MAP}.grep > $OUTDIR/$SRCFILE
531}
532
533
534create_passwd_adjunct()
535{
536SRCFILE=passwd.adjunct
537
538makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
539
540# Remove the YP operational lines. It has three of them.
541grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
542  grep -v "YP_DOMAIN_NAME $DOMAIN" |
543  grep -v YP_MASTER_NAME | grep -v YP_SECURE > $TMPDIR/${MAP}.grep
544
545# Remove the key
546cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
547
548## Check if sorting is ok, or leave it as it is.
549# Sort the entries in alphabetical order
550sort $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
551}
552
553
554create_group_adjunct()
555{
556SRCFILE=group.adjunct
557
558makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
559
560# Remove the YP operational lines. It has three of them.
561grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
562  grep -v "YP_DOMAIN_NAME $DOMAIN" |
563  grep -v YP_MASTER_NAME | grep -v YP_SECURE > $TMPDIR/${MAP}.grep
564
565# Remove the key
566cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
567
568# Sort the entries in alphabetical order
569sort $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
570}
571
572
573create_timezone()
574{
575SRCFILE=timezone
576
577makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
578
579# Remove the YP operational lines
580grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
581  grep -v "YP_DOMAIN_NAME $DOMAIN" |
582  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
583
584# Remove the key
585cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
586
587# Sort the entries in alphabetical order
588sort $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
589}
590
591
592create_auto_src()
593{
594SRCFILE=$MAP
595
596makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
597
598# Remove the YP operational lines
599grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
600  grep -v "YP_DOMAIN_NAME $DOMAIN" |
601  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
602
603# Sort entries alphabetically
604sort $TMPDIR/${MAP}.grep > $OUTDIR/$SRCFILE
605}
606
607
608create_auth_attr()
609{
610SRCFILE=auth_attr
611
612makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
613
614# Remove the YP operational lines
615grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
616  grep -v "YP_DOMAIN_NAME $DOMAIN" |
617  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
618
619# Remove the key
620cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
621
622# Sort entries in the alphabetical order
623sort $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
624}
625
626
627create_exec_attr()
628{
629SRCFILE=exec_attr
630
631makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
632
633# Remove the YP operational lines
634grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
635  grep -v "YP_DOMAIN_NAME $DOMAIN" |
636  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
637
638# Remove the key which is made of three fields. space is part of key
639cut -f 3- -d ":" $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut1
640cut -f 2- -d " " $TMPDIR/${MAP}.cut1 > $TMPDIR/${MAP}.cut2
641
642# Sort entries in the alphabetical order
643sort $TMPDIR/${MAP}.cut2 > $OUTDIR/$SRCFILE
644}
645
646
647create_prof_attr()
648{
649SRCFILE=prof_attr
650
651makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
652
653# Remove the YP operational lines
654grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
655  grep -v "YP_DOMAIN_NAME $DOMAIN" |
656  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
657
658# Remove the key. It is difficult here as space is part of the key.
659# From the "key key" part, extract "key", and then paste it with
660# the rest of the entry.
661cut -f1 -d: $TMPDIR/${MAP}.grep |
662awk '{
663  STR = $1
664  for (i=2; i <= NF/2; i++) {
665    STR = STR  " " $i
666  }
667print STR
668}' > $TMPDIR/${MAP}.cut1
669
670cut -f2- -d: $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut2
671paste -d ":" $TMPDIR/${MAP}.cut1 $TMPDIR/${MAP}.cut2 > $TMPDIR/${MAP}.cut
672
673# Sort entries in the alphabetical order
674sort $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
675}
676
677
678create_user_attr()
679{
680SRCFILE=user_attr
681
682makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
683
684# Remove the YP operational lines
685grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
686  grep -v "YP_DOMAIN_NAME $DOMAIN" |
687  grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
688
689# Remove the key
690cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
691
692# Sort entries in the alphabetical order
693sort $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
694}
695
696
697create_audit_user()
698{
699SRCFILE=audit_user
700
701makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
702
703# Remove the YP operational lines. It has 3 of them.
704grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
705  grep -v "YP_DOMAIN_NAME $DOMAIN" |
706  grep -v YP_MASTER_NAME | grep -v YP_SECURE > $TMPDIR/${MAP}.grep
707
708# Remove the key
709cut -f 2- -d " " $TMPDIR/${MAP}.grep > $TMPDIR/${MAP}.cut
710
711# Sort entries in the alphabetical order
712sort $TMPDIR/${MAP}.cut > $OUTDIR/$SRCFILE
713}
714
715
716## MAIN ##
717
718PROG=`basename $0`
719
720# Only root can read the NIS maps, so no point allowing
721# non-root users to be able to run this script.
722is_root_user
723if [ $? -ne 0 ]; then
724  echo "ERROR : Only root can run $PROG"
725  exit 1
726fi
727
728# Prevent non-root users from reading/writing
729umask 077
730
731# Initialize default values.
732DOMAIN=`/usr/bin/domainname`
733MAPDIR=/var/yp/"$DOMAIN"	# Default to local domain
734N2LPREFIX=LDAP_
735
736NIS_ONLY_MAP_LIST="passwd.byuid
737                   group.byname
738                   hosts.byaddr
739                   ipnodes.byaddr
740                   ethers.byname
741                   networks.byaddr
742                   rpc.bynumber
743                   services.byname
744                   protocols.bynumber
745                   netgroup
746                   bootparams
747                   mail.aliases
748                   publickey.byname
749                   netid.byname
750                   netmasks.byaddr
751                   passwd.adjunct.byname
752                   group.adjunct.byname
753                   timezone.byname
754                   auth_attr
755                   exec_attr
756                   prof_attr
757                   user_attr
758                   audit_user"
759
760NIS2LDAP_MAP_LIST="${N2LPREFIX}passwd.byuid
761                   ${N2LPREFIX}group.byname
762                   ${N2LPREFIX}hosts.byaddr
763                   ${N2LPREFIX}ipnodes.byaddr
764                   ${N2LPREFIX}ethers.byname
765                   ${N2LPREFIX}networks.byaddr
766                   ${N2LPREFIX}rpc.bynumber
767                   ${N2LPREFIX}services.byname
768                   ${N2LPREFIX}protocols.bynumber
769                   ${N2LPREFIX}netgroup
770                   ${N2LPREFIX}bootparams
771                   ${N2LPREFIX}mail.aliases
772                   ${N2LPREFIX}publickey.byname
773                   ${N2LPREFIX}netid.byname
774                   ${N2LPREFIX}netmasks.byaddr
775                   ${N2LPREFIX}passwd.adjunct.byname
776                   ${N2LPREFIX}group.adjunct.byname
777                   ${N2LPREFIX}timezone.byname
778                   ${N2LPREFIX}auth_attr
779                   ${N2LPREFIX}exec_attr
780                   ${N2LPREFIX}prof_attr
781                   ${N2LPREFIX}user_attr
782                   ${N2LPREFIX}audit_user"
783
784
785# If auto maps exist, add them to the respective lists.
786for dbmfile in $MAPDIR/auto.*.dir
787do
788  MAP=`basename $dbmfile .dir`
789  if [ -f $MAPDIR/${MAP}.pag ]; then
790    NIS_ONLY_MAP_LIST="$NIS_ONLY_MAP_LIST $MAP"
791  fi
792done
793
794for dbmfile in $MAPDIR/${N2LPREFIX}auto.*.dir
795do
796  MAP=`basename $dbmfile .dir`
797  if [ -f $MAPDIR/${MAP}.pag ]; then
798    NIS2LDAP_MAP_LIST="$NIS2LDAP_MAP_LIST $MAP"
799  fi
800done
801
802# Default to N2L maps
803MAP_LIST="$NIS2LDAP_MAP_LIST"
804
805# Safe place to avoid anyone from reading sensitive data.
806TMPDIR="/var/tmp/ypmap2src"
807
808DEBUG=0			# Default to debug off
809DEBUG=1
810OUTDIR=""
811CUST_MAP_LIST=""
812CMDLINE_SRCS=0
813
814
815parse_argument $*
816
817[ $DEBUG -eq 1 ] && echo DOMAIN = $DOMAIN
818[ $DEBUG -eq 1 ] && echo OUTDIR = $OUTDIR
819[ $DEBUG -eq 1 ] && echo TMPDIR = $TMPDIR
820[ $DEBUG -eq 1 ] && echo CUST_MAP_LIST = $CUST_MAP_LIST
821[ $DEBUG -eq 1 ] && echo MAP_LIST = $MAP_LIST
822
823[ $DEBUG -eq 1 ] && echo MAPDIR = $MAPDIR
824if [ ! -d "$MAPDIR" ]; then
825  echo ERROR : NIS Map directory $MAPDIR does not exist.
826  exit 1
827fi
828
829if [ ! -d "$OUTDIR" ]; then
830  echo output directory $OUTDIR does not exist. Creating it.
831  mkdir -p $OUTDIR
832  if [ $? -ne 0 ]; then
833    echo ERROR : Failed to create output directory $OUTDIR
834    exit 1
835  fi
836fi
837
838# Cleanup if the temp directory has been leftover
839[ -d "$TMPDIR" ] && rm -rf $TMPDIR
840mkdir $TMPDIR
841if [ $? -ne 0 ]; then
842  echo ERROR : Failed to create temp directory $TMPDIR
843  exit 1
844fi
845
846
847for MAP in $MAP_LIST
848do
849  [ $DEBUG -eq 1 ] && echo Processing MAP = $MAP
850
851  if [ ! -f $MAPDIR/${MAP}.dir ] || [ ! -f $MAPDIR/${MAP}.pag ]; then
852
853    [ $CMDLINE_SRCS -ne 0 ] && \
854        echo ERROR : Missing DBM file for $MAP in $MAPDIR . Skipping..
855
856    [ $DEBUG -eq 1 ] && [ $CMDLINE_SRCS -eq 0 ] && \
857        echo No DBM file for $MAP in $MAPDIR . Skipping..
858    continue
859  fi
860
861  case $MAP in
862    ${N2LPREFIX}passwd.byuid )
863      create_passwd
864       ;;
865    ${N2LPREFIX}group.byname )
866      create_group
867       ;;
868    ${N2LPREFIX}hosts.byaddr )
869      create_hosts
870       ;;
871    ${N2LPREFIX}ipnodes.byaddr )
872      create_ipnodes
873       ;;
874    ${N2LPREFIX}ethers.byname )
875      create_ethers
876       ;;
877    ${N2LPREFIX}networks.byaddr )
878      create_networks
879       ;;
880    ${N2LPREFIX}rpc.bynumber )
881      create_rpc
882       ;;
883    ${N2LPREFIX}services.byname )
884      create_services
885       ;;
886    ${N2LPREFIX}protocols.bynumber )
887      create_protocols
888       ;;
889    ${N2LPREFIX}netgroup )
890      create_netgroup
891       ;;
892    ${N2LPREFIX}bootparams )
893      create_bootparams
894       ;;
895    ${N2LPREFIX}mail.aliases )
896      create_aliases
897       ;;
898    ${N2LPREFIX}publickey.byname )
899      create_publickey
900       ;;
901    ${N2LPREFIX}netid.byname )
902      create_netid
903       ;;
904    ${N2LPREFIX}netmasks.byaddr )
905      create_netmasks
906       ;;
907    ${N2LPREFIX}passwd.adjunct.byname )
908      create_passwd_adjunct
909       ;;
910    ${N2LPREFIX}group.adjunct.byname )
911      create_group_adjunct
912       ;;
913    ${N2LPREFIX}timezone.byname )
914      create_timezone
915       ;;
916    ${N2LPREFIX}auto.* )
917      create_auto_src
918       ;;
919    ${N2LPREFIX}auth_attr )
920      create_auth_attr
921       ;;
922    ${N2LPREFIX}exec_attr )
923      create_exec_attr
924       ;;
925    ${N2LPREFIX}prof_attr )
926      create_prof_attr
927       ;;
928    ${N2LPREFIX}user_attr )
929      create_user_attr
930       ;;
931    ${N2LPREFIX}audit_user )
932      create_audit_user
933       ;;
934   *) # Not a default map, could be a custom map.
935      CUST_MAP_LIST="$CUST_MAP_LIST $MAP"
936      ;;
937 esac
938done
939
940
941for MAP in $CUST_MAP_LIST
942do
943  [ $DEBUG -eq 1 ] && echo Processing Custom MAP = $MAP
944
945  if [ ! -f $MAPDIR/${MAP}.dir ] || [ ! -f $MAPDIR/${MAP}.pag ]; then
946    echo ERROR : Missing DBM file for $MAP in $MAPDIR . Skipping..
947    continue
948  fi
949
950  makedbm -u $MAPDIR/$MAP > $TMPDIR/$MAP
951
952# Remove the YP operational lines. Assuming each custom map
953# has only these entries (three in n2l mode as shown below, and
954# two in vanilla NIS mode as it does not have "YP_DOMAIN_NAME".
955# But that does not require any changes in the code). Modify it
956# appropriately in other cases.
957
958  grep -v YP_LAST_MODIFIED $TMPDIR/$MAP |
959    grep -v "YP_DOMAIN_NAME $DOMAIN" |
960    grep -v YP_MASTER_NAME > $TMPDIR/${MAP}.grep
961
962# If further processing (e.g., removing key, sorting etc.)
963# is required, then update the script appropriately.
964  cp $TMPDIR/${MAP}.grep $OUTDIR/$MAP
965
966done
967
968# Leave the temp directory if debug is set
969[ $DEBUG -eq 0 ] && rm -rf $TMPDIR
970
971exit 0
972