Sync with upstream for Mac OS X (and other) fixes.

This commit is contained in:
Todd C. Miller
2012-04-20 15:36:23 -04:00
parent c19ec8f9f6
commit cc07164d92

215
pp
View File

@@ -1,6 +1,6 @@
#!/bin/sh
# Copyright 2012 Quest Software, Inc. ALL RIGHTS RESERVED
pp_revision="341"
pp_revision="352"
# Copyright 2012 Quest Software, Inc. ALL RIGHTS RESERVED.
#
# Redistribution and use in source and binary forms, with or without
@@ -1595,7 +1595,7 @@ pp_aix_detect_os () {
pp_aix_version_fix () {
typeset v
v=`echo $1 | tr -c -d '[0-9].\012'`
v=`echo $1 | sed 's/[-+]/./' | tr -c -d '[0-9].\012' | awk -F"." '{ printf "%d.%d.%d.%.4s", $1, $2, $3, $4 }' | sed 's/[.]*$//g'`
if test x"$v" != x"$1"; then
pp_warn "stripped version '$1' to '$v'"
fi
@@ -1796,6 +1796,7 @@ cmd_arg="$cmd_arg"
stop_signal=$stop_signal
force_signal=9
srcgroup="$pp_aix_mkssys_group"
instances_allowed=${pp_aix_mkssys_instances_allowed:--Q}
lssrc -s \$svc > /dev/null 2>&1
if [ \$? -eq 0 ]; then
@@ -1806,7 +1807,7 @@ if [ \$? -eq 0 ]; then
rmsys -s \$svc > /dev/null 2>&1
fi
mkssys -s \$svc -u \$uid -p "\$cmd_cmd" \${cmd_arg:+-a "\$cmd_arg"} -S -n \$stop_signal -f 9 ${pp_aix_mkssys_args} \${srcgroup:+-G \$srcgroup}
mkssys -s \$svc -u \$uid -p "\$cmd_cmd" \${cmd_arg:+-a "\$cmd_arg"} -S -n \$stop_signal -f 9 ${pp_aix_mkssys_args} \${srcgroup:+-G \$srcgroup} \$instances_allowed
.
#-- add code to start the service on reboot
@@ -1912,7 +1913,7 @@ pp_backend_aix () {
bosboot=N; pp_contains_any "$pp_aix_bosboot" $cmp && bosboot=b
echo $pp_aix_bff_name.$ex \
${pp_aix_version:-`pp_aix_version_fix "$version"`} \
`[ $pp_aix_version ] && pp_aix_version_fix $pp_aix_version || pp_aix_version_fix "$version"` \
1 $bosboot $content \
$pp_aix_lang "$summary $briefex"
echo "["
@@ -2062,7 +2063,7 @@ pp_backend_aix_cleanup () {
}
pp_backend_aix_names () {
echo "$name.${pp_aix_version:-`pp_aix_version_fix "$version"`}.bff"
echo "$name.`[ $pp_aix_version ] && pp_aix_version_fix $pp_aix_version || pp_aix_version_fix "$version"`.bff"
}
pp_backend_aix_install_script () {
@@ -2181,7 +2182,7 @@ pp_backend_aix_vas_platforms () {
esac
}
pp_backend_aix_function () {
case $1 in
case "$1" in
pp_mkgroup) cat <<'.';;
/usr/sbin/lsgroup "$1" >/dev/null &&
return 0
@@ -2782,7 +2783,7 @@ pp_backend_sd_init_svc_vars () {
:
}
pp_backend_sd_function () {
case $1 in
case "$1" in
pp_mkgroup) cat <<'.';;
/usr/sbin/groupmod "$1" 2>/dev/null ||
/usr/sbin/groupadd "$1"
@@ -3355,7 +3356,7 @@ pp_backend_solaris_vas_platforms () {
esac
}
pp_backend_solaris_function() {
case $1 in
case "$1" in
pp_mkgroup) cat<<'.';;
/usr/sbin/groupmod "$1" 2>/dev/null && return 0
/usr/sbin/groupadd "$1"
@@ -4601,7 +4602,7 @@ esac
chmod 755 $out
}
pp_backend_deb_function() {
case $1 in
case "$1" in
pp_mkgroup) cat<<'.';;
/usr/sbin/groupmod "$1" 2>/dev/null && return 0
/usr/sbin/groupadd "$1"
@@ -4952,7 +4953,7 @@ cat <<-'.' >> $out
return $rc
}
case $1 in
case "$1" in
start_msg) echo "Starting $svcs";;
stop_msg) echo "Stopping $svcs";;
start) pp_start;;
@@ -5018,7 +5019,7 @@ pp_kit_service_script () {
kill -0 "$pid" 2>/dev/null
fi
}
case $1 in
case "$1" in
start_msg) echo "Starting the $svc service";;
stop_msg) echo "Stopping the $svc service";;
start)
@@ -6416,7 +6417,7 @@ pp_rpm_service_make_init_script () {
chmod 755 $out
}
pp_backend_rpm_function () {
case $1 in
case "$1" in
pp_mkgroup) cat<<'.';;
/usr/sbin/groupadd -f -r "$1"
.
@@ -6527,7 +6528,7 @@ pp_backend_rpm_function () {
Examples found in /System/Library/LaunchDaemons/
See manual page launchd.plist(5) for details:
{ Label: "com.quest.vintela.foo", # required
{ Label: "com.quest.rc.foo", # required
Program: "/sbin/program",
ProgramArguments: [ "/sbin/program", "arg1", "arg2" ], # required
RunAtLoad: true,
@@ -6673,18 +6674,55 @@ pp_macos_rewrite_cpio () {
undef %users;
undef %groups;
# parse the cpio file
while (read(STDIN, my $header, 76)) {
die "bad magic" unless $header =~ m/^070707/;
my $namesize = oct(substr($header, 59, 6));
my $filesize = oct(substr($header, 65, 11));
read(STDIN, my $name, $namesize);
# update uid, gid and mode
my $hdrlen = 76;
while (read(STDIN, my $header, $hdrlen)) {
my ($name, $namesize, $filesize);
my $filepad = 0;
if ($header =~ m/^07070[12]/) {
# SVR4 ASCII format, convert to ODC
if ($hdrlen == 76) {
# Read in rest of header and update header len for SVR4
read(STDIN, $header, 110 - 76, 76);
$hdrlen = 110;
}
my $ino = hex(substr($header, 6, 8)) & 0x3ffff;
my $mode = hex(substr($header, 14, 8)) & 0x3ffff;
my $uid = hex(substr($header, 22, 8)) & 0x3ffff;
my $gid = hex(substr($header, 30, 8)) & 0x3ffff;
my $nlink = hex(substr($header, 38, 8)) & 0x3ffff;
my $mtime = hex(substr($header, 46, 8)) & 0xffffffff;
$filesize = hex(substr($header, 54, 8)) & 0xffffffff;
my $dev_maj = hex(substr($header, 62, 8));
my $dev_min = hex(substr($header, 70, 8));
my $dev = &makedev($dev_maj, $dev_min) & 0x3ffff;
my $rdev_maj = hex(substr($header, 78, 8));
my $rdev_min = hex(substr($header, 86, 8));
my $rdev = &makedev($rdev_maj, $rdev_min) & 0x3ffff;
$namesize = hex(substr($header, 94, 8)) & 0x3ffff;
read(STDIN, $name, $namesize);
# Header + name is padded to a multiple of 4 bytes
my $namepad = (($hdrlen + $namesize + 3) & 0xfffffffc) - ($hdrlen + $namesize);
read(STDIN, my $padding, $namepad) if ($namepad);
# File data is padded to be a multiple of 4 bytes
$filepad = (($filesize + 3) & 0xfffffffc) - $filesize;
my $new_header = sprintf("070707%06o%06o%06o%06o%06o%06o%06o%011o%06o%011o", $dev, $ino, $mode, $uid, $gid, $nlink, $rdev, $mtime, $namesize, $filesize);
$header = $new_header;
} elsif ($header =~ m/^070707/) {
# POSIX Portable ASCII Format
$namesize = oct(substr($header, 59, 6));
$filesize = oct(substr($header, 65, 11));
read(STDIN, $name, $namesize);
} else {
die "bad magic";
}
# update uid, gid and mode (already in octal)
substr($header, 24, 6) = $uid{$name} if exists $uid{$name};
substr($header, 30, 6) = $gid{$name} if exists $gid{$name};
substr($header, 18, 6) = $mode{$name} if exists $mode{$name};
print($header, $name);
# check for trailer at EOF
last if $filesize == 0 && $name eq "TRAILER!!!\0";
last if $filesize == 0 && $name =~ /^TRAILER!!!\0/;
# copy-through the file data
while ($filesize > 0) {
my $seg = 8192;
@@ -6693,6 +6731,8 @@ pp_macos_rewrite_cpio () {
print $data;
$filesize -= $seg;
}
# If file data is padded, skip it
read(STDIN, my $padding, $filepad) if ($filepad);
}
# pass through any padding at the end (blocksize-dependent)
for (;;) {
@@ -6701,6 +6741,10 @@ pp_macos_rewrite_cpio () {
print $data;
}
exit(0);
sub makedev {
(((($_[0] & 0xff)) << 24) | ($_[1] & 0xffffff));
}
__DATA__
.
# Append to the script the %files data
@@ -6832,7 +6876,7 @@ pp_backend_macos () {
}
pp_backend_macos_bundle () {
typeset pkgdir Contents Resources lprojdir
typeset pkgdir Contents Resources lprojdir svc
typeset Info_plist Description_plist
typeset bundle_vendor bundle_version size cmp filelists
@@ -6898,6 +6942,12 @@ pp_backend_macos_bundle () {
cp -R ${pp_macos_pkg_license} $Resources/License.$sfx
fi
# Add services (may modify %files)
for svc in $pp_services .; do
test . = "$svc" && continue
pp_macos_add_service $svc
done
# Find file lists (%files.* includes ignore files)
for cmp in $pp_components; do
test -f $pp_wrkdir/%files.$cmp && filelists="$filelists${filelists:+ }$pp_wrkdir/%files.$cmp"
@@ -7021,6 +7071,8 @@ CompressedSize 0
echo "requires=$pp_macos_requires" >> $Resources/uninstall
fi
. $pp_wrkdir/%fixup
# Create the bill-of-materials (Archive.bom)
cat $filelists | pp_macos_files_bom | sort |
pp_macos_bom_fix_parents > $pp_wrkdir/tmp.bomls
@@ -7040,7 +7092,7 @@ CompressedSize 0
}
pp_backend_macos_flat () {
typeset pkgdir bundledir Resources lprojdir
typeset pkgdir bundledir Resources lprojdir svc
typeset Info_plist Description_plist
typeset bundle_vendor bundle_version size numfiles cmp filelists
@@ -7063,6 +7115,12 @@ pp_backend_macos_flat () {
mkdir $pkgdir $bundledir $Resources $lprojdir ||
pp_error "Can't make package temporary directories"
# Add services (may modify %files)
for svc in $pp_services .; do
test . = "$svc" && continue
pp_macos_add_service $svc
done
# Find file lists (%files.* includes ignore files)
for cmp in $pp_components; do
test -f $pp_wrkdir/%files.$cmp && filelists="$filelists${filelists:+ }$pp_wrkdir/%files.$cmp"
@@ -7183,6 +7241,8 @@ pp_backend_macos_flat () {
</pkg-info>
.
. $pp_wrkdir/%fixup
# Create the bill-of-materials (Bom)
cat $filelists | pp_macos_files_bom | sort |
pp_macos_bom_fix_parents > $pp_wrkdir/tmp.bomls
@@ -7197,7 +7257,13 @@ pp_backend_macos_flat () {
test -d $pp_wrkdir/bom_stage && $pp_macos_sudo rm -rf $pp_wrkdir/bom_stage
# Create the flat package with xar (like pkgutil --flatten does)
(cd $pkgdir && /usr/bin/xar --distribution --no-compress Scripts --no-compress Payload -jcf "../$name-$version.pkg" *)
# Note that --distribution is only supported by Mac OS X 10.6 and above
xar_flags="--compression=bzip2 --no-compress Scripts --no-compress Payload"
case $mac_version in
"10.5"*) ;;
*) xar_flags="$xar_flags --distribution";;
esac
(cd $pkgdir && /usr/bin/xar $xar_flags -cf "../$name-$version.pkg" *)
}
pp_backend_macos_cleanup () {
@@ -7273,7 +7339,106 @@ pp_backend_macos_install_script () {
}
pp_backend_macos_init_svc_vars () {
:
pp_macos_start_services_after_install=false
pp_macos_service_name=
pp_macos_default_service_id_prefix="com.quest.rc."
pp_macos_service_id=
pp_macos_service_user=
pp_macos_service_group=
pp_macos_service_initgroups=
pp_macos_service_umask=
pp_macos_service_cwd=
pp_macos_service_nice=
pp_macos_svc_plist_file=
}
pp_macos_launchd_plist () {
typeset svc svc_id
svc="$1"
svc_id="$2"
set -- $cmd
if [ -n "$pp_macos_svc_plist_file" ]; then
echo "## Launchd plist file already defined at $pp_macos_svc_plist_file"
return
fi
echo "## Generating the launchd plist file for $svc"
pp_macos_svc_plist_file="$pp_wrkdir/$svc.plist"
cat <<-. > $pp_macos_svc_plist_file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>$svc_id</string>
<key>ProgramArguments</key>
<array>
.
while test $# != 0; do
printf " <string>$1</string>\n" >> $pp_macos_svc_plist_file
shift
done
cat <<-. >> $pp_macos_svc_plist_file
</array>
<key>KeepAlive</key>
<true/>
.
if test -n "$pp_macos_service_user"; then
printf " <key>UserName</key>\n" >> $pp_macos_svc_plist_file
printf " <string>$pp_macos_service_user</string>\n" >> $pp_macos_svc_plist_file
fi
if test -n "$pp_macos_service_group"; then
printf " <key>GroupName</key>\n" >> $pp_macos_svc_plist_file
printf " <string>$pp_macos_service_group</string>\n" >> $pp_macos_svc_plist_file
fi
if test -n "$pp_macos_service_initgroups"; then
printf " <key>InitGroups</key>\n" >> $pp_macos_svc_plist_file
printf " <string>$pp_macos_service_initgroups</string>\n" >> $pp_macos_svc_plist_file
fi
if test -n "$pp_macos_service_umask"; then
printf " <key>Umask</key>\n" >> $pp_macos_svc_plist_file
printf " <string>$pp_macos_service_umask</string>\n" >> $pp_macos_svc_plist_file
fi
if test -n "$pp_macos_service_cwd"; then
printf " <key>WorkingDirectory</key>\n" >> $pp_macos_svc_plist_file
printf " <string>$pp_macos_service_cwd</string>\n" >> $pp_macos_svc_plist_file
fi
if test -n "$pp_macos_service_nice"; then
printf " <key>Nice</key>\n" >> $pp_macos_svc_plist_file
printf " <string>$pp_macos_service_nice</string>\n" >> $pp_macos_svc_plist_file
fi
cat <<-. >> $pp_macos_svc_plist_file
</dict>
</plist>
.
}
pp_macos_add_service () {
typeset svc svc_id plist_file plist_dir
pp_load_service_vars "$1"
svc=${pp_macos_service_name:-$1}
svc_id=${pp_macos_service_id:-$pp_macos_default_service_id_prefix$svc}
#-- create a plist file for svc
pp_macos_launchd_plist "$svc" "$svc_id"
#-- copy the plist file into place and add to %files
plist_dir="/Library/LaunchDaemons"
plist_file="$plist_dir/$svc_id.plist"
mkdir -p "$pp_destdir/$plist_dir"
cp "$pp_macos_svc_plist_file" "$pp_destdir/$plist_file"
pp_add_file_if_missing "$plist_file"
#-- add code to start the service on install
${pp_macos_start_services_after_install} && <<-. >> $pp_wrkdir/%post.$svc
# start service '$svc' automatically after install
launchctl load "$plist_file"
.
}
pp_backend_macos_probe () {
@@ -7291,7 +7456,7 @@ pp_backend_macos_vas_platforms () {
echo "osx" # XXX non-really sure what they do.. it should be "macos"
}
pp_backend_macos_function () {
case $1 in
case "$1" in
_pp_macos_search_unused) cat<<'.';;
# Find an unused value in the given path
# args: path attribute minid [maxid]