update control to reflect move of primary repo to collab-maint
[debian/sudo] / pp
diff --git a/pp b/pp
index 3cf690cc451ed4c9b6f37d52c5c7b5b661ac1405..76b4d6e59e16443abc419a4b4694552b4736ede6 100755 (executable)
--- a/pp
+++ b/pp
@@ -1,6 +1,6 @@
 #!/bin/sh
 # Copyright 2012 Quest Software, Inc. ALL RIGHTS RESERVED
-pp_revision="341"
+pp_revision="355"
  # 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\n", $1, $2, $3, $4 }' | sed 's/[.]*$//g'`
     if test x"$v" != x"$1"; then
         pp_warn "stripped version '$1' to '$v'"
     fi
@@ -1761,7 +1761,7 @@ pp_aix_add_service () {
 
        set -- $cmd
        cmd_cmd="$1"; shift
-       cmd_arg="$*";
+       cmd_arg="${pp_aix_mkssys_cmd_args:-$*}";
 
        case "$stop_signal" in
                HUP) stop_signal=1;;
@@ -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)
@@ -5424,6 +5425,7 @@ pp_rpm_detect_distro () {
        pp_rpm_distro=`awk '
           /^Red Hat Enterprise Linux/ { print "rhel" $7; exit; }
           /^CentOS release/           { print "centos" $3; exit; }
+          /^CentOS Linux release/     { print "centos" $4; exit; }
           /^Red Hat Linux release/    { print "rh" $5; exit; }
        ' /etc/redhat-release`
     elif test -f /etc/SuSE-release; then
@@ -6416,7 +6418,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 +6529,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 +6675,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 +6732,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 +6742,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 +6877,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 +6943,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 +7072,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 +7093,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 +7116,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 +7242,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 +7258,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 +7340,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 +7457,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]