1#! /bin/csh -ef
2
3set prog = `/usr/bin/basename $0`
4set usage = "Usage: $prog [-f] root-dir info-file [tiff-file] [-d dest-dir] [-r resource-dir] [-traditional | -gnutar]"
5set noglob
6
7if (-x /usr/bin/mkbom) then
8    set mkbom=/usr/bin/mkbom
9    set lsbom=/usr/bin/lsbom
10else
11    set mkbom=/usr/etc/mkbom
12    set lsbom=/usr/etc/lsbom
13endif
14
15if (-x /usr/bin/awk) then
16    set awk=/usr/bin/awk
17else
18    set awk=/bin/awk
19endif
20
21set gnutar=/usr/bin/gnutar
22set tar=/usr/bin/tar
23set pax=/bin/pax
24
25# gather parameters
26if ($#argv == 0) then
27    echo $usage
28    exit(1)
29endif
30
31while ( $#argv > 0 )
32    switch ( $argv[1] )
33	case -d:
34	    if ( $?destDir ) then
35		echo ${prog}: dest-dir parameter already set to ${destDir}.
36		echo $usage
37		exit(1)
38	    else if ( $#argv < 2 ) then
39		echo ${prog}: -d option requires destination directory.
40		echo $usage
41		exit(1)
42	    else
43		set destDir = $argv[2]
44		shift; shift
45		breaksw
46	    endif
47	case -f:
48	    if ( $?rootDir ) then
49		echo ${prog}: root-dir parameter already set to ${rootDir}.
50		echo $usage
51		exit(1)
52	    else if ( $#argv < 2 ) then
53		echo ${prog}: -f option requires package root directory.
54		echo $usage
55		exit(1)
56	    else
57		set rootDir = $argv[2]
58		set fflag
59		shift; shift
60		breaksw
61	    endif
62	case -r:
63	    if ( $?resDir ) then
64		echo ${prog}: resource-dir parameter already set to ${resDir}.
65		echo $usage
66		exit(1)
67	    else if ( $#argv < 2 ) then
68		echo ${prog}: -r option requires package resource directory.
69		echo $usage
70		exit(1)
71	    else
72		set resDir = $argv[2]
73		shift; shift
74		breaksw
75	    endif
76	case -traditional:
77	    set usetar
78            unset usegnutar
79	    unset usepax
80	    breaksw
81        case -gnutar:
82	    set usegnutar
83            unset usepax
84	    unset usetar
85	case -B:
86	    # We got long file names, better use bigtar instead
87	    #set archiver = /NextAdmin/Installer.app/Resources/installer_bigtar
88	    echo 2>&1 ${prog}: -B flag is no longer relevant.
89	    shift
90	    breaksw
91	case -*:
92	    echo ${prog}: Unknown option: $argv[1]
93	    echo $usage
94	    exit(1)
95	case *.info:
96	    if ( $?info ) then
97		echo ${prog}: info-file parameter already set to ${info}.
98		echo $usage
99		exit(1)
100	    else
101		set info = "$argv[1]"
102		shift
103		breaksw
104	    endif
105	case *.tiff:
106	    if ( $?tiff ) then
107		echo ${prog}: tiff-file parameter already set to ${tiff}.
108		echo $usage
109		exit(1)
110	    else
111		set tiff = "$argv[1]"
112		shift
113		breaksw
114	    endif
115	default:
116	    if ( $?rootDir ) then
117		echo ${prog}: unrecognized parameter: $argv[1]
118		echo $usage
119		exit(1)
120	    else
121		set rootDir = "$argv[1]"
122		shift
123		breaksw
124	    endif
125    endsw
126end
127
128# check for mandatory parameters
129if ( ! $?rootDir ) then
130    echo ${prog}: missing root-dir parameter.
131    echo $usage
132    exit(1)
133else if ( ! $?info) then
134    echo ${prog}: missing info-file parameter.
135    echo $usage
136    exit(1)
137endif
138
139# destDir gets default value if unset on command line
140if ( $?destDir ) then
141    /bin/mkdir -p $destDir
142else
143    set destDir = .
144endif
145
146# derive the root name for the package from the root name of the info file
147set root = `/usr/bin/basename $info .info`
148
149# create package directory
150set pkg = ${destDir}/${root}.pkg
151echo Generating Installer package $pkg ...
152if ( -e $pkg ) /bin/rm -rf $pkg
153/bin/mkdir -p -m 755 $pkg
154
155# (gnu)tar/pax and compress root directory to package archive
156echo -n "	creating package archive ... "
157if ( $?fflag ) then
158    set pkgTop = ${rootDir:t}
159    set parent = ${rootDir:h}
160    if ( "$parent" == "$pkgTop" ) set parent = "."
161else
162    set parent = $rootDir
163    set pkgTop = .    
164endif
165if ( $?usetar ) then
166    set pkgArchive = $pkg/$root.tar.Z
167    (cd $parent; $tar -w $pkgTop) | /usr/bin/compress -f -c > $pkgArchive
168else if ( $?usegnutar ) then
169    set pkgArchive = $pkg/$root.tar.gz
170    (cd $parent; $gnutar zcf $pkgArchive $pkgTop)
171else
172    set pkgArchive = $pkg/$root.pax.gz
173    (cd $parent; $pax -w -z -x cpio $pkgTop) > $pkgArchive
174endif
175/bin/chmod 444 $pkgArchive
176echo done.
177
178# copy info file to package
179set pkgInfo = $pkg/$root.info
180echo -n "	copying ${info:t} ... "
181/bin/cp $info $pkgInfo
182/bin/chmod 444 $pkgInfo
183echo done.
184
185# copy tiff file to package
186if ( $?tiff ) then
187    set pkgTiff = $pkg/$root.tiff
188    echo -n "	copying ${tiff:t} ... "
189    /bin/cp $tiff $pkgTiff
190    /bin/chmod 444 $pkgTiff
191    echo done.
192endif
193
194# copy resources to package
195if ( $?resDir ) then
196    echo -n "	copying ${resDir:t} ... "
197
198    # don't want to see push/pop output
199    pushd $resDir > /dev/null
200	# get lists of resources. We'll want to change
201	# permissions on just these things later.
202        set directoriesInResDir = `find . -type d`
203        set filesInResDir = `find . -type f`
204    popd > /dev/null
205
206    # copy the resource directory contents into the package directory
207    foreach resFile (`ls $resDir`)
208	cp -r $resDir/$resFile $pkg
209    end
210
211    pushd $pkg > /dev/null
212	# Change all directories to +r+x, except the package
213	# directory itself
214        foreach resFileItem ($directoriesInResDir)
215            if ( $resFileItem != "." ) then
216                chmod 555 $resFileItem
217            endif
218        end
219	# change all flat files to read only
220        foreach resFileItem ($filesInResDir)
221            chmod 444 $resFileItem
222        end
223    popd > /dev/null
224
225    echo done.
226endif
227
228# generate bom file
229set pkgBom = $pkg/$root.bom
230echo -n "	generating bom file ... "
231/bin/rm -f $pkgBom
232if ( $?fflag ) then
233    $mkbom $parent $pkgBom >& /dev/null
234else
235    $mkbom $rootDir $pkgBom >& /dev/null
236endif
237/bin/chmod 444 $pkgArchive
238echo done.
239	
240# generate sizes file
241set pkgSizes = $pkg/$root.sizes
242echo -n "	generating sizes file ... "
243
244# compute number of files in package
245set numFiles = `$lsbom -s $pkgBom | /usr/bin/wc -l`
246
247# compute package size when compressed
248@ compressedSize = `/usr/bin/du -k -s $pkg | $awk '{print $1}'`
249@ compressedSize += 3		# add 1KB each for sizes, location, status files
250
251@ infoSize = `/bin/ls -s $pkgInfo | $awk '{print $1}'`
252@ bomSize = `/bin/ls -s $pkgBom | $awk '{print $1}'`
253if ( $?tiff ) then
254    @ tiffSize = `/bin/ls -s $pkgTiff | $awk '{print $1}'`
255else
256    @ tiffSize = 0
257endif 
258
259@ installedSize = `/usr/bin/du -k -s $rootDir | $awk '{print $1}'`
260@ installedSize += $infoSize + $bomSize + $tiffSize + 3
261
262# echo size parameters to sizes file
263echo NumFiles $numFiles             >  $pkgSizes
264echo InstalledSize $installedSize   >> $pkgSizes
265echo CompressedSize $compressedSize >> $pkgSizes
266echo done.
267echo " ... finished generating $pkg."
268
269exit(0)
270
271# end package
272	
273