2 # Portions Copyright (c) 2003, 2006 Apple Computer, Inc. All rights reserved.
3 echo '**BUILDPKG**' "$@"
8 echo 'Usage: pkgbuild.sh [-x] [--app-key <appkey>] [--inst-key <instkey>]'
9 echo ' [--pass N] [--csdb <CellServDB>] <binary-dir>'
11 echo '--app-key and --inst-key are for signing. -x prints all comamnds as '
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.'
23 if [ x"$#" = x0 ]; then
36 while [ x"$#" != x0 ] ; do
65 echo "Unknown pass $pass_arg" >&2
74 if [ x"$DEST_DIR" = x ] ; then
77 echo "Error: Unknown arg $key" >&2
84 if [ x"$anypass" = x0 ] ; then
89 if [ x"$DEST_DIR" = x ] ; then
90 echo "Error: binary 'dest' dir not given"
96 if [ x"$DO_X" = x1 ] ; then
100 BINDEST=`cd "$DEST_DIR" && pwd`
102 RESSRC=`dirname "$0"`
103 RESSRC=`cd "$RESSRC" && pwd`
104 majorvers=`uname -r | cut -d. -f1`
106 if [ x"$majorvers" = x10 ]; then
107 RELNAME="Snowleopard"
110 elif [ x"$majorvers" = x11 ]; then
114 elif [ x"$majorvers" = x12 ]; then
115 RELNAME="MountainLion"
118 elif [ x"$majorvers" = x13 ]; then
122 elif [ x"$majorvers" = x14 ]; then
126 elif [ x"$majorvers" = x15 ]; then
130 elif [ x"$majorvers" = x16 ]; then
134 elif [ x"$majorvers" = x17 ]; then
138 elif [ x"$majorvers" = x ] ; then
139 echo "Error running uname" >&2
143 echo "Unknown major version $majorvers" >&2
149 PKGROOT="$CURDIR"/pkgroot
150 PKGRES="$CURDIR"/pkgres
151 DPKGROOT="$CURDIR"/dpkgroot
152 PLUGINS="$CURDIR"/plugins
153 if test -e /usr/bin/pkgbuild; then
156 echo pkgbuild not found >&2
159 if test -e /usr/bin/productbuild; then
162 echo productbuild not found >&2
166 if [ x"$PASS1" = x1 ]; then
167 if [ -x /usr/bin/curl ] && [ x"$CSDB" = x ]; then
168 echo "No CellServDB provided; downloading one from central.org"
169 /usr/bin/curl -f -O https://www.central.org/dl/cellservdb/CellServDB
170 if [ -f "$CURDIR"/CellServDB ] ; then
171 CSDB="$CURDIR"/CellServDB
175 if [ x"$CSDB" = x ]; then
176 echo "A CellServDB file must be provided with --csdb" >&2
179 # Turn CSDB into an absolute path
188 if grep -q 'GCO Public CellServDB' "$CSDB" ; then
191 echo "A proper CellServDB file must be provided" >&2
196 for f in ReadMe.rtf."$majorvers" \
200 OpenAFS.post_install \
201 OpenAFS.pre_upgrade \
205 if [ ! -f "$RESSRC/$f" ]; then
206 echo "file missing: $RESSRC/$f" >&2
210 if [ x"$die" = x1 ]; then
211 echo "Correct above errors; then retry" >&2
215 for f in "$BINDEST"/bin/translate_et \
216 "$BINDEST/root.client/usr/vice/etc/afs.kext/Contents/MacOS/afs"
218 if [ ! -f "$f" ] ; then
219 echo "dest file missing: $f" >&2
223 if [ x"$die" = x1 ]; then
224 echo $BINDEST " is not a valid binary dir. it should be the result of" >&2
229 rm -rf "$PKGROOT" "$PLUGINS"
233 mkdir -p "$PKGROOT"/Library
234 mkdir -p "$PKGROOT"/Library/PreferencePanes
235 mkdir -p "$PKGROOT"/Library/Security/SecurityAgentPlugins
237 chown -R root${SEP}admin "$PKGROOT"
238 chmod -R 755 "$PKGROOT"
240 (cd "$BINDEST"/tools && pax -rw OpenAFS.prefPane "$PKGROOT"/Library/PreferencePanes/)
241 (cd "$BINDEST"/tools && pax -rw aklog.bundle \
242 "$PKGROOT"/Library/Security/SecurityAgentPlugins/)
244 mkdir -p "$PKGROOT"/Library/OpenAFS/Tools
245 (cd "$BINDEST" && pax -rw * "$PKGROOT"/Library/OpenAFS/Tools)
248 mv "$PKGROOT"/Library/OpenAFS/Tools/installer/* "$PLUGINS"/
250 mkdir -p "$PKGROOT"/Library/LaunchDaemons
251 chmod -R o-w "$PKGROOT"/Library
252 chmod -R g-w "$PKGROOT"/Library
254 cp openafs.launchd.plist "$PKGROOT"/Library/LaunchDaemons/org.openafs.filesystems.afs.plist
255 chmod 644 "$PKGROOT"/Library/LaunchDaemons/org.openafs.filesystems.afs.plist
257 chown root${SEP}admin "$PKGROOT"/Library
258 chown -R root${SEP}wheel "$PKGROOT"/Library/LaunchDaemons
259 chown -R root${SEP}wheel "$PKGROOT"/Library/OpenAFS/Tools
260 chmod -R og-w "$PKGROOT"/Library/OpenAFS/Tools
262 mkdir -p "$PKGROOT"/private/var/db/openafs/cache
263 mkdir -p "$PKGROOT"/private/var/db/openafs/etc/config
265 cp openafs.launchdaemon "$PKGROOT"/private/var/db/openafs/etc/launchafs.sh
266 chmod 755 "$PKGROOT"/private/var/db/openafs/etc/launchafs.sh
268 cp "$CSDB" "$PKGROOT"/private/var/db/openafs/etc/CellServDB.master
269 echo grand.central.org > "$PKGROOT"/private/var/db/openafs/etc/ThisCell.sample
270 echo /afs:/var/db/openafs/cache:100000 > \
271 "$PKGROOT"/private/var/db/openafs/etc/cacheinfo.sample
273 cp -RP "$PKGROOT"/Library/OpenAFS/Tools/etc/afssettings \
274 "$PKGROOT"/private/var/db/openafs/etc/config
275 cp settings.plist "$PKGROOT"/private/var/db/openafs/etc/config/settings.plist.orig
276 cp afs.conf "$PKGROOT"/private/var/db/openafs/etc/config/afs.conf.sample
277 cp krb5-weak.conf "$PKGROOT"/private/var/db/openafs/etc/krb5-weak.conf
279 cp decode-panic "$PKGROOT"/Library/OpenAFS/Tools/tools
280 chmod a+x "$PKGROOT"/Library/OpenAFS/Tools/tools/decode-panic
284 mkdir -p "$DPKGROOT"/Library/OpenAFS/Debug
286 mv "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext.dSYM \
287 "$DPKGROOT"/Library/OpenAFS/Debug/
288 cp -RP "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
289 "$DPKGROOT"/Library/OpenAFS/Debug/
290 chown -R root${SEP}wheel "$DPKGROOT"/Library/OpenAFS/Debug
291 chmod -R og-w "$DPKGROOT"/Library/OpenAFS/Debug
294 "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext/Contents/MacOS/afs
296 mkdir -p "$PKGROOT"/private/var/db/openafs
298 cp -RP "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
299 "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/C \
300 "$PKGROOT"/private/var/db/openafs/etc
302 chown -R root${SEP}wheel "$PKGROOT"/private
303 chmod -R og-w "$PKGROOT"/private
305 chown -R root${SEP}wheel "$PKGROOT"/private
306 chmod -R og-w "$PKGROOT"/private
307 chmod og-rx "$PKGROOT"/private/var/db/openafs/cache
309 if [ x"$APP_KEY" != x ] ; then
310 # Sign each 'thing' that we have (commands, kexts, etc)
311 for obj in "$DPKGROOT"/Library/OpenAFS/Debug/afs.kext \
312 "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
313 "$PKGROOT"/private/var/db/openafs/etc/afs.kext \
314 "$PKGROOT"/Library/PreferencePanes/OpenAFS.prefPane/Contents/Resources/AFSBackgrounder.app \
315 "$PKGROOT"/Library/PreferencePanes/OpenAFS.prefPane \
316 "$PKGROOT"/Library/Security/SecurityAgentPlugins/aklog.bundle \
317 "$PKGROOT"/Library/OpenAFS/Tools/tools/growlagent-openafs.app \
318 "$PKGROOT"/Library/OpenAFS/Tools/tools/aklog.bundle \
319 "$PLUGINS"/afscell.bundle
321 codesign --verbose --force --timestamp --sign "$APP_KEY" "$obj"
324 # Check if our signatures for our kexts are valid. 'kextutil' will exit
325 # with an error and print out a message if something is wrong with the
326 # signature. Note that a code signing cert must have the
327 # 1.2.840.113635.100.6.1.18 extension present to be used for kexts
328 # (most code signing certs cannot be used for kexts).
329 for kext in "$DPKGROOT"/Library/OpenAFS/Debug/afs.kext \
330 "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
331 "$PKGROOT"/private/var/db/openafs/etc/afs.kext
333 kextutil -no-load -print-diagnostics "$kext"
337 if [ $majorvers -ge 15 ]; then
338 # El Capitan and further prevent us from touching /usr/bin directly
340 USRBIN=/opt/openafs/bin
341 USRBIN2TOOLS=../../../Library/OpenAFS/Tools
343 USRSBIN=/opt/openafs/sbin
344 USRSBIN2TOOLS=../../../Library/OpenAFS/Tools
346 MANDIR=/opt/openafs/share/man
347 MANDIR2TOOLS=../../../../Library/OpenAFS/Tools
349 # Add our bin, sbin, and man directories to the default search path
350 mkdir -p "$PKGROOT"/etc/paths.d "$PKGROOT"/etc/manpaths.d
351 echo "$USRBIN" > "$PKGROOT"/etc/paths.d/40-openafs
352 echo "$USRSBIN" >> "$PKGROOT"/etc/paths.d/40-openafs
353 echo "$MANDIR" > "$PKGROOT"/etc/manpaths.d/40-openafs
357 USRBIN2TOOLS=../../Library/OpenAFS/Tools
360 USRSBIN2TOOLS="$USRBIN2TOOLS"
362 MANDIR=/usr/share/man
363 MANDIR2TOOLS=../../../Library/OpenAFS/Tools
366 mkdir -p "$PKGROOT$USRBIN" \
368 "$PKGROOT$MANDIR"/man1 \
369 "$PKGROOT$MANDIR"/man5 \
370 "$PKGROOT$MANDIR"/man8
372 BINLIST="fs klog klog.krb pagsh pagsh.krb pts sys tokens tokens.krb unlog unlog.krb aklog"
375 if [ x"$DO_X" = x1 ] ; then
376 # Don't print out every single 'ln -s'... that's kinda useless
377 : 'Symlinking commands and manpages into place...'
381 for f in $BINLIST; do
382 ln -s "$USRBIN2TOOLS"/bin/"$f" "$PKGROOT$USRBIN/$f"
384 for f in $ETCLIST; do
385 ln -s "$USRSBIN2TOOLS"/etc/"$f" "$PKGROOT$USRSBIN/$f"
388 for section in man1 man5 man8 ; do
389 for f in $(ls $PKGROOT/Library/OpenAFS/Tools/man/$section); do
391 if [ -L "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f" ] ; then
392 # If this manpage is a symlink, just change where it's pointing,
393 # and rename the link; don't actually 'gzip' it.
394 link=$(readlink "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f")
395 rm -f "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f"
396 ln -s "$link".gz "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f".gz
399 gzip -9 "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f"
401 ln -s ../"$MANDIR2TOOLS"/man/"$section/$f".gz \
402 "$PKGROOT$MANDIR/$section/$f".gz
406 if [ x"$DO_X" = x1 ] ; then
410 ln -s "$USRBIN2TOOLS"/bin/kpasswd "$PKGROOT$USRBIN"/kpasswd.afs
412 ln -s "$USRSBIN2TOOLS"/root.client/usr/vice/etc/afsd "$PKGROOT$USRSBIN"/afsd
414 chown -R root${SEP}wheel "$PKGROOT$PREFIX"
415 chmod -R og-w "$PKGROOT$PREFIX"
418 if [ x"$PASS2" = x1 ]; then
423 rm -rf "$CURDIR"/OpenAFS-debug-extension.pkg
424 /usr/bin/pkgbuild --root "$DPKGROOT" --id org.openafs.OpenAFS-debug.pkg \
425 --version '@VERSION@' \
426 "$CURDIR"/OpenAFS-debug-extension.pkg
429 cp OpenAFS.post_install "$PKGRES"/postinstall
430 cp OpenAFS.pre_upgrade "$PKGRES"/preupgrade
431 cp OpenAFS.post_install "$PKGRES"/postupgrade
432 cp csrvdbmerge.pl "$PKGRES"
434 chmod a+x "$PKGRES"/csrvdbmerge.pl \
435 "$PKGRES"/postinstall \
436 "$PKGRES"/postupgrade \
439 cp CellServDB.list "$PKGRES"
440 chown -R root${SEP}wheel "$PKGRES"
442 rm -rf "$CURDIR"/OpenAFS-dist.pkg
443 /usr/bin/pkgbuild --root "$PKGROOT" --id org.openafs.OpenAFS.pkg \
444 --version '@VERSION@' \
445 --scripts "$PKGRES" "$CURDIR"/OpenAFS-dist.pkg
449 cp background.jpg "$PKGRES"/background.jpg
450 cp License.rtf "$PKGRES"
451 cp ReadMe.rtf."$majorvers" "$PKGRES"/ReadMe.rtf
452 chown -R root${SEP}wheel "$PKGRES"
454 if [ $majorvers -ge 15 ] ; then
455 # For El Capitan and further, we have some extra information to tell
456 # the user at the end of the installation process.
457 cp conclusion.txt "$PKGRES"/conclusion.txt
458 PRES_EXTRA="<conclusion file=\"conclusion.txt\"/>"
461 # generate Distribution.xml from Distribution.xml.in -- nonstandard substs
462 sed -e "s/%%OSX_MAJOR_CUR%%/$THISREL/g" \
463 -e "s/%%OSX_MAJOR_NEXT%%/$(( $THISREL + 1 ))/g" \
464 -e "s,%%PRES_EXTRA%%,$PRES_EXTRA,g" \
465 -e "s/%%OPENAFS_VERSION%%/@VERSION@/g" \
466 < Distribution.xml.in > Distribution.xml
468 rm -rf "$CURDIR/prod"
470 mv "$CURDIR"/OpenAFS-dist.pkg "$CURDIR"/OpenAFS-debug-extension.pkg "$CURDIR"/prod
471 /usr/bin/productbuild --distribution Distribution.xml --resources "$PKGRES" \
472 --plugins "$PLUGINS" --package-path "$CURDIR"/prod "$CURDIR"/OpenAFS.pkg
474 if [ x"$INST_KEY" != x ] ; then
475 mv "$CURDIR"/OpenAFS.pkg "$CURDIR"/OpenAFS-unsigned.pkg
476 productsign --timestamp --sign "$INST_KEY" "$CURDIR"/OpenAFS-unsigned.pkg \
477 "$CURDIR"/OpenAFS.pkg
478 rm -f "$CURDIR"/OpenAFS-unsigned.pkg
482 rm -f "$CURDIR/TMP.dmg"
483 rm -rf "$CURDIR/OpenAFS-@VERSION@-$RELNAME.dmg"
486 mv "$CURDIR"/OpenAFS.pkg "$CURDIR"/dmg
487 cp "$RESSRC"/Uninstall.14.15 "$CURDIR"/dmg/Uninstall.command
488 cp "$RESSRC"/DS_Store "$CURDIR"/dmg/.DS_Store
489 mkdir "$CURDIR"/dmg/.background
490 cp "$RESSRC"/afslogo.jpg "$CURDIR"/dmg/.background
492 if [ x"$APP_KEY" != x ] ; then
493 codesign --verbose --force --timestamp --sign "$APP_KEY" "$CURDIR"/dmg/Uninstall.command
496 hdiutil create -srcfolder "$CURDIR"/dmg -volname OpenAFS \
498 hdiutil convert -format UDZO "$CURDIR"/TMP.dmg \
499 -o "$CURDIR/OpenAFS-@VERSION@-$RELNAME".dmg
502 echo "Created $CURDIR/OpenAFS-@VERSION@-$RELNAME".dmg