diff --git a/Makefile.in b/Makefile.in
index 429877576d..aac826fc86 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -93,8 +93,10 @@ dest_only_libafs: only_libafs dest_dirs
packages: dest
@case ${SYS_NAME} in \
- *_darwin_* ) \
+ *_darwin_1[2-4] | *_darwin_[6-9]0 | *_darwin_1[0-3]0 ) \
${COMPILE_PART1} packaging/MacOS && bash ./buildpkg.sh ${DEST} ;; \
+ *_darwin_* ) \
+ ${COMPILE_PART1} packaging/MacOS && bash ./pkgbuild.sh ${DEST} ;; \
hp_ux110 ) \
${COMPILE_PART1} packaging/HP-UX && swpackage -s psf-1.2.10-transarc-paths-11.00 ;; \
hp_ux11i ) \
diff --git a/configure.ac b/configure.ac
index 81384800e7..a00a6fd126 100644
--- a/configure.ac
+++ b/configure.ac
@@ -234,6 +234,7 @@ AC_OUTPUT([
src/packaging/MacOS/OpenAFS.Info.plist
src/packaging/MacOS/OpenAFS.info
src/packaging/MacOS/buildpkg.sh
+ src/packaging/MacOS/pkgbuild.sh
src/pam/Makefile
src/platform/Makefile
src/platform/${MKAFS_OSTYPE}/Makefile
diff --git a/src/afsd/afs.rc.darwin b/src/afsd/afs.rc.darwin
index 177a6258c1..6457ac7778 100644
--- a/src/afsd/afs.rc.darwin
+++ b/src/afsd/afs.rc.darwin
@@ -25,6 +25,9 @@ AFSD=$VICEETC/afsd
if [ -r /var/db/openafs ]; then
VICEETC=/var/db/openafs/etc
AFSD=/usr/sbin/afsd
+ if [ -x /opt/openafs/sbin/afsd ] ; then
+ AFSD=/opt/openafs/sbin/afsd
+ fi
fi
CONFIG=$VICEETC/config
diff --git a/src/packaging/MacOS/Distribution.xml.in b/src/packaging/MacOS/Distribution.xml.in
new file mode 100644
index 0000000000..96a2d8f32a
--- /dev/null
+++ b/src/packaging/MacOS/Distribution.xml.in
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ OpenAFS
+
+
+
+ %%PRES_EXTRA%%
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #OpenAFS-dist.pkg
+
+
+ #OpenAFS-debug-extension.pkg
+
+
+
diff --git a/src/packaging/MacOS/OpenAFS.post_install b/src/packaging/MacOS/OpenAFS.post_install
index fcb14696b1..b9ef27b40c 100644
--- a/src/packaging/MacOS/OpenAFS.post_install
+++ b/src/packaging/MacOS/OpenAFS.post_install
@@ -127,8 +127,10 @@ fi
# properly, we should acquire a certificate from a real CA and ship
# signed binaries. for now, make Application Firewall (Security prefs pane)
# happy like this. See TN2206
-if [ -f /usr/bin/codesign ]; then
- codesign -s - /usr/sbin/afsd
+if [ $majorvers -lt 14 ]; then
+ if [ -f /usr/bin/codesign ]; then
+ codesign -s - /usr/sbin/afsd
+ fi
fi
#here we should run tools which configure the client, and then if it's enabled:
diff --git a/src/packaging/MacOS/Uninstall.14.15 b/src/packaging/MacOS/Uninstall.14.15
new file mode 100755
index 0000000000..460fcebd81
--- /dev/null
+++ b/src/packaging/MacOS/Uninstall.14.15
@@ -0,0 +1,357 @@
+#!/usr/bin/perl -w
+# real Perl code begins here
+#
+# Adapted from Apple's uninstall-devtools.pl (Version 7 for Xcode Tools 1.2)
+#
+# BSD License: c.f.
+#
+
+use strict;
+use warnings;
+use File::Basename;
+
+use vars qw ($do_nothing $print_donothing_removals $receipts_dir $verbose $noisy_warnings);
+use vars qw ($suppress_spin $spin_counter $spin_state $spin_slower_downer);
+use vars qw (%exception_list $gen_dirs @gen_files @rmfiles @rmdirs @rmpkg);
+
+#----------------------------------------------------------------------------------------
+
+$do_nothing = 0;
+$print_donothing_removals = 1;
+$verbose = 1;
+$noisy_warnings = 0;
+
+# One of rm -rf in this script uses $receipts_dir -- change with care.
+$receipts_dir = "/Library/Receipts";
+
+%exception_list = (
+);
+
+$gen_dirs = { };
+
+@gen_files = (
+ "/var/db/openafs/etc/cacheinfo",
+ "/var/db/openafs/etc/ThisCell",
+ "/var/db/openafs/etc/config/afsd.options",
+ "/var/db/openafs/etc/config/afs.conf",
+ "/var/db/openafs/etc/CellServDB.save",
+ "/var/db/openafs/etc/CellServDB.master.last",
+ "/var/db/openafs/etc/CellServDB",
+ "/var/db/openafs/etc/config/settings.plist",
+);
+
+#----------------------------------------------------------------------------------------
+
+$| = 1;
+
+sub main {
+ # commandline args:
+ # 0: dir of packages to remove
+ # 1: flag indicating whether to keep package receipts
+ # 2: flag indicating whether to supress spin indicator
+
+ if (!@ARGV) {
+ use FindBin qw($Bin);
+ @ARGV = ("$Bin/..", 0, 0);
+ }
+ $suppress_spin = defined ($ARGV[2]) && $ARGV[2];
+
+ $spin_counter = 0;
+ $spin_state = 0;
+ spin_rate_slow ();
+
+ pre_print ();
+ print "Uninstalling OpenAFS package:\n\n";
+
+ remove_generated_files ();
+ remove_main_packages ();
+ remove_generated_directories ();
+
+ if ($do_nothing == 0) {
+ # When osascript runs some shell commands, newlines are printed as just
+ # \r instead of \n for some reason, so anything output kinda overwrites
+ # earlier output. The final 'tr' in the pipeline here turns them back
+ # into \n newlines. pkgutil --forget at least will print output like
+ # "Forgot package 'foo'".
+ my $rmcmd = "osascript -e 'do shell script \"/bin/rm -f @rmfiles; " .
+ "/bin/rmdir @rmdirs; echo @rmpkg | xargs -n 1 " .
+ "/usr/sbin/pkgutil --forget\" with administrator " .
+ "privileges' | tr '\\r' '\\n'";
+ system $rmcmd;
+ my $retcode = $? >> 8;
+ if ($retcode != 0) {
+ print_warning ("Warning: There may have been a problem uninstalling\n");
+ }
+ }
+
+ pre_print ();
+ print "\nFinished uninstalling.\n";
+}
+
+sub remove_main_packages {
+ my @pkglist = ("org.openafs.OpenAFS-debug.pkg",
+ "org.openafs.OpenAFS.pkg",
+ );
+
+ foreach (@pkglist) {
+ s/\.pkg$//;
+ my $pkgname = $_;
+ my $pkg = $pkgname.".pkg";
+ my $bomroot;
+
+ if (not open(INFO, '-|', "/usr/sbin/pkgutil --pkg-info $pkg | " .
+ "grep ^volume: | cut -d' ' -f2-")) {
+ print_warning("Warning: Could not get pkg info for $pkg " .
+ "(maybe it's not installed?)\n");
+ next;
+ }
+
+ $bomroot = ;
+ if ((not close(INFO)) or (!defined($bomroot))) {
+ print_warning("Warning: Could not get pkg info for $pkg " .
+ "(maybe it's not installed?)\n");
+ next;
+ }
+
+ chomp $bomroot;
+
+ pre_print();
+ print "\nFound pkg install root $bomroot for $pkg\n";
+
+ spin_rate_slow ();
+
+ if (not open (LSBOM, '-|', "/usr/sbin/pkgutil --only-files --files $pkg")) {
+ print_warning("Warning: Error running pkgutil --only-files --files $pkg\n");
+ next;
+ }
+
+ while () {
+ chomp;
+ m#^(.*/.*)$#;
+ next if (!defined ($1) || $1 eq "");
+ my $filename = $bomroot . $1;
+
+ remove_a_file ($filename);
+ }
+ close (LSBOM);
+
+ my $rooth = { };
+
+ if (not open (LSBOM, '-|', "/usr/sbin/pkgutil --only-dirs --files $pkg")) {
+ print_warning("Warning: Error running pkgutil --only-dirs --files $pkg\n");
+ next;
+ }
+
+ while () {
+ chomp;
+ m#^(.*/.*)$#;
+ next if (!defined ($1) || $1 eq "");
+ my $directory = $bomroot . $1;
+ if (-d $directory) {
+ $rooth = add_directory_to_tree ($directory, $rooth);
+ } else {
+ if ($noisy_warnings) {
+ print_warning ("Warning: \"$directory\" listed in BOM " .
+ "but not present on system.\n");
+ }
+ }
+ }
+ close (LSBOM);
+
+ spin_rate_fast ();
+ remove_empty_directories ($rooth, $bomroot);
+
+ remove_package_receipts($pkg) if (!defined ($ARGV[1]) || !$ARGV[1]);
+ }
+}
+
+sub remove_generated_files {
+ foreach (@gen_files) {
+ remove_a_file ($_);
+ }
+}
+
+sub remove_generated_directories {
+ remove_empty_directories ($gen_dirs, "/");
+}
+
+sub add_directory_to_tree {
+ my $dir = shift;
+ my $rooth = shift;
+ my $p = $rooth;
+
+ my @pathcomp = split /\//, $dir;
+
+ progress_point ();
+ foreach (@pathcomp) {
+ my $cur_name = $_;
+ if ($cur_name eq "" || !defined ($cur_name)) {
+ $cur_name = "/";
+ }
+ if (!defined ($p->{"$cur_name"})) {
+ $p->{$cur_name} = { };
+ }
+ $p = $p->{$cur_name};
+ }
+ return $rooth;
+}
+
+sub remove_empty_directories {
+ my $rooth = shift;
+ my $path = shift;
+ my $children = (scalar (keys %{$rooth}));
+ my $dirs_remain = 0;
+
+ if ($children > 0) {
+ foreach my $dirname (sort keys %{$rooth}) {
+ my $printpath;
+ $printpath = "$path/$dirname";
+ $printpath =~ s#^/*#/#;
+ remove_empty_directories ($rooth->{$dirname}, "$printpath");
+ $dirs_remain = 1 if (-d "$printpath");
+ }
+ }
+
+ if ($dirs_remain == 0) {
+ maybe_remove_ds_store ("$path");
+ }
+
+ remove_a_dir ("$path");
+}
+
+sub remove_a_file {
+ my $fn = shift;
+ my $dirname = dirname ($fn);
+ my $basename = basename ($fn);
+ my $ufs_rsrc_file = "$dirname/._$basename";
+
+ progress_point ();
+ return if (!defined ($fn) || $fn eq "");
+
+ # Leave any files that are shared between packages alone.
+ if (defined($exception_list{$fn})) {
+ if ($noisy_warnings) {
+ print_warning ("Warning: file \"$fn\" intentionally not removed, " .
+ "even though it's in the BOM.\n");
+ }
+ return;
+ }
+
+ if (! -f $fn && ! -l $fn) {
+ if ($noisy_warnings) {
+ print_warning ("Warning: file \"$fn\" present in BOM but not found on disc.\n");
+ }
+ return;
+ }
+
+ if ($do_nothing == 1) {
+ print_donothing ("rm $fn\n");
+ print_donothing ("rm $ufs_rsrc_file\n") if ( -f $ufs_rsrc_file);
+ } else {
+ unshift(@rmfiles, "$fn");
+ unshift(@rmfiles, "$ufs_rsrc_file") if ( -f $ufs_rsrc_file);
+ }
+}
+
+sub remove_a_dir {
+ my $dir = shift;
+
+ progress_point ();
+ return if (!defined ($dir) || $dir eq "" || $dir eq "/" || $dir eq "/usr");
+ if (! -d $dir) {
+ if ($noisy_warnings) {
+ print_warning ("Warning: directory \"$dir\" present in BOM " .
+ "but not found on disc.\n");
+ }
+ return;
+ }
+
+ if ($do_nothing == 1) {
+ print_donothing ("rmdir $dir\n");
+ } else {
+ push(@rmdirs, "$dir");
+ }
+}
+
+sub remove_package_receipts {
+ my $pkgname = shift;
+ $pkgname =~ s#/##g; # There shouldn't be any path seps in the pkg name...
+ return if (!defined ($pkgname) || $pkgname eq ""
+ || $pkgname eq "." || $pkgname eq "..");
+
+ if ($do_nothing == 1) {
+ print_donothing("pkgutil --forget $pkgname\n");
+ } else {
+ push(@rmpkg, $pkgname);
+ }
+}
+
+sub maybe_remove_ds_store {
+ my $path = shift;
+ my $filecount = 0;
+ return if (!defined ($path) || $path eq "" || $path eq "/" || $path eq "/usr");
+ return if (! -f "$path/.DS_Store");
+
+ open (LS, "/bin/ls -a '$path' |");
+ while () {
+ chomp;
+ next if (m#^\.$# || m#^\.\.$#);
+ $filecount++;
+ }
+ close (LS);
+
+ if ($filecount == 1) {
+ remove_a_file ("$path/.DS_Store");
+ }
+}
+
+sub print_donothing {
+ my $msg = shift;
+ return if ($print_donothing_removals != 1);
+ pre_print ();
+ print $msg;
+}
+
+sub print_verbose {
+ my $msg = shift;
+ return if ($verbose != 1);
+ pre_print ();
+ print $msg;
+}
+
+sub print_warning {
+ my $msg = shift;
+ pre_print ();
+ print STDERR $msg;
+}
+
+sub print_error {
+ my $msg = shift;
+ pre_print ();
+ print STDERR $msg;
+}
+
+sub pre_print {
+ print " " unless ($suppress_spin);
+}
+
+sub spin_rate_slow {
+ $spin_slower_downer = 150;
+}
+
+sub spin_rate_fast {
+ $spin_slower_downer = 75;
+}
+
+sub progress_point {
+ return if ($suppress_spin);
+ $spin_counter++;
+ if (($spin_counter % $spin_slower_downer) == 0) {
+ my $spin_chars = "|/-\\";
+ my $c = substr ($spin_chars, $spin_state % 4, 1);
+ $spin_state++;
+ print "[7m$c[m";
+ }
+}
+
+main ();
diff --git a/src/packaging/MacOS/conclusion.txt b/src/packaging/MacOS/conclusion.txt
new file mode 100644
index 0000000000..60ff1eaad3
--- /dev/null
+++ b/src/packaging/MacOS/conclusion.txt
@@ -0,0 +1,3 @@
+OpenAFS commands have been installed into /opt/openafs/, instead of the old locations in /usr/bin/ and /usr/sbin/. You must start a new shell for your PATH to be automatically updated to find these commands.
+
+Alternatively, you can just add /opt/openafs/bin and /opt/openafs/sbin into your PATH manually.
diff --git a/src/packaging/MacOS/pkgbuild.sh.in b/src/packaging/MacOS/pkgbuild.sh.in
new file mode 100644
index 0000000000..67f3cc99f4
--- /dev/null
+++ b/src/packaging/MacOS/pkgbuild.sh.in
@@ -0,0 +1,495 @@
+#!/bin/bash
+# Portions Copyright (c) 2003, 2006 Apple Computer, Inc. All rights reserved.
+echo '**BUILDPKG**' "$@"
+
+usage() {
+ exec >&2
+
+ echo 'Usage: pkgbuild.sh [-x] [--app-key ] [--inst-key ]'
+ echo ' [--pass N] [--csdb ] '
+ echo
+ echo '--app-key and --inst-key are for signing. -x prints all comamnds as '
+ echo 'they are run.'
+ echo
+ echo 'By default, all passes are run. Available passes:'
+ echo ' --pass 1: prepare pkgroot'
+ echo ' --pass 2: create packages/installer from pkgroot'
+ echo 'If you want to alter the pkgroot, run pass 1, then alter what you'
+ echo 'want, and then run pass 2 to create the resulting packages.'
+ echo 'The --pass argument may be given multiple times.'
+ exit 1
+}
+
+if [ x"$#" = x0 ]; then
+ usage
+fi
+
+anypass=0
+PASS1=
+PASS2=
+
+APP_KEY=
+INST_KEY=
+DEST_DIR=
+CSDB=
+
+while [ x"$#" != x0 ] ; do
+ key="$1"
+ shift
+
+ case "$key" in
+ --app-key)
+ APP_KEY="$1"
+ shift
+ ;;
+ --inst-key)
+ INST_KEY="$1"
+ shift
+ ;;
+ --csdb)
+ CSDB="$1"
+ shift
+ ;;
+ --pass)
+ anypass=1
+ pass_arg="$1"
+ shift
+ case "$pass_arg" in
+ 1)
+ PASS1=1
+ ;;
+ 2)
+ PASS2=1
+ ;;
+ *)
+ echo "Unknown pass $pass_arg" >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ -x)
+ DO_X=1
+ ;;
+ *)
+ if [ x"$DEST_DIR" = x ] ; then
+ DEST_DIR="$key"
+ else
+ echo "Error: Unknown arg $key" >&2
+ usage
+ fi
+ ;;
+ esac
+done
+
+if [ x"$anypass" = x0 ] ; then
+ PASS1=1
+ PASS2=1
+fi
+
+if [ x"$DEST_DIR" = x ] ; then
+ echo "Error: binary 'dest' dir not given"
+ usage
+fi
+
+set -e
+
+if [ x"$DO_X" = x1 ] ; then
+ set -x
+fi
+
+BINDEST=`cd "$DEST_DIR" && pwd`
+CURDIR=`pwd`
+RESSRC=`dirname "$0"`
+RESSRC=`cd "$RESSRC" && pwd`
+majorvers=`uname -r | cut -d. -f1`
+
+if [ x"$majorvers" = x10 ]; then
+ RELNAME="Snowleopard"
+ THISREL=6
+
+elif [ x"$majorvers" = x11 ]; then
+ RELNAME="Lion"
+ THISREL=7
+
+elif [ x"$majorvers" = x12 ]; then
+ RELNAME="MountainLion"
+ THISREL=8
+
+elif [ x"$majorvers" = x13 ]; then
+ RELNAME="Mavericks"
+ THISREL=9
+
+elif [ x"$majorvers" = x14 ]; then
+ RELNAME="Yosemite"
+ THISREL=10
+
+elif [ x"$majorvers" = x15 ]; then
+ RELNAME="ElCapitan"
+ THISREL=11
+
+elif [ x"$majorvers" = x ] ; then
+ echo "Error running uname" >&2
+ exit 1
+
+else
+ echo "Unknown major version $majorvers" >&2
+ exit 1
+fi
+
+SEP=:
+
+PKGROOT="$CURDIR"/pkgroot
+PKGRES="$CURDIR"/pkgres
+DPKGROOT="$CURDIR"/dpkgroot
+PLUGINS="$CURDIR"/plugins
+if test -e /usr/bin/pkgbuild; then
+ :
+else
+ echo pkgbuild not found >&2
+ exit 1
+fi
+if test -e /usr/bin/productbuild; then
+ :
+else
+ echo productbuild not found >&2
+ exit 1
+fi
+
+if [ x"$PASS1" = x1 ]; then
+ if [ -x /usr/bin/curl ] && [ x"$CSDB" = x ]; then
+ echo "No CellServDB provided; downloading one from central.org"
+ /usr/bin/curl -f -O https://www.central.org/dl/cellservdb/CellServDB
+ if [ -f "$CURDIR"/CellServDB ] ; then
+ CSDB="$CURDIR"/CellServDB
+ fi
+ fi
+
+ if [ x"$CSDB" = x ]; then
+ echo "A CellServDB file must be provided with --csdb" >&2
+ die=1
+ else
+ # Turn CSDB into an absolute path
+ case "$CSDB" in
+ /*)
+ ;;
+ *)
+ CSDB="$CURDIR/$CSDB"
+ ;;
+ esac
+
+ if grep -q 'GCO Public CellServDB' "$CSDB" ; then
+ touch "$CSDB"
+ else
+ echo "A proper CellServDB file must be provided" >&2
+ die=1
+ fi
+ fi
+
+ for f in ReadMe.rtf."$majorvers" \
+ License.rtf \
+ CellServDB.list \
+ OpenAFS.info \
+ OpenAFS.post_install \
+ OpenAFS.pre_upgrade \
+ csrvdbmerge.pl \
+ 2.0.txt
+ do
+ if [ ! -f "$RESSRC/$f" ]; then
+ echo "file missing: $RESSRC/$f" >&2
+ die=1
+ fi
+ done
+ if [ x"$die" = x1 ]; then
+ echo "Correct above errors; then retry" >&2
+ exit 1
+ fi
+
+ for f in "$BINDEST"/bin/translate_et \
+ "$BINDEST/root.client/usr/vice/etc/afs.kext/Contents/MacOS/afs"
+ do
+ if [ ! -f "$f" ] ; then
+ echo "dest file missing: $f" >&2
+ die=1
+ fi
+ done
+ if [ x"$die" = x1 ]; then
+ echo $BINDEST " is not a valid binary dir. it should be the result of" >&2
+ echo "make dest" >&2
+ exit 1
+ fi
+
+ rm -rf "$PKGROOT" "$PLUGINS"
+ mkdir "$PKGROOT"
+ mkdir "$PLUGINS"
+
+ mkdir -p "$PKGROOT"/Library
+ mkdir -p "$PKGROOT"/Library/PreferencePanes
+ mkdir -p "$PKGROOT"/Library/Security/SecurityAgentPlugins
+
+ chown -R root${SEP}admin "$PKGROOT"
+ chmod -R 755 "$PKGROOT"
+
+ (cd "$BINDEST"/tools && pax -rw OpenAFS.prefPane "$PKGROOT"/Library/PreferencePanes/)
+ (cd "$BINDEST"/tools && pax -rw aklog.bundle \
+ "$PKGROOT"/Library/Security/SecurityAgentPlugins/)
+
+ mkdir -p "$PKGROOT"/Library/OpenAFS/Tools
+ (cd "$BINDEST" && pax -rw * "$PKGROOT"/Library/OpenAFS/Tools)
+
+ cd "$RESSRC"
+ mv "$PKGROOT"/Library/OpenAFS/Tools/installer/* "$PLUGINS"/
+
+ mkdir -p "$PKGROOT"/Library/LaunchDaemons
+ chmod -R o-w "$PKGROOT"/Library
+ chmod -R g-w "$PKGROOT"/Library
+
+ cp openafs.launchd.plist "$PKGROOT"/Library/LaunchDaemons/org.openafs.filesystems.afs.plist
+ chmod 644 "$PKGROOT"/Library/LaunchDaemons/org.openafs.filesystems.afs.plist
+
+ chown root${SEP}admin "$PKGROOT"/Library
+ chown -R root${SEP}wheel "$PKGROOT"/Library/LaunchDaemons
+ chown -R root${SEP}wheel "$PKGROOT"/Library/OpenAFS/Tools
+ chmod -R og-w "$PKGROOT"/Library/OpenAFS/Tools
+
+ mkdir -p "$PKGROOT"/private/var/db/openafs/cache
+ mkdir -p "$PKGROOT"/private/var/db/openafs/etc/config
+
+ cp openafs.launchdaemon "$PKGROOT"/private/var/db/openafs/etc/launchafs.sh
+ chmod 755 "$PKGROOT"/private/var/db/openafs/etc/launchafs.sh
+
+ cp "$CSDB" "$PKGROOT"/private/var/db/openafs/etc/CellServDB.master
+ echo grand.central.org > "$PKGROOT"/private/var/db/openafs/etc/ThisCell.sample
+ echo /afs:/var/db/openafs/cache:100000 > \
+ "$PKGROOT"/private/var/db/openafs/etc/cacheinfo.sample
+
+ cp -RP "$PKGROOT"/Library/OpenAFS/Tools/etc/afssettings \
+ "$PKGROOT"/private/var/db/openafs/etc/config
+ cp settings.plist "$PKGROOT"/private/var/db/openafs/etc/config/settings.plist.orig
+ cp afs.conf "$PKGROOT"/private/var/db/openafs/etc/config/afs.conf.sample
+ cp krb5-weak.conf "$PKGROOT"/private/var/db/openafs/etc/krb5-weak.conf
+
+ cp decode-panic "$PKGROOT"/Library/OpenAFS/Tools/tools
+ chmod a+x "$PKGROOT"/Library/OpenAFS/Tools/tools/decode-panic
+
+ rm -rf "$DPKGROOT"
+ mkdir "$DPKGROOT"
+ mkdir -p "$DPKGROOT"/Library/OpenAFS/Debug
+
+ mv "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext.dSYM \
+ "$DPKGROOT"/Library/OpenAFS/Debug/
+ cp -RP "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
+ "$DPKGROOT"/Library/OpenAFS/Debug/
+ chown -R root${SEP}wheel "$DPKGROOT"/Library/OpenAFS/Debug
+ chmod -R og-w "$DPKGROOT"/Library/OpenAFS/Debug
+
+ strip -X -S \
+ "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext/Contents/MacOS/afs
+
+ mkdir -p "$PKGROOT"/private/var/db/openafs
+
+ cp -RP "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
+ "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/C \
+ "$PKGROOT"/private/var/db/openafs/etc
+
+ chown -R root${SEP}wheel "$PKGROOT"/private
+ chmod -R og-w "$PKGROOT"/private
+
+ chown -R root${SEP}wheel "$PKGROOT"/private
+ chmod -R og-w "$PKGROOT"/private
+ chmod og-rx "$PKGROOT"/private/var/db/openafs/cache
+
+ if [ x"$APP_KEY" != x ] ; then
+ # Sign each 'thing' that we have (commands, kexts, etc)
+ for obj in "$DPKGROOT"/Library/OpenAFS/Debug/afs.kext \
+ "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
+ "$PKGROOT"/private/var/db/openafs/etc/afs.kext \
+ "$PKGROOT"/Library/PreferencePanes/OpenAFS.prefPane/Contents/Resources/AFSBackgrounder.app \
+ "$PKGROOT"/Library/PreferencePanes/OpenAFS.prefPane \
+ "$PKGROOT"/Library/Security/SecurityAgentPlugins/aklog.bundle \
+ "$PKGROOT"/Library/OpenAFS/Tools/tools/growlagent-openafs.app \
+ "$PKGROOT"/Library/OpenAFS/Tools/tools/aklog.bundle \
+ "$PLUGINS"/afscell.bundle
+ do
+ codesign --verbose --force --timestamp --sign "$APP_KEY" "$obj"
+ done
+
+ # Check if our signatures for our kexts are valid. 'kextutil' will exit
+ # with an error and print out a message if something is wrong with the
+ # signature. Note that a code signing cert must have the
+ # 1.2.840.113635.100.6.1.18 extension present to be used for kexts
+ # (most code signing certs cannot be used for kexts).
+ for kext in "$DPKGROOT"/Library/OpenAFS/Debug/afs.kext \
+ "$PKGROOT"/Library/OpenAFS/Tools/root.client/usr/vice/etc/afs.kext \
+ "$PKGROOT"/private/var/db/openafs/etc/afs.kext
+ do
+ kextutil -no-load -print-diagnostics "$kext"
+ done
+ fi
+
+ if [ $majorvers -ge 15 ]; then
+ # El Capitan and further prevent us from touching /usr/bin directly
+ PREFIX=/opt
+ USRBIN=/opt/openafs/bin
+ USRBIN2TOOLS=../../../Library/OpenAFS/Tools
+
+ USRSBIN=/opt/openafs/sbin
+ USRSBIN2TOOLS=../../../Library/OpenAFS/Tools
+
+ MANDIR=/opt/openafs/share/man
+ MANDIR2TOOLS=../../../../Library/OpenAFS/Tools
+
+ # Add our bin, sbin, and man directories to the default search path
+ mkdir -p "$PKGROOT"/etc/paths.d "$PKGROOT"/etc/manpaths.d
+ echo "$USRBIN" > "$PKGROOT"/etc/paths.d/40-openafs
+ echo "$USRSBIN" >> "$PKGROOT"/etc/paths.d/40-openafs
+ echo "$MANDIR" > "$PKGROOT"/etc/manpaths.d/40-openafs
+ else
+ PREFIX=/usr
+ USRBIN=/usr/bin
+ USRBIN2TOOLS=../../Library/OpenAFS/Tools
+
+ USRSBIN=/usr/sbin
+ USRSBIN2TOOLS="$USRBIN2TOOLS"
+
+ MANDIR=/usr/share/man
+ MANDIR2TOOLS=../../../Library/OpenAFS/Tools
+ fi
+
+ mkdir -p "$PKGROOT$USRBIN" \
+ "$PKGROOT$USRSBIN" \
+ "$PKGROOT$MANDIR"/man1 \
+ "$PKGROOT$MANDIR"/man5 \
+ "$PKGROOT$MANDIR"/man8
+
+ BINLIST="fs klog klog.krb pagsh pagsh.krb pts sys tokens tokens.krb unlog unlog.krb aklog"
+ ETCLIST="vos"
+
+ if [ x"$DO_X" = x1 ] ; then
+ # Don't print out every single 'ln -s'... that's kinda useless
+ : 'Symlinking commands and manpages into place...'
+ set +x
+ fi
+
+ for f in $BINLIST; do
+ ln -s "$USRBIN2TOOLS"/bin/"$f" "$PKGROOT$USRBIN/$f"
+ done
+ for f in $ETCLIST; do
+ ln -s "$USRSBIN2TOOLS"/etc/"$f" "$PKGROOT$USRSBIN/$f"
+ done
+
+ for section in man1 man5 man8 ; do
+ for f in $(ls $PKGROOT/Library/OpenAFS/Tools/man/$section); do
+
+ if [ -L "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f" ] ; then
+ # If this manpage is a symlink, just change where it's pointing,
+ # and rename the link; don't actually 'gzip' it.
+ link=$(readlink "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f")
+ rm -f "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f"
+ ln -s "$link".gz "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f".gz
+
+ else
+ gzip -9 "$PKGROOT/Library/OpenAFS/Tools/man/$section/$f"
+ fi
+ ln -s ../"$MANDIR2TOOLS"/man/"$section/$f".gz \
+ "$PKGROOT$MANDIR/$section/$f".gz
+ done
+ done
+
+ if [ x"$DO_X" = x1 ] ; then
+ set -x
+ fi
+
+ ln -s "$USRBIN2TOOLS"/bin/kpasswd "$PKGROOT$USRBIN"/kpasswd.afs
+
+ ln -s "$USRSBIN2TOOLS"/root.client/usr/vice/etc/afsd "$PKGROOT$USRSBIN"/afsd
+
+ chown -R root${SEP}wheel "$PKGROOT$PREFIX"
+ chmod -R og-w "$PKGROOT$PREFIX"
+fi
+
+if [ x"$PASS2" = x1 ]; then
+ rm -rf "$PKGRES"
+ mkdir "$PKGRES"
+ cd "$RESSRC"
+
+ rm -rf "$CURDIR"/OpenAFS-debug-extension.pkg
+ /usr/bin/pkgbuild --root "$DPKGROOT" --id org.openafs.OpenAFS-debug.pkg \
+ --version '@VERSION@' \
+ "$CURDIR"/OpenAFS-debug-extension.pkg
+
+ cd "$RESSRC"
+ cp OpenAFS.post_install "$PKGRES"/postinstall
+ cp OpenAFS.pre_upgrade "$PKGRES"/preupgrade
+ cp OpenAFS.post_install "$PKGRES"/postupgrade
+ cp csrvdbmerge.pl "$PKGRES"
+
+ chmod a+x "$PKGRES"/csrvdbmerge.pl \
+ "$PKGRES"/postinstall \
+ "$PKGRES"/postupgrade \
+ "$PKGRES"/preupgrade
+
+ cp CellServDB.list "$PKGRES"
+ chown -R root${SEP}wheel "$PKGRES"
+
+ rm -rf "$CURDIR"/OpenAFS-dist.pkg
+ /usr/bin/pkgbuild --root "$PKGROOT" --id org.openafs.OpenAFS.pkg \
+ --version '@VERSION@' \
+ --scripts "$PKGRES" "$CURDIR"/OpenAFS-dist.pkg
+
+ rm -rf "$PKGRES"
+ mkdir "$PKGRES"
+ cp background.jpg "$PKGRES"/background.jpg
+ cp License.rtf "$PKGRES"
+ cp ReadMe.rtf."$majorvers" "$PKGRES"/ReadMe.rtf
+ chown -R root${SEP}wheel "$PKGRES"
+
+ if [ $majorvers -ge 15 ] ; then
+ # For El Capitan and further, we have some extra information to tell
+ # the user at the end of the installation process.
+ cp conclusion.txt "$PKGRES"/conclusion.txt
+ PRES_EXTRA=""
+ fi
+
+ # generate Distribution.xml from Distribution.xml.in -- nonstandard substs
+ sed -e "s/%%OSX_MAJOR_CUR%%/$THISREL/g" \
+ -e "s/%%OSX_MAJOR_NEXT%%/$(( $THISREL + 1 ))/g" \
+ -e "s,%%PRES_EXTRA%%,$PRES_EXTRA,g" \
+ -e "s/%%OPENAFS_VERSION%%/@VERSION@/g" \
+ < Distribution.xml.in > Distribution.xml
+
+ rm -rf "$CURDIR/prod"
+ mkdir "$CURDIR/prod"
+ mv "$CURDIR"/OpenAFS-dist.pkg "$CURDIR"/OpenAFS-debug-extension.pkg "$CURDIR"/prod
+ /usr/bin/productbuild --distribution Distribution.xml --resources "$PKGRES" \
+ --plugins "$PLUGINS" --package-path "$CURDIR"/prod "$CURDIR"/OpenAFS.pkg
+
+ if [ x"$INST_KEY" != x ] ; then
+ mv "$CURDIR"/OpenAFS.pkg "$CURDIR"/OpenAFS-unsigned.pkg
+ productsign --timestamp --sign "$INST_KEY" "$CURDIR"/OpenAFS-unsigned.pkg \
+ "$CURDIR"/OpenAFS.pkg
+ rm -f "$CURDIR"/OpenAFS-unsigned.pkg
+ fi
+
+ rm -rf "$CURDIR/dmg"
+ rm -f "$CURDIR/TMP.dmg"
+ rm -rf "$CURDIR/OpenAFS-@VERSION@-$RELNAME.dmg"
+
+ mkdir "$CURDIR"/dmg
+ mv "$CURDIR"/OpenAFS.pkg "$CURDIR"/dmg
+ cp "$RESSRC"/Uninstall.14.15 "$CURDIR"/dmg/Uninstall.command
+ cp "$RESSRC"/DS_Store "$CURDIR"/dmg/.DS_Store
+ mkdir "$CURDIR"/dmg/.background
+ cp "$RESSRC"/afslogo.jpg "$CURDIR"/dmg/.background
+
+ if [ x"$APP_KEY" != x ] ; then
+ codesign --verbose --force --timestamp --sign "$APP_KEY" "$CURDIR"/dmg/Uninstall.command
+ fi
+
+ hdiutil create -srcfolder "$CURDIR"/dmg -volname OpenAFS \
+ -o "$CURDIR"/TMP.dmg
+ hdiutil convert -format UDZO "$CURDIR"/TMP.dmg \
+ -o "$CURDIR/OpenAFS-@VERSION@-$RELNAME".dmg
+
+ echo
+ echo "Created $CURDIR/OpenAFS-@VERSION@-$RELNAME".dmg
+fi