Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / packaging / MacOS / pkgbuild.sh.in
1 #!/bin/bash
2 # Portions Copyright (c) 2003, 2006 Apple Computer, Inc. All rights reserved.
3 echo '**BUILDPKG**' "$@"
4
5 usage() {
6 exec >&2
7
8 echo 'Usage: pkgbuild.sh [-x] [--app-key <appkey>] [--inst-key <instkey>]'
9 echo ' [--pass N] [--csdb <CellServDB>] <binary-dir>'
10 echo
11 echo '--app-key and --inst-key are for signing. -x prints all comamnds as '
12 echo 'they are run.'
13 echo
14 echo 'By default, all passes are run. Available passes:'
15 echo ' --pass 1: prepare pkgroot'
16 echo ' --pass 2: create packages/installer from pkgroot'
17 echo 'If you want to alter the pkgroot, run pass 1, then alter what you'
18 echo 'want, and then run pass 2 to create the resulting packages.'
19 echo 'The --pass argument may be given multiple times.'
20 exit 1
21 }
22
23 if [ x"$#" = x0 ]; then
24 usage
25 fi
26
27 anypass=0
28 PASS1=
29 PASS2=
30
31 APP_KEY=
32 INST_KEY=
33 DEST_DIR=
34 CSDB=
35
36 while [ x"$#" != x0 ] ; do
37 key="$1"
38 shift
39
40 case "$key" in
41 --app-key)
42 APP_KEY="$1"
43 shift
44 ;;
45 --inst-key)
46 INST_KEY="$1"
47 shift
48 ;;
49 --csdb)
50 CSDB="$1"
51 shift
52 ;;
53 --pass)
54 anypass=1
55 pass_arg="$1"
56 shift
57 case "$pass_arg" in
58 1)
59 PASS1=1
60 ;;
61 2)
62 PASS2=1
63 ;;
64 *)
65 echo "Unknown pass $pass_arg" >&2
66 exit 1
67 ;;
68 esac
69 ;;
70 -x)
71 DO_X=1
72 ;;
73 *)
74 if [ x"$DEST_DIR" = x ] ; then
75 DEST_DIR="$key"
76 else
77 echo "Error: Unknown arg $key" >&2
78 usage
79 fi
80 ;;
81 esac
82 done
83
84 if [ x"$anypass" = x0 ] ; then
85 PASS1=1
86 PASS2=1
87 fi
88
89 if [ x"$DEST_DIR" = x ] ; then
90 echo "Error: binary 'dest' dir not given"
91 usage
92 fi
93
94 set -e
95
96 if [ x"$DO_X" = x1 ] ; then
97 set -x
98 fi
99
100 BINDEST=`cd "$DEST_DIR" && pwd`
101 CURDIR=`pwd`
102 RESSRC=`dirname "$0"`
103 RESSRC=`cd "$RESSRC" && pwd`
104 majorvers=`uname -r | cut -d. -f1`
105
106 if [ x"$majorvers" = x10 ]; then
107 RELNAME="Snowleopard"
108 THISREL=6
109
110 elif [ x"$majorvers" = x11 ]; then
111 RELNAME="Lion"
112 THISREL=7
113
114 elif [ x"$majorvers" = x12 ]; then
115 RELNAME="MountainLion"
116 THISREL=8
117
118 elif [ x"$majorvers" = x13 ]; then
119 RELNAME="Mavericks"
120 THISREL=9
121
122 elif [ x"$majorvers" = x14 ]; then
123 RELNAME="Yosemite"
124 THISREL=10
125
126 elif [ x"$majorvers" = x15 ]; then
127 RELNAME="ElCapitan"
128 THISREL=11
129
130 elif [ x"$majorvers" = x16 ]; then
131 RELNAME="Sierra"
132 THISREL=12
133
134 elif [ x"$majorvers" = x17 ]; then
135 RELNAME="HighSierra"
136 THISREL=13
137
138 elif [ x"$majorvers" = x18 ]; then
139 RELNAME="Mojave"
140 THISREL=14
141
142 elif [ x"$majorvers" = x ] ; then
143 echo "Error running uname" >&2
144 exit 1
145
146 else
147 echo "Unknown major version $majorvers" >&2
148 exit 1
149 fi
150
151 SEP=:
152
153 PKGROOT="$CURDIR"/pkgroot
154 PKGRES="$CURDIR"/pkgres
155 DPKGROOT="$CURDIR"/dpkgroot
156 PLUGINS="$CURDIR"/plugins
157 if test -e /usr/bin/pkgbuild; then
158 :
159 else
160 echo pkgbuild not found >&2
161 exit 1
162 fi
163 if test -e /usr/bin/productbuild; then
164 :
165 else
166 echo productbuild not found >&2
167 exit 1
168 fi
169
170 if [ x"$PASS1" = x1 ]; then
171 if [ -x /usr/bin/curl ] && [ x"$CSDB" = x ]; then
172 echo "No CellServDB provided; downloading one from central.org"
173 /usr/bin/curl -f -O https://www.central.org/dl/cellservdb/CellServDB
174 if [ -f "$CURDIR"/CellServDB ] ; then
175 CSDB="$CURDIR"/CellServDB
176 fi
177 fi
178
179 if [ x"$CSDB" = x ]; then
180 echo "A CellServDB file must be provided with --csdb" >&2
181 die=1
182 else
183 # Turn CSDB into an absolute path
184 case "$CSDB" in
185 /*)
186 ;;
187 *)
188 CSDB="$CURDIR/$CSDB"
189 ;;
190 esac
191
192 if grep -q 'GCO Public CellServDB' "$CSDB" ; then
193 touch "$CSDB"
194 else
195 echo "A proper CellServDB file must be provided" >&2
196 die=1
197 fi
198 fi
199
200 for f in ReadMe.rtf."$majorvers" \
201 License.rtf \
202 CellServDB.list \
203 OpenAFS.info \
204 OpenAFS.post_install \
205 OpenAFS.pre_upgrade \
206 csrvdbmerge.pl \
207 2.0.txt
208 do
209 if [ ! -f "$RESSRC/$f" ]; then
210 echo "file missing: $RESSRC/$f" >&2
211 die=1
212 fi
213 done
214 if [ x"$die" = x1 ]; then
215 echo "Correct above errors; then retry" >&2
216 exit 1
217 fi
218
219 for f in "$BINDEST"/bin/translate_et \
220 "$BINDEST/root.client/usr/vice/etc/afs.kext/Contents/MacOS/afs"
221 do
222 if [ ! -f "$f" ] ; then
223 echo "dest file missing: $f" >&2
224 die=1
225 fi
226 done
227 if [ x"$die" = x1 ]; then
228 echo $BINDEST " is not a valid binary dir. it should be the result of" >&2
229 echo "make dest" >&2
230 exit 1
231 fi
232
233 rm -rf "$PKGROOT" "$PLUGINS"
234 mkdir "$PKGROOT"
235 mkdir "$PLUGINS"
236
237 mkdir -p "$PKGROOT"/Library
238 mkdir -p "$PKGROOT"/Library/PreferencePanes
239 mkdir -p "$PKGROOT"/Library/Security/SecurityAgentPlugins
240
241 chown -R root${SEP}admin "$PKGROOT"
242 chmod -R 755 "$PKGROOT"
243
244 (cd "$BINDEST"/tools && pax -rw OpenAFS.prefPane "$PKGROOT"/Library/PreferencePanes/)
245 (cd "$BINDEST"/tools && pax -rw aklog.bundle \
246 "$PKGROOT"/Library/Security/SecurityAgentPlugins/)
247
248 mkdir -p "$PKGROOT"/Library/OpenAFS/Tools
249 (cd "$BINDEST" && pax -rw * "$PKGROOT"/Library/OpenAFS/Tools)
250
251 cd "$RESSRC"
252 mv "$PKGROOT"/Library/OpenAFS/Tools/installer/* "$PLUGINS"/
253
254 mkdir -p "$PKGROOT"/Library/LaunchDaemons
255 chmod -R o-w "$PKGROOT"/Library
256 chmod -R g-w "$PKGROOT"/Library
257
258 cp openafs.launchd.plist "$PKGROOT"/Library/LaunchDaemons/org.openafs.filesystems.afs.plist
259 chmod 644 "$PKGROOT"/Library/LaunchDaemons/org.openafs.filesystems.afs.plist
260
261 chown root${SEP}admin "$PKGROOT"/Library
262 chown -R root${SEP}wheel "$PKGROOT"/Library/LaunchDaemons
263 chown -R root${SEP}wheel "$PKGROOT"/Library/OpenAFS/Tools
264 chmod -R og-w "$PKGROOT"/Library/OpenAFS/Tools
265
266 mkdir -p "$PKGROOT"/private/var/db/openafs/cache
267 mkdir -p "$PKGROOT"/private/var/db/openafs/etc/config
268
269 cp openafs.launchdaemon "$PKGROOT"/private/var/db/openafs/etc/launchafs.sh
270 chmod 755 "$PKGROOT"/private/var/db/openafs/etc/launchafs.sh
271
272 cp "$CSDB" "$PKGROOT"/private/var/db/openafs/etc/CellServDB.master
273 echo grand.central.org > "$PKGROOT"/private/var/db/openafs/etc/ThisCell.sample
274 echo /afs:/var/db/openafs/cache:100000 > \
275 "$PKGROOT"/private/var/db/openafs/etc/cacheinfo.sample
276
277 cp -RP "$PKGROOT"/Library/OpenAFS/Tools/etc/afssettings \
278 "$PKGROOT"/private/var/db/openafs/etc/config
279 cp settings.plist "$PKGROOT"/private/var/db/openafs/etc/config/settings.plist.orig
280 cp afs.conf "$PKGROOT"/private/var/db/openafs/etc/config/afs.conf.sample
281 cp krb5-weak.conf "$PKGROOT"/private/var/db/openafs/etc/krb5-weak.conf
282
283 cp decode-panic "$PKGROOT"/Library/OpenAFS/Tools/tools
284 chmod a+x "$PKGROOT"/Library/OpenAFS/Tools/tools/decode-panic
285
286 rm -rf "$DPKGROOT"
287 mkdir "$DPKGROOT"
288 mkdir -p "$DPKGROOT"/Library/OpenAFS/Debug
289
290 mv "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext.dSYM \
291 "$DPKGROOT"/Library/OpenAFS/Debug/
292 cp -RP "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
293 "$DPKGROOT"/Library/OpenAFS/Debug/
294 chown -R root${SEP}wheel "$DPKGROOT"/Library/OpenAFS/Debug
295 chmod -R og-w "$DPKGROOT"/Library/OpenAFS/Debug
296
297 strip -X -S \
298 "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext/Contents/MacOS/afs
299
300 mkdir -p "$PKGROOT"/private/var/db/openafs
301
302 cp -RP "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
303 "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/C \
304 "$PKGROOT"/private/var/db/openafs/etc
305
306 chown -R root${SEP}wheel "$PKGROOT"/private
307 chmod -R og-w "$PKGROOT"/private
308
309 chown -R root${SEP}wheel "$PKGROOT"/private
310 chmod -R og-w "$PKGROOT"/private
311 chmod og-rx "$PKGROOT"/private/var/db/openafs/cache
312
313 if [ x"$APP_KEY" != x ] ; then
314 # Sign each 'thing' that we have (commands, kexts, etc)
315 for obj in "$DPKGROOT"/Library/OpenAFS/Debug/afs.kext \
316 "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
317 "$PKGROOT"/private/var/db/openafs/etc/afs.kext \
318 "$PKGROOT"/Library/PreferencePanes/OpenAFS.prefPane/Contents/Resources/AFSBackgrounder.app \
319 "$PKGROOT"/Library/PreferencePanes/OpenAFS.prefPane \
320 "$PKGROOT"/Library/Security/SecurityAgentPlugins/aklog.bundle \
321 "$PKGROOT"/Library/OpenAFS/Tools/tools/growlagent-openafs.app \
322 "$PKGROOT"/Library/OpenAFS/Tools/tools/aklog.bundle \
323 "$PLUGINS"/afscell.bundle
324 do
325 codesign --verbose --force --timestamp --sign "$APP_KEY" "$obj"
326 done
327
328 # Check if our signatures for our kexts are valid. 'kextutil' will exit
329 # with an error and print out a message if something is wrong with the
330 # signature. Note that a code signing cert must have the
331 # 1.2.840.113635.100.6.1.18 extension present to be used for kexts
332 # (most code signing certs cannot be used for kexts).
333 for kext in "$DPKGROOT"/Library/OpenAFS/Debug/afs.kext \
334 "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
335 "$PKGROOT"/private/var/db/openafs/etc/afs.kext
336 do
337 kextutil -no-load -print-diagnostics "$kext"
338 done
339 fi
340
341 if [ $majorvers -ge 15 ]; then
342 # El Capitan and further prevent us from touching /usr/bin directly
343 PREFIX=/opt
344 USRBIN=/opt/openafs/bin
345 USRBIN2TOOLS=../../../Library/OpenAFS/Tools
346
347 USRSBIN=/opt/openafs/sbin
348 USRSBIN2TOOLS=../../../Library/OpenAFS/Tools
349
350 MANDIR=/opt/openafs/share/man
351 MANDIR2TOOLS=../../../../Library/OpenAFS/Tools
352
353 # Add our bin, sbin, and man directories to the default search path
354 mkdir -p "$PKGROOT"/etc/paths.d "$PKGROOT"/etc/manpaths.d
355 echo "$USRBIN" > "$PKGROOT"/etc/paths.d/40-openafs
356 echo "$USRSBIN" >> "$PKGROOT"/etc/paths.d/40-openafs
357 echo "$MANDIR" > "$PKGROOT"/etc/manpaths.d/40-openafs
358 else
359 PREFIX=/usr
360 USRBIN=/usr/bin
361 USRBIN2TOOLS=../../Library/OpenAFS/Tools
362
363 USRSBIN=/usr/sbin
364 USRSBIN2TOOLS="$USRBIN2TOOLS"
365
366 MANDIR=/usr/share/man
367 MANDIR2TOOLS=../../../Library/OpenAFS/Tools
368 fi
369
370 mkdir -p "$PKGROOT$USRBIN" \
371 "$PKGROOT$USRSBIN" \
372 "$PKGROOT$MANDIR"/man1 \
373 "$PKGROOT$MANDIR"/man5 \
374 "$PKGROOT$MANDIR"/man8
375
376 BINLIST="fs klog klog.krb pagsh pagsh.krb pts sys tokens tokens.krb unlog unlog.krb aklog"
377 ETCLIST="vos"
378
379 if [ x"$DO_X" = x1 ] ; then
380 # Don't print out every single 'ln -s'... that's kinda useless
381 : 'Symlinking commands and manpages into place...'
382 set +x
383 fi
384
385 for f in $BINLIST; do
386 ln -s "$USRBIN2TOOLS"/bin/"$f" "$PKGROOT$USRBIN/$f"
387 done
388 for f in $ETCLIST; do
389 ln -s "$USRSBIN2TOOLS"/etc/"$f" "$PKGROOT$USRSBIN/$f"
390 done
391
392 for section in man1 man5 man8 ; do
393 for f in $(ls $PKGROOT/Library/OpenAFS/Tools/man/$section); do
394
395 if [ -L "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f" ] ; then
396 # If this manpage is a symlink, just change where it's pointing,
397 # and rename the link; don't actually 'gzip' it.
398 link=$(readlink "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f")
399 rm -f "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f"
400 ln -s "$link".gz "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f".gz
401
402 else
403 gzip -9 "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f"
404 fi
405 ln -s ../"$MANDIR2TOOLS"/man/"$section/$f".gz \
406 "$PKGROOT$MANDIR/$section/$f".gz
407 done
408 done
409
410 if [ x"$DO_X" = x1 ] ; then
411 set -x
412 fi
413
414 ln -s "$USRBIN2TOOLS"/bin/kpasswd "$PKGROOT$USRBIN"/kpasswd.afs
415
416 ln -s "$USRSBIN2TOOLS"/root.client/usr/vice/etc/afsd "$PKGROOT$USRSBIN"/afsd
417
418 chown -R root${SEP}wheel "$PKGROOT$PREFIX"
419 chmod -R og-w "$PKGROOT$PREFIX"
420 fi
421
422 if [ x"$PASS2" = x1 ]; then
423 rm -rf "$PKGRES"
424 mkdir "$PKGRES"
425 cd "$RESSRC"
426
427 rm -rf "$CURDIR"/OpenAFS-debug-extension.pkg
428 /usr/bin/pkgbuild --root "$DPKGROOT" --id org.openafs.OpenAFS-debug.pkg \
429 --version '@PACKAGE_VERSION@' \
430 "$CURDIR"/OpenAFS-debug-extension.pkg
431
432 cd "$RESSRC"
433 cp OpenAFS.post_install "$PKGRES"/postinstall
434 cp OpenAFS.pre_upgrade "$PKGRES"/preupgrade
435 cp OpenAFS.post_install "$PKGRES"/postupgrade
436 cp csrvdbmerge.pl "$PKGRES"
437
438 chmod a+x "$PKGRES"/csrvdbmerge.pl \
439 "$PKGRES"/postinstall \
440 "$PKGRES"/postupgrade \
441 "$PKGRES"/preupgrade
442
443 cp CellServDB.list "$PKGRES"
444 chown -R root${SEP}wheel "$PKGRES"
445
446 rm -rf "$CURDIR"/OpenAFS-dist.pkg
447 /usr/bin/pkgbuild --root "$PKGROOT" --id org.openafs.OpenAFS.pkg \
448 --version '@PACKAGE_VERSION@' \
449 --scripts "$PKGRES" "$CURDIR"/OpenAFS-dist.pkg
450
451 rm -rf "$PKGRES"
452 mkdir "$PKGRES"
453 cp background.jpg "$PKGRES"/background.jpg
454 cp License.rtf "$PKGRES"
455 cp ReadMe.rtf."$majorvers" "$PKGRES"/ReadMe.rtf
456 chown -R root${SEP}wheel "$PKGRES"
457
458 if [ $majorvers -ge 15 ] ; then
459 # For El Capitan and further, we have some extra information to tell
460 # the user at the end of the installation process.
461 cp conclusion.txt "$PKGRES"/conclusion.txt
462 PRES_EXTRA="<conclusion file=\"conclusion.txt\"/>"
463 fi
464
465 # generate Distribution.xml from Distribution.xml.in -- nonstandard substs
466 sed -e "s/%%OSX_MAJOR_CUR%%/$THISREL/g" \
467 -e "s/%%OSX_MAJOR_NEXT%%/$(( $THISREL + 1 ))/g" \
468 -e "s,%%PRES_EXTRA%%,$PRES_EXTRA,g" \
469 -e "s/%%OPENAFS_VERSION%%/@PACKAGE_VERSION@/g" \
470 < Distribution.xml.in > Distribution.xml
471
472 rm -rf "$CURDIR/prod"
473 mkdir "$CURDIR/prod"
474 mv "$CURDIR"/OpenAFS-dist.pkg "$CURDIR"/OpenAFS-debug-extension.pkg "$CURDIR"/prod
475 /usr/bin/productbuild --distribution Distribution.xml --resources "$PKGRES" \
476 --plugins "$PLUGINS" --package-path "$CURDIR"/prod "$CURDIR"/OpenAFS.pkg
477
478 if [ x"$INST_KEY" != x ] ; then
479 mv "$CURDIR"/OpenAFS.pkg "$CURDIR"/OpenAFS-unsigned.pkg
480 productsign --timestamp --sign "$INST_KEY" "$CURDIR"/OpenAFS-unsigned.pkg \
481 "$CURDIR"/OpenAFS.pkg
482 rm -f "$CURDIR"/OpenAFS-unsigned.pkg
483 fi
484
485 rm -rf "$CURDIR/dmg"
486 rm -f "$CURDIR/TMP.dmg"
487 rm -rf "$CURDIR/OpenAFS-@PACKAGE_VERSION@-$RELNAME.dmg"
488
489 mkdir "$CURDIR"/dmg
490 mv "$CURDIR"/OpenAFS.pkg "$CURDIR"/dmg
491 cp "$RESSRC"/Uninstall.14.15 "$CURDIR"/dmg/Uninstall.command
492 cp "$RESSRC"/DS_Store "$CURDIR"/dmg/.DS_Store
493 mkdir "$CURDIR"/dmg/.background
494 cp "$RESSRC"/afslogo.jpg "$CURDIR"/dmg/.background
495
496 if [ x"$APP_KEY" != x ] ; then
497 codesign --verbose --force --timestamp --sign "$APP_KEY" "$CURDIR"/dmg/Uninstall.command
498 fi
499
500 hdiutil create -srcfolder "$CURDIR"/dmg -volname OpenAFS \
501 -o "$CURDIR"/TMP.dmg
502 hdiutil convert -format UDZO "$CURDIR"/TMP.dmg \
503 -o "$CURDIR/OpenAFS-@PACKAGE_VERSION@-$RELNAME".dmg
504
505 echo
506 echo "Created $CURDIR/OpenAFS-@PACKAGE_VERSION@-$RELNAME".dmg
507 fi