2 # Copyright 2012 Quest Software, Inc. ALL RIGHTS RESERVED
4 # Copyright 2012 Quest Software, Inc. ALL RIGHTS RESERVED.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
10 # 1. Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 # 3. Neither the name of Quest Software, Inc. nor the names of its
16 # contributors may be used to endorse or promote products derived from
17 # this software without specific prior written permission.
19 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
25 # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 # Please see <http://rc.quest.com/topics/polypkg/> for more information
33 pp_version="1.0.0.$pp_revision"
34 pp_copyright="Copyright 2012, Quest Software, Inc. ALL RIGHTS RESERVED."
37 pp_opt_destdir="$DESTDIR"
38 pp_opt_install_script=
41 pp_opt_no_package=false
42 pp_opt_only_front=false
46 pp_opt_save_unstripped=false
47 pp_opt_vas_platforms=false
48 pp_opt_wrkdir="`pwd`/pp.work.$$"
55 test -n "$PP_NO_CLEAN" && pp_opt_no_clean=true
56 test -n "$PP_DEBUG" && pp_opt_debug=true
57 test -n "$PP_VERBOSE" && pp_opt_verbose=true
60 pp_debug "main_cleanup"
62 if $pp_opt_no_clean || test x"$pp_platform" = x"unknown"; then
65 pp_backend_${pp_platform}_cleanup
66 $pp_errors && pp_die "Errors during cleanup"
67 if test -d "$pp_wrkdir"; then
68 if $pp_opt_debug; then
69 pp_debug "not removing $pp_wrkdir"
71 pp_verbose rm -rf "$pp_wrkdir"
79 while test $# -gt 0; do
81 # convert -[dilpv] to --long-options
83 --?*=?*) n=`echo "$1" | sed -ne 's/^--\([^=]*\)=.*/\1/p'`
84 a=`echo "$1" | sed -ne 's/^--[^=]*=\(.*\)/\1/p'`
86 set -- "--$n" "$a" "$@";;
89 -d) shift; set -- "--debug" "$@";;
90 -d*) a=`echo "$1" | sed -ne 's/^-.//'`
91 shift; set -- "--debug" "$@";;
93 -i) shift; set -- "--install-script" "$@";;
94 -i*) a=`echo "$1" | sed -ne 's/^-.//'`
95 shift; set -- "--install-script" "$a" "$@";;
97 -l) shift; set -- "--list" "$@";;
98 -l*) a=`echo "$1" | sed -ne 's/^-.//'`
99 shift; set -- "--list" "$@";;
101 -p) shift; set -- "--platform" "$@";;
102 -p*) a=`echo "$1" | sed -ne 's/^-.//'`
103 shift; set -- "--platform" "$a" "$@";;
105 -v) shift; set -- "--verbose" "$@";;
106 -v*) a=`echo "$1" | sed -ne 's/^-.//'`
107 shift; set -- "--verbose" "$@";;
109 -\?) shift; set -- "--help" "$@";;
110 -\?*) a=`echo "$1" | sed -ne 's/^-.//'`
111 shift; set -- "--help" "$@";;
115 --destdir|--eval|--install-script|--platform|--wrkdir)
116 test $# -ge 2 || pp_error "missing argument to $1";;
121 --debug) pp_opt_debug=true; shift;;
122 --destdir) pp_opt_destdir="$2"; shift;shift;;
123 --eval) pp_opt_eval="$2"; shift;shift;; # undoc
124 --install-script) pp_opt_install_script="$2"; shift;shift;;
125 --list) pp_opt_list=true; shift;;
126 --no-clean) pp_opt_no_clean=true; shift;;
127 --no-package) pp_opt_no_package=true; shift;;
128 --only-front) pp_opt_only_front=true; shift;;
129 --platform) pp_opt_platform="$2"; shift;shift;;
130 --probe) pp_opt_probe=true; shift;;
131 --strip) pp_opt_strip=true; shift;;
132 --save-unstripped) pp_opt_save_unstripped=true; shift;;
133 --wrkdir) pp_opt_wrkdir="$2"; shift;shift;;
134 --vas-platforms) pp_opt_vas_platforms=true; shift;;
135 --verbose) pp_opt_verbose=true; shift;;
136 --version) pp_opt_version=true; shift;;
137 --help) pp_errors=true; shift;;
139 -*) pp_error "unknown option $1"; shift;;
146 if test $# -gt 0; then
151 #-- extra arguments of the form Foo=bar alter *global* vars
152 while test $# -gt 0; do
154 -*) pp_error "unexpected option '$1'"
158 _val=`echo "$_val"|sed -e 's/[$"\\]/\\&/g'`
159 pp_debug "setting $_var = \"$_val\""
160 pp_opt_init_vars="$pp_opt_init_vars$_var=\"$_val\";"
162 *) pp_error "unexpected argument $1'"
168 pp_error "unknown argument $1"
172 polypkg $pp_version $pp_copyright
173 usage: $0 [options] [input.pp] [var=value ...]
174 -d --debug -- write copious info to stderr
175 --destdir=path -- file root, defaults to \$DESTDIR
176 -? --help -- display this information
177 -i --install-script=path -- create an install helper script
178 -l --list -- write package filenames to stdout
179 --no-clean -- don't remove temporary files
180 --no-package -- do everything but create packages
181 --only-front -- only perform front-end actions
182 -p --platform=platform -- defaults to local platform
183 --probe -- print local system identifier, then exit
184 --strip -- strip debug symbols from binaries before
185 packaging (modifies files in destdir)
186 --save-unstripped -- save unstripped binaries to
187 \$name-\$version-unstripped.tar.gz
188 --wrkdir=path -- defaults to subdirectory of \$TMPDIR or /tmp
189 -v --verbose -- write info to stderr
190 --version -- display version and quit
197 # initialise the front and back ends
200 $pp_opt_only_front || pp_backend_init
202 # run the front-end to generate the intermediate files
203 # set $pp_input_dir to be the 'include dir' if needed
204 pp_debug "calling frontend on $pp_opt_input"
205 case "$pp_opt_input" in
208 pp_warn "reading directives from standard input"
211 */*) pp_input_dir=${pp_opt_input%/*}
212 pp_frontend <"$pp_opt_input"
215 pp_frontend <"$pp_opt_input"
219 pp_files_ignore_others
220 pp_service_scan_groups
222 # some sanity checks after front-end processing
223 if test x"$pp_platform" != x"null"; then
224 pp_debug "sanity checks"
225 test -n "$pp_components" || pp_error "No components?"
226 pp_check_var_is_defined "name"
227 pp_check_var_is_defined "version"
228 pp_files_check_duplicates
229 pp_files_check_coverage
230 pp_die_if_errors "Errors during sanity checks"
233 # stop now if we're only running the front
234 $pp_opt_only_front && return
236 if test x"$pp_opt_strip" = x"true"; then
240 # run the back-end to generate the package
241 pp_debug "calling backend"
243 pp_die_if_errors "Errors during backend processing"
245 # copy the resulting package files to PP_PKGDESTDIR or .
246 for f in `pp_backend_names` -; do
247 test x"$f" = x"-" && continue
248 pp_debug "copying: $f to `pwd`"
249 if pp_verbose cp -r $pp_wrkdir/$f ${PP_PKGDESTDIR:-.}; then
250 echo "${PP_PKGDESTDIR:+$PP_PKGDESTDIR/}$f"
252 pp_error "$f: missing package"
255 pp_die_if_errors "Errors during package copying"
258 pp_install_script () {
259 pp_debug "writing install script to $pp_opt_install_script"
260 rm -f $pp_opt_install_script
261 pp_backend_install_script > $pp_opt_install_script
262 pp_die_if_errors "Errors during package install script"
263 chmod +x $pp_opt_install_script
267 # If PP_DEV_PATH is set, then jump to that script.
268 # (Useful when working on polypkg source that isn't installed)
269 if test -n "$PP_DEV_PATH" -a x"$PP_DEV_PATH" != x"$0"; then
270 pp_warn "switching from $0 to $PP_DEV_PATH ..."
271 exec "$PP_DEV_PATH" "$@" || exit 1
274 pp_set_expand_converter_or_reexec "$@"
277 if $pp_opt_version; then
278 #-- print version and exit
279 echo "polypkg $pp_version"
285 trap 'pp_main_cleanup' 0
287 pp_wrkdir="$pp_opt_wrkdir"
288 pp_debug "pp_wrkdir = $pp_wrkdir"
290 mkdir -p "$pp_wrkdir"
292 pp_destdir="$pp_opt_destdir"
293 pp_debug "pp_destdir = $pp_destdir"
295 if $pp_opt_probe; then
298 elif $pp_opt_vas_platforms; then
300 pp_backend_vas_platforms
301 elif test -n "$pp_opt_eval"; then
302 #-- execute a shell command
303 eval "$pp_opt_eval" || exit
306 if test -n "$pp_opt_install_script"; then
317 if test -n "$TERM" -a -t 1 && (tput op) >/dev/null 2>/dev/null; then
318 pp_col_redfg=`tput setf 4` 2>/dev/null
319 pp_col_bluefg=`tput setf 1` 2>/dev/null
320 pp_col_reset=`tput op` 2>/dev/null
328 if test x"" = x"$pp_lineno"; then
331 echo "$1 line $pp_lineno: $2" >&2
336 pp__warn "pp: ${pp_col_redfg}warning${pp_col_reset}" "$*"
340 pp__warn "pp: ${pp_col_redfg}error${pp_col_reset}" "$*"
349 pp_die_if_errors () {
350 $pp_errors && pp_die "$@"
354 $pp_opt_debug && echo "${pp_col_bluefg}debug${pp_col_reset} $*" >&2
358 $pp_opt_verbose && echo "pp: ${pp_col_bluefg}info${pp_col_reset} $*" >&2
363 sed -e 's,%(\([^)]*\)),
\16\15`\1`
\16,g' \
364 -e 's,%{\([^}]*\)},
\16\15${\1}
\16,g' \
367 sed -e '/^[^
\15]/s/["$`\\]/\\&/g' \
371 -e 's,
\17,"
\16echo ",g' |
378 eval "$1=\`expr \$$1 + 1\`"
382 eval "$1=\`expr \$$1 - 1\`"
385 pp_check_var_is_defined () {
386 if eval test -z "\"\$$1\""; then
387 pp_error "\$$1: not set"
404 pp_contains "$_l" "$_w" || return 1
414 pp_contains "$_l" "$_w" && return 0
420 if eval test -z \"\$$1\"; then
422 elif eval pp_contains '"$'$1'"' '"$2"'; then
430 typeset result element
434 pp_add_to_list result $element
439 pp_mode_strip_altaccess () {
442 echo `echo "$1" | cut -b -10`;;
449 typeset umode gmode omode smode
451 set -- `pp_mode_strip_altaccess "$1"`
454 ?--[-X]??????) umode=0;;
455 ?--[xs]??????) umode=1;;
456 ?-w[-X]??????) umode=2;;
457 ?-w[xs]??????) umode=3;;
458 ?r-[-X]??????) umode=4;;
459 ?r-[xs]??????) umode=5;;
460 ?rw[-X]??????) umode=6;;
461 ?rw[xs]??????) umode=7;;
462 *) pp_error "bad user mode $1";;
466 ????--[-S]???) gmode=0;;
467 ????--[xs]???) gmode=1;;
468 ????-w[-S]???) gmode=2;;
469 ????-w[xs]???) gmode=3;;
470 ????r-[-X]???) gmode=4;;
471 ????r-[xs]???) gmode=5;;
472 ????rw[-X]???) gmode=6;;
473 ????rw[xs]???) gmode=7;;
474 *) pp_error "bad group mode $1";;
478 ???????--[-T]) omode=0;;
479 ???????--[xt]) omode=1;;
480 ???????-w[-T]) omode=2;;
481 ???????-w[xt]) omode=3;;
482 ???????r-[-T]) omode=4;;
483 ???????r-[xt]) omode=5;;
484 ???????rw[-T]) omode=6;;
485 ???????rw[xt]) omode=7;;
486 *) pp_error "bad other mode $1";;
490 ???[-x]??[-x]??[-x]) smode=;;
491 ???[-x]??[-x]??[tT]) smode=1;;
492 ???[-x]??[Ss]??[-x]) smode=2;;
493 ???[-x]??[Ss]??[tT]) smode=3;;
494 ???[Ss]??[-x]??[-x]) smode=4;;
495 ???[Ss]??[-x]??[tT]) smode=5;;
496 ???[Ss]??[Ss]??[-x]) smode=6;;
497 ???[Ss]??[Ss]??[tT]) smode=7;;
498 *) pp_error "bad set-id mode $1";;
501 echo "$smode$umode$gmode$omode"
505 pp_debug "find: ${1#$pp_destdir}/"
506 for f in "$1"/.* "$1"/*; do
507 case "$f" in */.|*/..) continue;; esac # should never happen!
508 if test -d "$f" -o -f "$f" -o -h "$f"; then
509 if test -d "$f" -a ! -h "$f"; then
510 echo "${f#$pp_destdir}/"
513 echo "${f#$pp_destdir}"
520 #test -t && pp_warn "pp_prepend: stdin is a tty?"
522 pp_debug "prepending to $1"
524 cat - $1._prepend >$1
527 pp_debug "prepend: creating $1"
532 pp_note_file_used() {
533 echo "$1" >> $pp_wrkdir/all.files
536 pp_create_dir_if_missing () {
538 */) pp_error "pp_create_dir_if_missing: trailing / forbidden";;
540 *) if test ! -d "$pp_destdir$1"; then
541 pp_debug "fabricating directory $1/"
542 pp_create_dir_if_missing "${1%/*}"
543 mkdir "$pp_destdir$1" &&
544 pp_note_file_used "$1/"
545 pp_remove_later "$1" &&
546 chmod ${2:-755} "$pp_destdir$1"
551 pp_add_file_if_missing () {
553 #-- check that the file isn't already declared in the component
554 if test -s $pp_wrkdir/%files.${2:-run}; then
555 awk "\$6 == \"$1\" {exit 1}" < $pp_wrkdir/%files.${2:-run} || return 1
558 pp_create_dir_if_missing "${1%/*}"
559 pp_debug "fabricating file $1"
560 echo "f ${3:-755} - - ${4:--} $1" >> $pp_wrkdir/%files.${2:-run}
561 pp_note_file_used "$1"
566 pp_add_transient_file () {
567 test -f "$pp_destdir$1" && pp_die "$pp_destdir$1: exists"
568 pp_create_dir_if_missing "${1%/*}"
569 pp_debug "transient file $1"
570 pp_note_file_used "$1"
577 test -s $pp_wrkdir/pp_cleanup && cat $pp_wrkdir/pp_cleanup
578 } > $pp_wrkdir/pp_cleanup.new
579 mv $pp_wrkdir/pp_cleanup.new $pp_wrkdir/pp_cleanup
583 if test -h "$1"; then
584 ls -1ld "$1" | sed -ne 's,.* -> ,,p'
586 echo "$1: not a symbolic link" >&2
591 pp_remove_later_now () {
593 if test -s $pp_wrkdir/pp_cleanup; then
594 pp_debug "pp_remove_later_now"
596 pp_debug "removing $pp_destdir$f"
597 if test -d $pp_destdir$f; then
602 done < $pp_wrkdir/pp_cleanup
603 rm $pp_wrkdir/pp_cleanup
609 pp_debug "&& pp_readlink_fn=$pp_readlink_fn"
611 if test -n "$pp_readlink_fn"; then
612 pp_debug "&& calling $pp_readlink_fn $*"
613 "$pp_readlink_fn" "$@"
620 pp_install_script_common () {
623 # Automatically generated for
624 # $name $version ($pp_platform)
625 # by PolyPackage $pp_version
630 echo "usage: \$0 list-services" ;;
632 echo "usage: \$0 list-components" ;;
634 echo "usage: \$0 list-files {cpt...|all}" ;;
636 echo "usage: \$0 install {cpt...|all}" ;;
638 echo "usage: \$0 uninstall {cpt...|all}" ;;
640 echo "usage: \$0 start {svc...}" ;;
642 echo "usage: \$0 stop {svc...}" ;;
644 echo "usage: \$0 print-platform" ;;
646 echo "usage: \$0 [-q] command [args]"
647 echo " list-services"
648 echo " list-components"
649 echo " list-files {cpt...|all}"
650 echo " install {cpt...|all}"
651 echo " uninstall {cpt...|all}"
652 echo " start {svc...}"
653 echo " stop {svc...}"
654 echo " print-platform"
660 if test x"\$1" = x"-q"; then
662 verbose () { "\$@"; }
663 verbosemsg () { : ; }
665 verbose () { echo "+ \$*"; "\$@"; }
666 verbosemsg () { echo "\$*"; }
673 typeset func deps allfuncs
675 while test $# -gt 0; do
676 pp_add_to_list allfuncs "$1"
677 deps=`pp_backend_function "$1:depends"`
679 set -- `pp_unique "$@" $deps`
682 for func in $allfuncs
684 pp_debug "generating function code for '$1'"
688 pp_mkgroup|pp_mkuser|pp_havelib) echo <<.;;
689 if test \$# -lt 1; then
690 echo "$func: not enough arguments" >&2
695 pp_backend_function "$func" || cat <<.
696 echo "$func: not implemented" >&2
708 #-- convert all non alpha/digits to underscores
709 echo "$*" | tr -c '[a-z][A-Z][0-9]\012' '[_*]'
713 awk -F: '$3 == uid { if (!found) print $1; found=1; } END { if (!found) exit 1; }' uid="$1" \
714 < /etc/passwd || pp_error "no local username for uid $1"
718 awk -F: '$3 == gid { if (!found) print $1; found=1; } END { if (!found) exit 1; }' gid="$1" \
719 < /etc/group || pp_error "no local group for gid $1"
722 pp_backend_function_getopt () {
725 _pp_optstring="$1"; shift; eval `_pp_getopt "$_pp_optstring"`
727 _pp_getopt_meta=s,[\\\\\"\'\`\$\&\;\(\)\{\}\#\%\ \ ],\\\\\&,g
729 sed "$_pp_getopt_meta" <<. | tr '\012' ' '
734 sed "s,^..,,$pp_getopt_meta" <<. | tr '\012' ' '
744 _pp_nonl '_pp_nonl set --; while test $# -gt 0; do case "$1" in "--") shift; break;;'
745 sed 's/\([^: ]:*\)/<@<\1>@>/g;
746 s/<@<\(.\):>@>/"-\1") _pp_nonl -"\1"; _pp_protect "$2"; shift; shift;; "-\1"*) _pp_nonl -"\1"; _pp_protect2 "$1"; shift;;/g;s/<@<\(.\)>@>/ "-\1") _pp_nonl -"\1"; shift;; "-\1"*) _pp_nonl -"\1"; _pp_tmp="$1"; shift; set -- -`_pp_protect2 "$_pp_tmp"` "$@";;/g' <<.
749 _pp_nonl '-*) echo "$1: unknown option">&2; return 1;; *) break;; esac; done; _pp_nonl --; while test $# -gt 0; do _pp_nonl "$1"; shift; done; echo'
755 pp_copy_unstripped () {
756 typeset filedir realdir
757 filedir="`dirname ${1#$pp_destdir}`"
758 realdir="$pp_wrkdir/unstripped/$filedir"
761 # Can't use hardlinks because `strip` modifies the original file in-place
765 pp_package_stripped_binaries () {
766 (cd "$pp_wrkdir/unstripped" && tar -c .) \
767 | gzip > "$name-dbg-$version.tar.gz"
768 rm -rf "$pp_wrkdir/unstripped"
771 pp_strip_binaries () {
772 if test x"$pp_opt_save_unstripped" = x"true"; then
773 rm -rf "$pp_wrkdir/unstripped"
774 mkdir "$pp_wrkdir/unstripped"
777 for f in `find "$pp_destdir" -type f`; do
778 if file "$f" | awk '{print $2}' | grep ^ELF >/dev/null 2>&1; then
779 if test x"$pp_opt_save_unstripped" = x"true"; then
780 if file "$f" | LC_MESSAGES=C grep 'not stripped' >/dev/null 2>&1; then
781 pp_debug "Saving unstripped binary $f"
782 pp_copy_unstripped "$f"
784 pp_debug "$f is already stripped; not saving a copy"
787 pp_debug "Stripping unnecessary symbols from $f"
792 if test x"$pp_opt_save_unstripped" = x"true"; then
793 pp_package_stripped_binaries
800 pp_frontend_init () {
804 description="No description"
805 copyright="Copyright 2012 Quest Software, Inc. ALL RIGHTS RESERVED."
807 #-- if the user supplied extra arguments on the command line
808 # then load them now.
809 pp_debug "pp_opt_init_vars=$pp_opt_init_vars"
810 test -n "$pp_opt_init_vars" && eval "$pp_opt_init_vars"
820 pp_debug "is_qualifier: $* -> $ret"
824 pp_eval_qualifier () {
829 "[!"*",$pp_platform]"| \
830 "[!$pp_platform,"*"]"| \
831 "[!"*",$pp_platform,"*"]") ret=false;;
834 "["*",$pp_platform]"| \
835 "[$pp_platform,"*"]"| \
836 "["*",$pp_platform,"*"]") ret=true;;
838 *) pp_die "pp_eval_qualifier: bad qualifier '$1'"
840 pp_debug "eval: $* -> $ret"
849 %if) if test 0 = $pp_if_false; then
851 true |1) pp_incr pp_if_true;;
852 false|0) pp_incr pp_if_false;;
855 if pp_is_qualifier "$*"; then
856 pp_eval_qualifier "$*" || ifret=false
858 eval test "$@" || ifret=false
859 pp_debug "evaluating test $* -> $ifret"
867 %else) test $# = 0 || pp_warn "ignoring argument to %else"
868 if test $pp_if_false -gt 1; then
870 elif test $pp_if_false = 1; then
873 elif test $pp_if_true = 0; then
874 pp_die "unmatched %else"
879 %endif) test $# = 0 || pp_warn "ignoring argument to %endif"
880 if test $pp_if_false -gt 0; then
882 elif test $pp_if_true -gt 0; then
885 pp_die "unmatched %endif"
887 *) pp_die "frontend_if: unknown cmd $ifcmd";;
893 typeset section newsection sed_word sed_ws line cpt svc
894 typeset section_enabled newsection_enabled s sed sed_candidate
897 newsection='%_initial'
900 sed_word="[a-zA-Z_][a-zA-Z_0-9]*"
903 #-- not all seds are created equal
905 for sed_candidate in ${PP_SED:-sed} /usr/xpg4/bin/sed; do
906 if echo 'foo' | $sed_candidate -ne '/^\(x\)*foo/p' | grep foo > /dev/null
913 pp_die "sed is broken on this system"
917 #-- Note: this sed script should perform similar to pp_eval_qualifier()
918 $sed -e "/^#/s/.*//" \
919 -e "/^\\[!\\($sed_word,\\)*$pp_platform\\(,$sed_word\\)*\\]/s/.*//" \
920 -e "s/^\\[\\($sed_word,\\)*$pp_platform\\(,$sed_word\\)*\\]$sed_ws*//" \
921 -e "s/^\\[!\\($sed_word,\\)*$sed_word\\]$sed_ws*//" \
922 -e "/^\\[\\($sed_word,\\)*$sed_word\\]/s/.*//" \
923 -e "s/^%$sed_ws*/%/" \
924 -e "s/^$sed_ws/%\\\\&/" \
925 > $pp_wrkdir/frontend.tmp
927 #-- add an ignore section at the end to force section completion
928 echo '%ignore' >> $pp_wrkdir/frontend.tmp
929 echo >> $pp_wrkdir/frontend.tmp
931 exec 0<$pp_wrkdir/frontend.tmp
933 : > $pp_wrkdir/%fixup
934 while read -r line; do
935 #-- Convert leading double-% to single-%, or switch sections
938 pp_debug "line $pp_lineno: $line"
942 #pp_debug "line $pp_lineno: $*"
947 pp_debug "processing if directive $1"
951 test 0 -ne $pp_if_false && continue # ignore lines %if'd out
955 pp_debug "processing new section $1"
956 newsection="$1"; shift
958 if pp_is_qualifier "$1"; then
959 pp_eval_qualifier "$1" || newsection_enabled=false
962 test $# -eq 0 || pp_warn "ignoring extra arguments: $line"
964 %pre|%post|%preun|%postup|%postun|%files|%depend|%check|%conflict)
965 pp_debug "processing new component section $*"
967 if test $# -eq 0 || pp_is_qualifier "$1"; then
975 if test $# -gt 0 && pp_is_qualifier "$1"; then
976 pp_eval_qualifier "$1" || newsection_enabled=false
980 pp_warn "ignoring extra arguments: $line"
983 $newsection_enabled && pp_add_component "$cpt";;
984 x-*) :;; # useful for discarding stuff
985 *) pp_error "unknown component: $1 $cpt";;
989 newsection="%ignore"; shift
990 if test $# -gt 0; then
991 pp_set_api_version "$1"
994 pp_error "%pp: missing version"
997 pp_error "%pp: too many arguments"
1000 pp_debug "processing new service section $1 $2"
1002 if test $# -eq 0 || pp_is_qualifier "$1"; then
1003 pp_error "$s: service name required"
1009 newsection="$s.$svc"
1010 newsection_enabled=:
1011 if test $# -gt 0 && pp_is_qualifier "$1"; then
1012 pp_eval_qualifier "$1" || newsection_enabled=false
1016 pp_warn "ignoring extra arguments: $line"
1017 $newsection_enabled && pp_add_service "$svc"
1020 pp_debug "removing leading %\\"
1022 pp_debug " result is <$line>"
1028 pp_debug "removing leading %"
1035 pp_error "unknown section $1"
1036 newsection='%ignore'
1037 newsection_enabled=:
1042 test 0 != $pp_if_false && continue # ignore lines %if'd out
1044 pp_debug "section=$section (enabled=$section_enabled) newsection=$newsection (enabled=$newsection_enabled)"
1046 #-- finish processing a previous section
1047 if test x"$newsection" != x""; then
1048 $section_enabled && case "$section" in
1050 pp_debug "leaving ignored section $section"
1051 : ignore # guaranteed to be the last section
1054 pp_debug "leaving $section: sourcing $pp_wrkdir/tmp"
1055 $pp_opt_debug && cat $pp_wrkdir/tmp >&2
1059 %pre.*|%preun.*|%post.*|%postup.*|%postun.*|%depend.*|%check.*|%conflict.*|%service.*|%fixup)
1060 pp_debug "leaving $section: substituting $pp_wrkdir/tmp"
1061 # cat $pp_wrkdir/tmp >&2 # debugging
1062 $pp_opt_debug && pp_substitute < $pp_wrkdir/tmp >&2
1063 pp_substitute < $pp_wrkdir/tmp > $pp_wrkdir/tmp.sh
1064 . $pp_wrkdir/tmp.sh >> $pp_wrkdir/$section ||
1065 pp_error "shell error in $section"
1066 rm -f $pp_wrkdir/tmp.sh
1070 section="$newsection"
1071 section_enabled="$newsection_enabled"
1075 #-- ignore section content that is disabled
1076 $section_enabled || continue
1078 #-- process some lines in-place
1081 case "$line" in "") continue;; esac # ignore non-section blanks
1082 pp_die "Ignoring text before % section introducer";;
1083 %set|%pre.*|%preun.*|%post.*|%postup.*|%postun.*|%check.*|%service.*|%fixup)
1084 pp_debug "appending line to \$pp_wrkdir/tmp"
1085 echo "$line" >> $pp_wrkdir/tmp
1088 test $# -eq 0 && continue;
1089 pp_files_expand "$@" >> $pp_wrkdir/$section
1092 pp_debug "Adding explicit dependency $@ to $cpt"
1093 echo "$@" >> $pp_wrkdir/%depend.$cpt
1096 pp_debug "Adding explicit conflict $@ to $cpt"
1097 echo "$@" >> $pp_wrkdir/%conflict.$cpt
1103 if test $pp_if_true != 0 -o $pp_if_false != 0; then
1104 pp_die "missing %endif at end of file"
1109 pp_debug " name = $name"
1110 pp_debug " version = $version"
1111 pp_debug " summary = $summary"
1112 pp_debug " description = $description"
1113 pp_debug " copyright = $copyright"
1115 pp_debug "\$pp_components: $pp_components"
1116 pp_debug "\$pp_services: $pp_services"
1119 pp_set_api_version() {
1122 *) pp_error "This version of polypackage is too old";;
1128 pp_set_platform () {
1129 if test -n "$pp_opt_platform"; then
1130 pp_contains "$pp_platforms" "$pp_opt_platform" ||
1131 pp_die "$pp_opt_platform: unknown platform"
1132 pp_platform="$pp_opt_platform"
1134 uname_s=`uname -s 2>/dev/null`
1136 for p in $pp_platforms; do
1137 pp_debug "probing for platform $p"
1138 if eval pp_backend_${p}_detect "$uname_s"; then
1143 test -z "$pp_platform" &&
1144 pp_die "cannot detect platform (supported: $pp_platforms)"
1146 pp_debug "pp_platform = $pp_platform"
1151 pp_expand_test_usr_bin () {
1152 awk '$1 == "/usr" || $2 == "/usr" {usr++}
1153 $1 == "/bin" || $2 == "/bin" {bin++}
1154 END { if (usr == 1 && bin == 1) exit(0); else exit(1); }'
1157 pp_set_expand_converter_or_reexec () {
1158 test -d /usr -a -d /bin ||
1159 pp_die "missing /usr or /bin"
1160 echo /usr /bin | pp_expand_test_usr_bin || pp_die "pp_expand_test_usr_bin?"
1161 if (eval "echo /{usr,bin}" | pp_expand_test_usr_bin) 2>/dev/null; then
1162 pp_expand_path=pp_expand_path_brace
1163 elif (eval "echo /@(usr|bin)" | pp_expand_test_usr_bin) 2>/dev/null; then
1164 pp_expand_path=pp_expand_path_at
1166 test x"$pp_expand_rexec" != x"true" ||
1167 pp_die "problem finding shell that can do brace expansion"
1168 for shell in ksh ksh93 bash; do
1169 if ($shell -c 'echo /{usr,bin}' |
1170 pp_expand_test_usr_bin) 2>/dev/null ||
1171 ($shell -c 'echo /@(usr|bin)' |
1172 pp_expand_test_usr_bin) 2>/dev/null
1174 pp_debug "switching to shell $shell"
1175 pp_expand_rexec=true exec $shell "$0" "$@"
1178 pp_die "cannot find a shell that does brace expansion"
1182 pp_expand_path_brace () {
1184 eval "for f in $1; do echo \"\$f\"; done|sort -u"
1187 pp_expand_path_at () {
1190 echo "$1" | sed -e 's/{/@(/g' -e 's/}/)/g' -e 's/,/|/g'
1191 `; do echo \"\$f\"; done|sort -u"
1194 pp_shlib_suffix='.so*'
1197 #@ $pp_components: whitespace-delimited list of components seen in %files
1199 #@ $pp_services: whitespace-delimited list of %service seen
1202 rm -f $pp_wrkdir/%files.* \
1203 $pp_wrkdir/%post.* \
1205 $pp_wrkdir/%preun.* \
1206 $pp_wrkdir/%postup.* \
1207 $pp_wrkdir/%postun.* \
1208 $pp_wrkdir/%service.* \
1214 pp_have_component () {
1215 pp_contains "$pp_components" "$1"
1218 pp_have_all_components () {
1219 pp_contains_all "$pp_components" "$@"
1222 pp_add_component () {
1223 pp_add_to_list 'pp_components' "$1"
1227 pp_add_to_list 'pp_services' "$1"
1230 pp_service_init_vars () {
1233 stop_signal=15 # SIGTERM
1236 enable=yes # make it so the service starts on boot
1237 optional=no # Whether installing this service is optional
1238 pp_backend_init_svc_vars
1241 pp_service_check_vars () {
1243 pp_error "%service $1: cmd not defined"
1246 *) pp_error "%service $1: \$enable must be set to yes or no";;
1250 pp_load_service_vars () {
1251 pp_service_init_vars
1252 . "$pp_wrkdir/%service.$1"
1253 pp_service_check_vars "$1"
1256 pp_files_expand () {
1257 typeset _p _mode _group _owner _flags _path _optional _has_target _tree
1258 typeset _path _file _tgt _m _o _g _f _type _lm _ll _lo _lg _ls _lx
1261 test $# -eq 0 && return
1263 pp_debug "pp_files_expand: path is: $1"
1265 case "$1" in "#"*) return;; esac
1268 pp_debug "pp_files_expand: other arguments: $*"
1270 #-- the mode must be an octal number of at least three digits
1272 _a=`eval echo \"$1\"`
1275 -|=|[01234567][01234567][01234567]*) _mode="$_a"; shift;;
1278 #-- the owner:group field may have optional parts
1279 _a=`eval echo \"$1\"`
1281 *:*) _group=${_a#*:}; _owner=${_a%:*}; shift;;
1282 =|-) _group=$_a; _owner=$_a; shift;;
1283 *) _group=; _owner=;;
1286 #-- process the flags argument
1291 if test $# -gt 0; then
1292 _a=`eval echo \"$1\"`
1293 case ",$_a," in *,volatile,*) _flags="${_flags}v";; esac
1294 case ",$_a," in *,optional,*) _optional=true;; esac
1295 case ",$_a," in *,symlink,*) _has_target=true;; esac
1296 case ",$_a," in *,ignore-others,*) _flags="${_flags}i";; esac
1297 case ",$_a," in *,ignore,*) _ignore=true;; esac
1301 #-- process the target argument
1302 if $_has_target; then
1303 test $# -ne 0 || pp_error "$_p: missing target"
1304 _a=`eval echo \"$1\"`
1309 pp_debug "pp_files_expand: $_mode|$_owner:$_group|$_flags|$_target|$*"
1311 test $# -eq 0 || pp_error "$_p: too many arguments"
1313 #-- process speciall suffixes
1316 *"/**") _p="${_p%"/**"}"; tree="**";;
1317 *".%so") _p="${_p%".%so"}$pp_shlib_suffix";;
1320 #-- expand the path using the shell glob
1321 pp_debug "expanding .$_p ... with $pp_expand_path"
1322 (cd ${pp_destdir} && $pp_expand_path ".$_p") > $pp_wrkdir/tmp.files.exp
1324 #-- expand path/** by rewriting the glob output file
1328 pp_debug "expanding /** tree ..."
1329 while read _path; do
1331 pp_find_recurse "$pp_destdir${_path%/}"
1332 done < $pp_wrkdir/tmp.files.exp |
1333 sort -u > $pp_wrkdir/tmp.files.exp2
1334 mv $pp_wrkdir/tmp.files.exp2 $pp_wrkdir/tmp.files.exp
1338 while read _path; do
1340 _file="${pp_destdir}${_path}"
1349 *) pp_warn "$_path: inserting leading /"
1350 _path="/$_path";; # ensure leading /
1355 */../*|*/..) pp_error "$_path: invalid .. in path";;
1356 */./*|*/.) pp_warn "$_path: invalid component . in path";;
1357 *//*) pp_warn "$_path: redundant / in path";;
1360 #-- set the type based on the real file's type
1362 _type=f _m=_ _o=_ _g=_
1363 elif test -h "$_file"; then
1365 */) pp_warn "$_path (symlink $_file): removing trailing /"
1370 if test x"$_target" != x"=" -a -n "$_target"; then
1372 pp_debug "symlink target is $_tgt"
1374 _tgt=`pp_readlink "$_file"`;
1375 test -z "$_tgt" && pp_error "can't readlink $_file"
1378 pp_warn "stripped \$destdir from symlink ($_path)"
1379 _tgt="${_tgt#$pp_destdir}";;
1383 elif test -d "$_file"; then
1384 #-- display a warning if the user forgot the trailing /
1387 *) pp_warn "$_path (matching $_file): adding trailing /"
1391 $_has_target && pp_error "$_file: not a symlink"
1392 elif test -f "$_file"; then
1394 */) pp_warn "$_path (matching $_file): removing trailing /"
1399 $_has_target && pp_error "$_file: not a symlink"
1401 $_optional && continue
1402 pp_error "$_file: missing"
1406 #-- convert '=' shortcuts into mode/owner/group from ls
1407 case ":$_m:$_o:$_g:" in *:=:*)
1408 if LS_OPTIONS=--color=never /bin/ls -ld "$_file" \
1411 read _lm _ll _lo _lg _ls _lx < $pp_wrkdir/ls.tmp
1412 test x"$_m" = x"=" && _m=`pp_mode_from_ls "$_lm"`
1413 test x"$_o" = x"=" && _o="$_lo"
1414 test x"$_g" = x"=" && _g="$_lg"
1416 pp_error "cannot read $_file"
1417 test x"$_m" = x"=" && _m=-
1418 test x"$_o" = x"=" && _o=-
1419 test x"$_g" = x"=" && _g=-
1424 test -n "$_f" || _f=-
1427 test -n "$_type" || pp_die "_type empty"
1428 test -n "$_path" || pp_die "_path empty"
1429 test -n "$_m" || pp_die "_m empty"
1430 test -n "$_o" || pp_die "_o empty"
1431 test -n "$_g" || pp_die "_g empty"
1433 #-- setuid/gid files must be given an explicit owner/group (or =)
1434 case "$_o:$_g:$_m" in
1435 -:*:[4657][1357]??|-:*:[4657]?[1357]?|-:*:[4657]??[1357])
1436 pp_error "$_path: setuid file ($_m) missing explicit owner";;
1437 *:-:[2367][1357]??|*:-:[2367]?[1357]?|*:-:[2367]??[1357])
1438 pp_error "$_path: setgid file ($_m) missing explicit group";;
1441 # convert numeric uids into usernames; only works for /etc/passwd
1442 case "$_o" in [0-9]*) _o=`pp_getpwuid $_o`;; esac
1443 case "$_g" in [0-9]*) _g=`pp_getgrgid $_g`;; esac
1445 pp_debug "$_type $_m $_o $_g $_f $_path" $_tgt
1446 $_ignore || echo "$_type $_m $_o $_g $_f $_path" $_tgt
1447 pp_note_file_used "$_path"
1448 case "$_f" in *i*) echo "$_path" >> $pp_wrkdir/ign.files;; esac
1449 done < $pp_wrkdir/tmp.files.exp
1452 pp_files_check_duplicates () {
1454 if test -s $pp_wrkdir/all.files; then
1455 sort < $pp_wrkdir/all.files | uniq -d > $pp_wrkdir/duplicate.files
1456 if test -f $pp_wrkdir/ign.awk; then
1457 # Remove ignored files
1458 mv $pp_wrkdir/duplicate.files $pp_wrkdir/duplicate.files.ign
1459 sed -e 's/^/_ _ _ _ _ /' < $pp_wrkdir/duplicate.files.ign |
1460 awk -f $pp_wrkdir/ign.awk |
1461 sed -e 's/^_ _ _ _ _ //' > $pp_wrkdir/duplicate.files
1463 while read _path; do
1464 pp_warn "$_path: file declared more than once"
1465 done <$pp_wrkdir/duplicate.files
1469 pp_files_check_coverage () {
1470 pp_find_recurse "$pp_destdir" | sort > $pp_wrkdir/coverage.avail
1471 if test -s $pp_wrkdir/all.files; then
1472 sort -u < $pp_wrkdir/all.files
1475 fi > $pp_wrkdir/coverage.used
1476 join -v1 $pp_wrkdir/coverage.avail $pp_wrkdir/coverage.used \
1477 > $pp_wrkdir/coverage.not-packaged
1478 if test -s $pp_wrkdir/coverage.not-packaged; then
1479 pp_warn "The following files/directories were found but not packaged:"
1480 sed -e 's,^, ,' < $pp_wrkdir/coverage.not-packaged >&2
1482 join -v2 $pp_wrkdir/coverage.avail $pp_wrkdir/coverage.used \
1483 > $pp_wrkdir/coverage.not-avail
1484 if test -s $pp_wrkdir/coverage.not-avail; then
1485 pp_warn "The following files/directories were named but not found:"
1486 sed -e 's,^, ,' < $pp_wrkdir/coverage.not-avail >&2
1490 pp_files_ignore_others () {
1493 test -s $pp_wrkdir/ign.files || return
1495 #-- for each file in ign.files, we remove it from all the
1496 # other %files.* lists, except where it has an i flag.
1497 # rather than scan each list multiple times, we build
1500 pp_debug "stripping ignore files"
1503 echo '$6 == "'"$p"'" && $5 !~ /i/ { next }'
1504 done < $pp_wrkdir/ign.files > $pp_wrkdir/ign.awk
1505 echo '{ print }' >> $pp_wrkdir/ign.awk
1507 $pp_opt_debug && cat $pp_wrkdir/ign.awk
1509 for f in $pp_wrkdir/%files.*; do
1511 awk -f $pp_wrkdir/ign.awk < $f.ign > $f || pp_error "awk"
1515 pp_service_scan_groups () {
1518 #-- scan for "group" commands, and build a list of groups
1520 if test -n "$pp_services"; then
1521 for svc in $pp_services; do
1523 . $pp_wrkdir/%service.$svc
1524 if test -n "$group"; then
1525 pp_contains "$pp_services" "$group" && pp_error \
1526 "%service $svc: group name $group in use by a service"
1527 pp_add_to_list 'pp_service_groups' "$group"
1528 echo "$svc" >> $pp_wrkdir/%svcgrp.$group
1534 pp_service_get_svc_group () {
1535 (tr '\012' ' ' < $pp_wrkdir/%svcgrp.$1 ; echo) | sed -e 's/ $//'
1538 for _sufx in _init '' _names _cleanup _install_script \
1539 _init_svc_vars _function _probe _vas_platforms
1541 eval "pp_backend$_sufx () { pp_debug pp_backend$_sufx; pp_backend_\${pp_platform}$_sufx \"\$@\"; }"
1545 pp_platforms="$pp_platforms aix"
1547 pp_backend_aix_detect () {
1551 pp_backend_aix_init () {
1555 pp_aix_bosboot= # components that need bosboot
1558 pp_aix_start_services_after_install=false
1559 pp_aix_init_services_after_install=true
1561 pp_aix_sudo=sudo # AIX package tools must run as root
1563 case "$pp_aix_os" in
1564 *) pp_readlink_fn=pp_ls_readlink;; # XXX
1570 pp_aix_detect_arch () {
1571 pp_aix_arch_p=`uname -p 2>/dev/null`
1572 case "$pp_aix_arch_p" in
1573 "") pp_debug "can't get processor type from uname -p"
1574 pp_aix_arch_p=powerpc
1575 pp_aix_arch=R;; # guess (lsattr -l proc0 ??)
1576 powerpc) pp_aix_arch=R;;
1577 *) pp_aix_arch_p=intel
1578 pp_aix_arch=I;; # XXX? verify
1581 case "`/usr/sbin/lsattr -El proc0 -a type -F value`" in
1582 PowerPC_POWER*) pp_aix_arch_std=ppc64;;
1583 PowerPC*) pp_aix_arch_std=ppc;;
1584 *) pp_aix_arch_std=unknown;;
1588 pp_aix_detect_os () {
1596 pp_aix_version_fix () {
1598 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'`
1599 if test x"$v" != x"$1"; then
1600 pp_warn "stripped version '$1' to '$v'"
1603 ""|*..*|.*|*.) pp_error "malformed '$1'"
1606 # 5 components are only valid for fileset updates, not base
1607 # filesets (full packages). We trim 5+ components down to 4.
1608 pp_warn "version '$1' has too many dots for AIX, truncating"
1609 echo "$v" | cut -d. -f1-4;;
1610 *.*.*.*) echo "$v";;
1611 *.*.*) echo "$v.0";;
1612 *.*) echo "$v.0.0";;
1613 *) echo "$v.0.0.0";;
1621 *) pp_die "pp_aix_select: bad argument";;
1623 #pp_debug awk '$5 '$op' /^\/(usr|opt)(\/|$)/ { print; }'
1624 #awk '$5 '$op' /^\/(usr|opt)(\/|$)/ { print; }'
1625 awk $op'($6 ~ /^\/usr\// || $6 ~ /^\/opt\//) { print; }'
1628 pp_aix_copy_root () {
1629 typeset t m o g f p st target
1630 while read t m o g f p st; do
1632 d) pp_create_dir_if_missing "$1${p%/}";;
1633 f) pp_add_transient_file "$1$p"
1634 pp_verbose ln "$pp_destdir$p" "$pp_destdir$1$p" ||
1635 pp_error "can't link $p into $1";;
1636 *) pp_warn "pp_aix_copy_root: filetype $t not handled";;
1643 typeset prefix t m o g f p st
1646 while read t m o g f p st; do
1647 case "$t" in f) du -a "$pp_destdir$p";; esac
1648 done | sed -e 's!/[^/]*$!!' | sort +1 |
1650 { if (sz) print d,sz;
1653 END { if (sz) print d,sz }' |
1654 sed -n -e "s!^$pp_destdir!$prefix!p"
1658 awk '{ print "." pfx $6; }' pfx="$1"
1661 pp_aix_make_liblpp () {
1669 case "$f" in "$dn/"*) fl="$fl `basename $f`" ;;
1670 *) pp_die "liblpp name $f not in $dn/";; esac
1672 (cd "$dn" && pp_verbose ar -c -g -r "$out" $fl) || pp_error "ar error"
1675 pp_aix_make_script () {
1677 echo "#!/bin/sh" > "$1"
1679 echo "exit 0" >> "$1"
1683 pp_aix_inventory () {
1684 typeset fileset t m o g f p st type
1687 while read t m o g f p st; do
1688 case "$p" in *:*) pp_error "path $p contains colon";; esac
1691 f) type=FILE; defm=644 ;;
1692 s) type=SYMLINK; defm=777 ;;
1693 d) type=DIRECTORY; defm=755 ;;
1695 echo " type = $type"
1696 echo " class = inventory,apply,$fileset"
1697 if test x"$m" = x"-"; then m="$defm"; fi
1698 if test x"$o" = x"-"; then o="root"; fi
1699 if test x"$g" = x"-"; then g="system"; fi
1704 m=`echo $m|sed -e 's/^1/TCB,/' \
1705 -e 's/^[23]/TCB,SGID,/' \
1706 -e 's/^[45]/TCB,SUID,/' \
1707 -e 's/^[67]/TCB,SUID,SGID,/'`;; # vtx bit ignored
1711 f) if test ! -f "$pp_destdir$p"; then
1712 pp_error "$p: missing file"
1716 echo " size = VOLATILE"
1717 echo " checksum = VOLATILE"
1720 if test -r "$pp_destdir$p"; then
1721 echo " size = $size"
1722 pp_verbose sum -r < "$pp_destdir$p" |
1723 sed -e 's/.*/ checksum = "&"/'
1728 echo " target = $st"
1732 #-- Record ABI types seen
1734 f) if test -r "$pp_destdir$p"; then
1735 case "`file "$pp_destdir$p"`" in
1736 *"executable (RISC System/6000)"*) abi=ppc;;
1737 *"64-bit XCOFF executable"*) abi=ppc64;;
1740 if test -n "$abi"; then
1741 pp_add_to_list pp_aix_abis_seen $abi
1751 if test -s "$1"; then
1752 pp_warn "aix dependencies not implemented"
1756 pp_aix_add_service () {
1757 typeset svc cmd_cmd cmd_arg f
1760 pp_load_service_vars $svc
1764 cmd_arg="${pp_aix_mkssys_cmd_args:-$*}";
1766 case "$stop_signal" in
1767 HUP) stop_signal=1;;
1768 INT) stop_signal=2;;
1769 QUIT) stop_signal=3;;
1770 KILL) stop_signal=9;;
1771 TERM) stop_signal=15;;
1772 USR1) stop_signal=30;;
1773 USR2) stop_signal=31;;
1775 pp_error "%service $svc: stop_signal not set";;
1777 pp_error "%service $svc: bad stop_signal ($stop_signal)";;
1780 test -z "$pidfile" || pp_error "aix requires empty pidfile (non daemon)"
1782 pp_add_component run
1783 if test "$user" = "root"; then
1786 uid="\"\`/usr/bin/id -u $user\`\""
1790 #-- add command text to create/remove the service
1791 cat <<-. >> $pp_wrkdir/%post.$svc
1796 stop_signal=$stop_signal
1798 srcgroup="$pp_aix_mkssys_group"
1799 instances_allowed=${pp_aix_mkssys_instances_allowed:--Q}
1801 lssrc -s \$svc > /dev/null 2>&1
1802 if [ \$? -eq 0 ]; then
1803 lssrc -s \$svc | grep "active" > /dev/null 2>&1
1804 if [ \$? -eq 0 ]; then
1805 stopsrc -s \$svc > /dev/null 2>&1
1807 rmsys -s \$svc > /dev/null 2>&1
1810 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
1813 #-- add code to start the service on reboot
1814 ${pp_aix_init_services_after_install} &&
1815 cat <<-. >> $pp_wrkdir/%post.$svc
1816 id=\`echo "\$svc" | cut -c1-14\`
1817 mkitab "\$id:2:once:/usr/bin/startsrc -s \$svc" > /dev/null 2>&1
1820 ${pp_aix_start_services_after_install} &&
1821 cat <<-. >> $pp_wrkdir/%post.$svc
1825 if [ -f "$pp_wrkdir/%post.run" ];then
1826 cat $pp_wrkdir/%post.run >> $pp_wrkdir/%post.$svc
1828 mv $pp_wrkdir/%post.$svc $pp_wrkdir/%post.run
1831 ${pp_aix_init_services_after_install} &&
1832 pp_prepend $pp_wrkdir/%preun.$svc <<-.
1833 rmitab `echo "$svc" | cut -c1-14` > /dev/null 2>&1
1835 pp_prepend $pp_wrkdir/%preun.$svc <<-.
1836 stopsrc -s $svc >/dev/null 2>&1
1840 if [ -f "$pp_wrkdir/%preun.run" ];then
1841 cat $pp_wrkdir/%preun.run >> $pp_wrkdir/%preun.$svc
1843 mv $pp_wrkdir/%preun.$svc $pp_wrkdir/%preun.run
1847 typeset briefex instuser instroot svc cmp outbff
1848 typeset user_wrkdir root_wrkdir
1849 typeset user_files root_files
1851 test -n "$pp_destdir" ||
1852 pp_error "AIX backend requires the '--destdir' option"
1854 instuser="/usr/lpp/$name"
1855 instroot="$instuser/inst_root"
1856 pp_aix_bff_name=${pp_aix_bff_name:-$name}
1858 # Here is the component mapping:
1859 # run -> $pp_aix_bff_name.rte ('Run time environment')
1860 # doc -> $pp_aix_bff_name.doc (non-standard)
1861 # dev -> $pp_aix_bff_name.adt ('Application developer toolkit')
1862 # dbg -> $pp_aix_bff_name.diag ('Diagnostics')
1864 test `echo "$summary" | wc -c ` -gt 40 && pp_error "\$summary too long"
1866 user_wrkdir=$pp_wrkdir/u
1867 root_wrkdir=$pp_wrkdir/r
1868 pp_verbose rm -rf $user_wrkdir $root_wrkdir
1869 pp_verbose mkdir -p $user_wrkdir $root_wrkdir
1871 for svc in $pp_services .; do
1872 test . = "$svc" && continue
1873 pp_aix_add_service $svc
1877 echo "4 $pp_aix_arch I $name {"
1879 for cmp in $pp_components; do
1881 run) ex=rte briefex="runtime";;
1882 doc) ex=doc briefex="documentation";;
1883 dev) ex=adt briefex="developer toolkit";;
1884 dbg) ex=diag briefex="diagnostics";;
1887 user_files=$pp_wrkdir/%files.$cmp.u
1888 root_files=$pp_wrkdir/%files.$cmp.r
1890 pp_aix_select -user < $pp_wrkdir/%files.$cmp > $user_files
1891 pp_aix_select -root < $pp_wrkdir/%files.$cmp > $root_files
1893 # Default to USR only unless there are root files,
1894 # or a post/pre/check script associated
1896 if test -s $root_files \
1897 -o -s $pp_wrkdir/%pre.$cmp \
1898 -o -s $pp_wrkdir/%post.$cmp \
1899 -o -s $pp_wrkdir/%preun.$cmp \
1900 -o -s $pp_wrkdir/%postun.$cmp \
1901 -o -s $pp_wrkdir/%check.$cmp
1906 if $pp_opt_debug; then
1907 echo "$cmp USER %files:"
1909 echo "$cmp ROOT %files:"
1913 bosboot=N; pp_contains_any "$pp_aix_bosboot" $cmp && bosboot=b
1915 echo $pp_aix_bff_name.$ex \
1916 `[ $pp_aix_version ] && pp_aix_version_fix $pp_aix_version || pp_aix_version_fix "$version"` \
1917 1 $bosboot $content \
1918 $pp_aix_lang "$summary $briefex"
1921 pp_aix_depend $pp_wrkdir/%depend.$cmp
1925 # generate per-directory size information
1926 pp_aix_size < $user_files
1927 pp_aix_size $instroot < $root_files
1929 pp_aix_list < $user_files > $user_wrkdir/$pp_aix_bff_name.$ex.al
1930 pp_aix_list $instroot < $root_files >> $user_wrkdir/$pp_aix_bff_name.$ex.al
1931 pp_aix_list < $root_files > $root_wrkdir/$pp_aix_bff_name.$ex.al
1933 if $pp_opt_debug; then
1934 echo "$cmp USER $pp_aix_bff_name.$ex.al:"
1935 cat $user_wrkdir/$pp_aix_bff_name.$ex.al
1936 echo "$cmp ROOT $pp_aix_bff_name.$ex.al:"
1937 cat $root_wrkdir/$pp_aix_bff_name.$ex.al
1940 pp_aix_inventory $pp_aix_bff_name.$ex < $user_files \
1941 > $user_wrkdir/$pp_aix_bff_name.$ex.inventory
1942 pp_aix_inventory $pp_aix_bff_name.$ex < $root_files \
1943 > $root_wrkdir/$pp_aix_bff_name.$ex.inventory
1945 if $pp_opt_debug; then
1946 pp_debug "$cmp USER $pp_aix_bff_name.$ex.inventory:"
1947 cat $user_wrkdir/$pp_aix_bff_name.$ex.inventory
1948 pp_debug "$cmp ROOT $pp_aix_bff_name.$ex.inventory:"
1949 cat $root_wrkdir/$pp_aix_bff_name.$ex.inventory
1952 if test x"" != x"${pp_aix_copyright:-$copyright}"; then
1953 echo "${pp_aix_copyright:-$copyright}" > $user_wrkdir/$pp_aix_bff_name.$ex.copyright
1954 echo "${pp_aix_copyright:-$copyright}" > $root_wrkdir/$pp_aix_bff_name.$ex.copyright
1957 #-- assume that post/pre uninstall scripts only make
1958 # sense when installed in a root context
1960 if test -r $pp_wrkdir/%pre.$cmp; then
1961 pp_aix_make_script $user_wrkdir/$pp_aix_bff_name.$ex.pre_i \
1962 < $pp_wrkdir/%pre.$cmp
1965 if test -r $pp_wrkdir/%post.$cmp; then
1966 pp_aix_make_script $root_wrkdir/$pp_aix_bff_name.$ex.post_i \
1967 < $pp_wrkdir/%post.$cmp
1970 if test -r $pp_wrkdir/%preun.$cmp; then
1971 pp_aix_make_script $root_wrkdir/$pp_aix_bff_name.$ex.unpost_i \
1972 < $pp_wrkdir/%preun.$cmp
1975 if test -r $pp_wrkdir/%postun.$cmp; then
1976 pp_aix_make_script $root_wrkdir/$pp_aix_bff_name.$ex.unpre_i \
1977 < $pp_wrkdir/%postun.$cmp
1980 # remove empty files
1981 for f in $user_wrkdir/$pp_aix_bff_name.$ex.* $root_wrkdir/$pp_aix_bff_name.$ex.*; do
1982 if test ! -s "$f"; then
1983 pp_debug "removing empty $f"
1988 # copy/link the root files so we can do an easy backup later
1989 pp_aix_copy_root $instroot < $root_files
1995 } > $pp_wrkdir/lpp_name
1997 if $pp_opt_debug; then
1999 cat $pp_wrkdir/lpp_name
2002 #-- copy the /lpp_name file to the destdir
2003 pp_add_transient_file /lpp_name
2004 cp $pp_wrkdir/lpp_name $pp_destdir/lpp_name
2006 #-- copy the liblpp.a files under destdir for packaging
2007 (cd $user_wrkdir && pp_verbose ar -c -g -r liblpp.a $name.*) ||
2009 if test -s $user_wrkdir/liblpp.a; then
2010 pp_add_transient_file $instuser/liblpp.a
2011 pp_verbose cp $user_wrkdir/liblpp.a $pp_destdir$instuser/liblpp.a ||
2012 pp_error "cannot create user liblpp.a"
2014 (cd $root_wrkdir && pp_verbose ar -c -g -r liblpp.a $name.*) ||
2016 if test -s $root_wrkdir/liblpp.a; then
2017 pp_add_transient_file $instroot/liblpp.a
2018 pp_verbose cp $root_wrkdir/liblpp.a $pp_destdir$instroot/liblpp.a ||
2019 pp_error "cannot create root liblpp.a"
2023 test -s $user_wrkdir/liblpp.a && echo .$instuser/liblpp.a
2024 test -s $root_wrkdir/liblpp.a && echo .$instroot/liblpp.a
2025 cat $user_wrkdir/$name.*.al # includes the relocated root files!
2026 } > $pp_wrkdir/bff.list
2028 if test -n "$pp_aix_abis_seen" -a x"$pp_aix_arch_std" = x"auto"; then
2029 case "$pp_aix_abis_seen" in
2030 "ppc ppc64"|"ppc64 ppc")
2031 pp_aix_arch_std=ppc64
2034 pp_aix_arch_std=$pp_aix_abis_seen
2037 pp_warn "multiple architectures detected: $pp_aix_abis_seen"
2038 pp_aix_arch_std=unknown
2041 pp_warn "no binary executables detected; using noarch"
2042 pp_aix_arch_std=noarch
2045 pp_warn "unknown architecture detected $pp_aix_abis_seen"
2046 pp_aix_arch_std=$pp_aix_abis_seen
2053 outbff=`pp_backend_aix_names`
2054 pp_debug "creating: $pp_wrkdir/$outbff"
2055 (cd $pp_destdir && pp_verbose /usr/sbin/backup -i -q -p -f -) \
2056 < $pp_wrkdir/bff.list \
2057 > $pp_wrkdir/$outbff || pp_error "backup failed"
2058 $pp_aix_sudo /usr/sbin/installp -l -d $pp_wrkdir/$outbff
2061 pp_backend_aix_cleanup () {
2065 pp_backend_aix_names () {
2066 echo "$name.`[ $pp_aix_version ] && pp_aix_version_fix $pp_aix_version || pp_aix_version_fix "$version"`.bff"
2069 pp_backend_aix_install_script () {
2070 typeset pkgname platform
2072 # The script should take a first argument being the
2073 # operation; further arguments refer to components or services
2075 # list-components -- lists components in the pkg
2076 # install component... -- installs the components
2077 # uninstall component... -- uninstalles the components
2078 # list-services -- lists the services in the pkg
2079 # start service... -- starts the name service
2080 # stop service... -- stops the named services
2081 # print-platform -- prints the platform group
2083 pkgname="`pp_backend_aix_names`"
2084 platform="`pp_backend_aix_probe`" # XXX should be derived from files
2087 for cmp in $pp_components; do
2094 fsets="$fsets $name.$ex"
2098 pp_install_script_common
2103 test x"\$*" = x"all" &&
2104 set -- $pp_components
2108 run) echo "$name.rte";;
2109 doc) echo "$name.doc";;
2110 dev) echo "$name.adt";;
2111 dbg) echo "$name.diag";;
2117 test \$# -eq 0 && usage
2122 test \$# -eq 0 || usage \$op
2123 echo "$pp_components"
2126 test \$# -eq 0 || usage \$op
2130 test \$# -ge 1 || usage \$op
2131 echo \${PP_PKGDESTDIR:-.}/$pkgname
2134 test \$# -ge 1 || usage \$op
2135 verbose /usr/sbin/installp -acX -V0 -F \
2136 -d \${PP_PKGDESTDIR:-.}/$pkgname \
2137 \`cpt_to_fileset "\$@"\`
2140 test \$# -ge 1 || usage \$op
2141 verbose /usr/sbin/installp -u -e/dev/null \
2142 -V0 \`cpt_to_fileset "\$@"\`
2145 test \$# -ge 1 || usage \$op
2149 verbose \${op}src -s \$svc || ec=1
2162 pp_backend_aix_init_svc_vars () {
2166 pp_backend_aix_probe () {
2167 echo "${pp_aix_os}-${pp_aix_arch_std}"
2170 pp_backend_aix_vas_platforms () {
2171 case "${pp_aix_arch_std}" in
2173 *) pp_die "unknown architecture ${pp_aix_arch_std}";;
2175 case "${pp_aix_os}" in
2176 aix43) echo "aix-43";;
2177 aix51) echo "aix-51 aix-43";;
2178 aix52) echo "aix-51 aix-43";;
2179 aix53) echo "aix-53 aix-51 aix-43";;
2180 aix61) echo "aix-53 aix-51 aix-43";;
2181 *) pp_die "unknown system ${pp_aix_os}";;
2184 pp_backend_aix_function () {
2186 pp_mkgroup) cat <<'.';;
2187 /usr/sbin/lsgroup "$1" >/dev/null &&
2189 echo "Creating group $1"
2190 /usr/bin/mkgroup -A "$1"
2192 pp_mkuser:depends) echo pp_mkgroup;;
2193 pp_mkuser) cat <<'.';;
2194 /usr/sbin/lsuser "$1" >/dev/null &&
2196 pp_mkgroup "${2:-$1}" || return 1
2197 echo "Creating user $1"
2201 account_locked=true \
2202 home="${3:-/nohome.$1}" \
2206 pp_havelib) cat <<'.';;
2208 "") pp_tmp_name="lib$1.so";;
2209 *.*.*) pp_tmp_name="lib$1.so.$2";;
2210 *.*) pp_tmp_name="lib$1.so.$2.0";;
2211 *) pp_tmp_name="lib$1.so.$2";;
2213 for pp_tmp_dir in `echo "/usr/lib:/lib${3:+:$3}" | tr : ' '`; do
2214 test -r "$pp_tmp_dir/$pp_tmp_name" -a \
2215 -r "$pp_tmp_dir/lib$1.so" && return 0
2223 pp_platforms="$pp_platforms sd"
2225 pp_backend_sd_detect () {
2226 test x"$1" = x"HP-UX"
2229 pp_backend_sd_init () {
2232 pp_sd_stoplevels=auto
2235 pp_sd_vendor_tag=Quest
2236 pp_sd_default_start=1 # config_file default start value
2238 pp_readlink_fn=pp_ls_readlink # HPUX has no readlink
2239 pp_shlib_suffix='.sl' # .so on most other platforms
2244 pp_sd_detect_os () {
2248 pp_sd_os="${revision#?.}"
2249 test -z "$pp_sd_os" &&
2250 pp_warn "cannot detect OS version"
2251 pp_sd_os_std="hpux`echo $pp_sd_os | tr -d .`"
2253 case "`uname -m`" in
2254 9000/[678]??) pp_sd_arch_std=hppa;;
2255 ia64) pp_sd_arch_std=ia64;;
2256 *) pp_sd_arch_std=unknown;;
2260 pp_sd_write_files () {
2261 typeset t m o g f p st line dm
2262 while read t m o g f p st; do
2264 case "$f" in *v*) line="$line -v";; esac # FIXME for uninstall
2269 d) p=${p%/}; dm=755;;
2275 d) line="$line -t d"; p=${p%/}; dm=755;;
2276 s) line="$line -t s";;
2281 test x"$o" = x"-" && o=root
2282 test x"$g" = x"-" && g=sys
2283 test x"$m" = x"-" && m=$dm
2287 # swpackage will make unqualified links relative to the
2288 # current working (source) directory, not the destination;
2289 # we need to qualify them to prevent this.
2291 [!/]*) st="`dirname \"$p\"`/$st";;
2293 echo "$line -o $o -g $g -m $m $st $p"
2296 echo "$line -o $o -g $g -m $m $pp_destdir$p $p"
2303 pp_sd_service_group_script () {
2304 typeset grp svcs scriptpath out
2307 scriptpath="/sbin/init.d/$grp"
2308 out="$pp_destdir$scriptpath"
2310 pp_add_file_if_missing $scriptpath run 755 || return 0
2314 # generated by pp $pp_version
2319 #-- starts services in order.. stops them all if any break
2322 for svc in \$svcs; do
2323 /sbin/init.d/\$svc start
2329 if test -n "\$undo"; then
2330 for svc in \$undo; do
2331 /sbin/init.d/\$svc stop
2341 #-- stops services in reverse
2344 for svc in \$svcs; do
2345 reverse="\$svc \$reverse"
2348 for svc in \$reverse; do
2349 /sbin/init.d/\$svc stop || rc=\$?
2355 start_msg) echo "Starting \$svcs";;
2356 stop_msg) echo "Stopping \$svcs";;
2359 *) echo "usage: \$0 {start|stop|start_msg|stop_msg}"
2365 pp_sd_service_script () {
2366 typeset svc config_file config_value scriptpath out
2369 scriptpath="/sbin/init.d/$svc"
2371 config_file=${pp_sd_config_file:-/etc/rc.config.d/$svc}
2372 sd_config_var=`echo run-$svc | tr '[a-z]-' '[A-Z]_'`
2373 sd_config_value=${pp_sd_default_start:-0}
2374 pp_load_service_vars "$svc"
2376 test -n "$user" -a x"$user" != x"root" &&
2377 cmd="SHELL=/usr/bin/sh /usr/bin/su $user -c \"exec `echo $cmd | sed -e 's,[$\\\`],\\&,g'`\""
2378 if test -z "$pidfile"; then
2379 pidfile="/var/run/$svc.pid"
2380 cmd="$cmd & echo \$! > \$pidfile"
2383 pp_debug "config file is $config_file"
2385 pp_add_file_if_missing $scriptpath run 755
2386 pp_add_file_if_missing $config_file run 644 v
2388 cat <<-. >> $pp_destdir$config_file
2390 # Controls whether the $svc service is started
2391 $sd_config_var=$sd_config_value
2394 if test ! -f $pp_destdir$scriptpath; then
2395 cat <<-. > $pp_destdir$scriptpath
2397 # generated by pp $pp_version
2401 config_file="$config_file"
2408 test \${$sd_config_var:-0} -eq 0
2412 if test ! -s "\$pidfile"; then
2413 echo "Unable to stop \$svc (no pid file)"
2416 read pid < "\$pidfile"
2417 if kill -0 "\$pid" 2>/dev/null; then
2418 if kill -${stop_signal:-TERM} "\$pid"; then
2422 echo "Unable to stop \$svc"
2433 if test ! -s "\$pidfile"; then
2436 read pid < "\$pidfile"
2437 kill -0 "\$pid" 2>/dev/null
2442 start_msg) echo "Starting the \$svc service";;
2443 stop_msg) echo "Stopping the \$svc service";;
2445 if test -f "\$config_file"; then
2448 if pp_disabled; then
2450 elif pp_running; then
2451 echo "\$svc already running";
2454 echo "\$svc started";
2455 # rc(1M) says we should exit 4, but nobody expects it!
2460 stop) if pp_stop; then
2461 echo "\$svc stopped";
2466 *) echo "usage: \$0 {start|stop|start_msg|stop_msg}"
2473 pp_sd_make_service () {
2474 typeset level startpriority stoppriority startlevels stoplevels
2475 typeset svc svcvar symtype
2478 svcvar=`pp_makevar $svc`
2481 10.*) symtype="file";;
2482 *) symtype="file -t s";;
2485 # TODO: Figure out why this check is here
2486 #-- don't do anything if the script exists
2487 #if test -s "$pp_destdir/sbin/init.d/$svc"; then
2488 # pp_error "$pp_destdir/sbin/init.d/$svc exists"
2492 # symlink the script, depending on the priorities chosen
2493 eval startpriority='${pp_sd_startpriority_'$svcvar'}'
2494 eval stoppriority='${pp_sd_stoppriority_'$svcvar'}'
2495 test -z "$startpriority" && startpriority="${pp_sd_startpriority:-50}"
2496 test -z "$stoppriority" && stoppriority="${pp_sd_stoppriority:-50}"
2498 eval startlevels='${pp_sd_startlevels_'$svcvar'}'
2499 test -z "$startlevels" && startlevels="$pp_sd_startlevels"
2501 eval stoplevels='${pp_sd_stoplevels_'$svcvar'}'
2502 test -z "$stoplevels" && stoplevels="$pp_sd_stoplevels"
2504 # create the script and config file
2505 pp_sd_service_script $svc
2507 # fix the priority up
2508 case "$startpriority" in
2510 ??) startpriority=0$startpriority;;
2511 ?) startpriority=00$startpriority;;
2513 case "$stoppriority" in
2515 ??) stoppriority=0$stoppriority;;
2516 ?) stoppriority=00$stoppriority;;
2519 if test x"$stoplevels" = x"auto"; then
2521 test -z "$startlevels" || for level in $startlevels; do
2522 stoplevels="$stoplevels `expr $level - 1`"
2526 # create the symlinks
2527 test -z "$startlevels" || for level in $startlevels; do
2528 echo " ${symtype}" \
2529 "/sbin/init.d/$svc" \
2530 "/sbin/rc$level.d/S$startpriority$svc"
2532 test -z "$stoplevels" || for level in $stoplevels; do
2533 echo " ${symtype}" \
2534 "/sbin/init.d/$svc" \
2535 "/sbin/rc$level.d/K$stoppriority$svc"
2545 script="$pp_wrkdir/control.$ctrl.$cpt"
2549 echo "exit 0" >> $script
2550 /usr/bin/chmod +x $script
2551 echo " $ctrl $script"
2556 while read _name _vers; do
2557 case "$_name" in ""| "#"*) continue ;; esac
2558 echo " prerequisites $_name ${_vers:+r>= $_vers}"
2564 while read _name _vers; do
2565 case "$_name" in ""| "#"*) continue ;; esac
2566 echo " exrequisites $_name ${_vers:+r>= $_vers}"
2571 typeset psf cpt svc outfile release swp_flags
2574 release="?.${pp_sd_os%.[0-9][0-9]}.*"
2577 echo "layout_version 1.0" >>$psf
2582 tag $pp_sd_vendor_tag
2583 title "${pp_sd_vendor:-$vendor}"
2589 vendor_tag $pp_sd_vendor_tag
2592 copyright "$copyright"
2600 test -n "$description" \
2601 && echo $description > $pp_wrkdir/description \
2603 description < $pp_wrkdir/description
2606 # make convenience service groups
2607 if test -n "$pp_service_groups"; then
2608 for grp in $pp_service_groups; do
2609 pp_sd_service_group_script \
2610 $grp "`pp_service_get_svc_group $grp`"
2614 for cpt in $pp_components; do
2617 tag ${pp_sd_fileset_tag:-$cpt}
2618 title "${summary:-cpt}"
2621 test -s $pp_wrkdir/%depend.$cpt &&
2622 pp_sd_depend < $pp_wrkdir/%depend.$cpt >> $psf
2623 test -s $pp_wrkdir/%conflict.$cpt &&
2624 pp_sd_conflict < $pp_wrkdir/%conflict.$cpt >> $psf
2626 #-- make sure services are shut down during uninstall
2627 if test $cpt = run -a -n "$pp_services"; then
2628 for svc in $pp_services; do
2629 pp_prepend $pp_wrkdir/%preun.$cpt <<-.
2630 /sbin/init.d/$svc stop
2635 #-- we put the post/preun code into configure/unconfigure
2636 # and not postinstall/preremove, because configure/unconfigure
2637 # scripts are run on the hosts where the package is installed,
2638 # not loaded (a subtle difference).
2639 test -s $pp_wrkdir/%pre.$cpt &&
2640 pp_sd_control checkinstall $cpt $pp_wrkdir/%pre.$cpt >> $psf
2641 test -s $pp_wrkdir/%post.$cpt &&
2642 pp_sd_control configure $cpt $pp_wrkdir/%post.$cpt >> $psf
2643 test -s $pp_wrkdir/%preun.$cpt &&
2644 pp_sd_control unconfigure $cpt $pp_wrkdir/%preun.$cpt >> $psf
2645 test -s $pp_wrkdir/%postun.$cpt &&
2646 pp_sd_control postremove $cpt $pp_wrkdir/%postun.$cpt >> $psf
2647 test -s $pp_wrkdir/%check.$cpt &&
2648 pp_sd_control checkinstall $cpt $pp_wrkdir/%check.$cpt >> $psf
2650 if test $cpt = run -a -n "$pp_services"; then
2651 for svc in $pp_services; do
2652 #-- service names are 10 chars max on hpux
2653 case "$svc" in ???????????*)
2654 pp_warn "service name '$svc' is too long for hpux";;
2656 pp_sd_make_service $svc >> $psf
2658 #pp_sd_make_service_config
2661 pp_sd_write_files < $pp_wrkdir/%files.$cpt >> $psf
2663 #-- end fileset clause
2670 #-- end product clause
2675 $pp_opt_debug && cat $psf >&2
2677 test -s $pp_wrkdir/%fixup && . $pp_wrkdir/%fixup
2679 outfile=`pp_backend_sd_names`
2682 swp_flags="-x target_type=tape"
2685 swp_flags="-x media_type=tape"
2688 if pp_verbose ${pp_sd_sudo} /usr/sbin/swpackage -s $psf $swp_flags \
2689 @ $pp_wrkdir/$outfile
2691 pp_verbose ${pp_sd_sudo} /usr/sbin/swlist -l file -s $pp_wrkdir/$outfile
2693 pp_error "swpackage failed"
2697 pp_backend_sd_cleanup () {
2701 pp_backend_sd_names () {
2702 echo "$name-$version.$pp_sd_arch_std.depot"
2705 pp_backend_sd_install_script () {
2706 typeset pkgname platform
2708 pkgname=`pp_backend_sd_names`
2709 platform="`pp_backend_sd_probe`"
2712 pp_install_script_common
2716 test x"\$*" = x"all" && set -- $pp_components
2723 test \$# -eq 0 && usage
2728 test \$# -eq 0 || usage \$op
2729 echo "$pp_components"
2732 test \$# -eq 0 || usage \$op
2736 test \$# -ge 1 || usage \$op
2737 echo \${PP_PKGDESTDIR:-.}/$pkgname
2740 test \$# -ge 1 || usage \$op
2741 verbose /usr/sbin/swinstall -x verbose=0 \
2742 -s \${PP_PKGDESTDIR:-\`pwd\`}/$pkgname \
2743 \`cpt_to_tags "\$@"\`
2746 test \$# -ge 1 || usage \$op
2747 verbose /usr/sbin/swremove -x verbose=0 \
2748 \`cpt_to_tags "\$@"\`
2751 test \$# -ge 1 || usage \$op
2755 verbose /sbin/init.d/\$svc \$op
2756 [ \$? -eq 4 -o \$? -eq 0 ] || ec=1
2770 pp_backend_sd_probe () {
2771 echo "${pp_sd_os_std}-${pp_sd_arch_std}"
2774 pp_backend_sd_vas_platforms () {
2775 case "`pp_backend_sd_probe`" in
2776 hpux*-hppa) echo hpux-pa;;
2777 hpux*-ia64) echo hpux-ia64 hpux-pa;;
2778 *) pp_die "unknown system `pp_backend_sd_probe`";;
2782 pp_backend_sd_init_svc_vars () {
2785 pp_backend_sd_function () {
2787 pp_mkgroup) cat <<'.';;
2788 /usr/sbin/groupmod "$1" 2>/dev/null ||
2789 /usr/sbin/groupadd "$1"
2791 pp_mkuser:depends) echo pp_mkgroup;;
2792 pp_mkuser) cat <<'.';;
2793 pp_mkgroup "${2:-$1}" || return 1
2796 -d "${3:-/nonexistent}" \
2797 -s "${4:-/bin/false}" \
2800 pp_havelib) cat <<'.';;
2801 for pp_tmp_dir in `echo /usr/lib${3:+:$3} | tr : ' '`; do
2802 test -r "$pp_tmp_dir/lib$1${2:+.$2}.sl" && return 0
2810 pp_platforms="$pp_platforms solaris"
2812 pp_backend_solaris_detect () {
2813 test x"$1" = x"SunOS"
2816 pp_backend_solaris_init () {
2817 pp_solaris_category=
2818 pp_solaris_istates="s S 1 2 3" # run-states when install is ok
2819 pp_solaris_rstates="s S 1 2 3" # run-states when remove is ok
2823 pp_solaris_copyright=
2826 pp_solaris_package_arch=auto
2828 pp_solaris_detect_os
2829 pp_solaris_detect_arch
2833 #-- readlink not reliably available on Solaris
2834 pp_readlink_fn=pp_ls_readlink
2837 pp_solaris_detect_os () {
2840 osrel=`/usr/bin/uname -r`
2842 5.[0-6]) pp_solaris_os="sol2${osrel#5.}";;
2843 5.*) pp_solaris_os="sol${osrel#5.}";;
2845 test -z "$pp_solaris_os" &&
2846 pp_warn "can't determine OS suffix from uname -r"
2850 pp_solaris_detect_arch () {
2851 pp_solaris_arch=`/usr/bin/optisa amd64 sparcv9 i386 sparc`
2852 [ -z "$pp_solaris_arch" ] &&
2853 pp_error "can't determine processor architecture"
2854 case "$pp_solaris_arch" in
2855 amd64) pp_solaris_arch_std=x86_64;;
2856 i386) pp_solaris_arch_std=i386;;
2857 sparcv9) pp_solaris_arch_std=sparc64;;
2858 sparc) pp_solaris_arch_std=sparc;;
2859 *) pp_solaris_arch_std=unknown;;
2863 pp_solaris_is_request_script_necessary () {
2864 typeset has_optional_services
2866 has_optional_services=no
2867 for _svc in $pp_services; do
2868 pp_load_service_vars $_svc
2869 if test "$optional" = "yes"; then
2870 has_optional_services=yes
2874 # If the package has no optional services and only one component, don't
2875 # create a request script at all.
2876 if test "$has_optional_services" = "no" &&
2877 test `echo $pp_components | wc -w` -eq 1; then
2884 pp_solaris_request () {
2887 #-- The common part of the request script contains the ask() function
2888 # and resets the CLASSES list to empty
2892 ans=`ckyorn -d "$1" \
2893 -p "Do you want to $2"` \
2895 case "$ans" in y*|Y*) return 0;; *) return 1;; esac
2899 #-- each of our components adds itself to the CLASSES list
2900 for _cmp in $pp_components; do
2903 doc) echo 'ask y "install the documentation files" &&';;
2904 dev) echo 'ask y "install the development files" &&';;
2905 dbg) echo 'ask n "install the diagnostic files" &&';;
2907 echo ' CLASSES="$CLASSES '$_cmp'"'
2910 #-- the request script writes the CLASSES var to its output
2912 echo "CLASSES=$CLASSES" > $1
2915 if test -n "$pp_services"; then
2917 for _svc in $pp_services; do
2918 pp_load_service_vars $_svc
2919 if test "$enable" = "yes"; then
2924 if test "$optional" = "yes"; then
2925 echo 'ask '$_default_prompt' "install '$_svc' service" &&'
2927 echo ' SERVICES="$SERVICES '$_svc'"'
2929 echo 'echo "SERVICES=$SERVICES" >> $1'
2934 pp_solaris_procedure () {
2937 #-- $2 for $1 component of $name
2938 case " \$CLASSES " in *" $1 "*)
2946 pp_solaris_depend () {
2948 while read _name _vers; do
2949 if test -n "$_name"; then
2950 echo "P $_name $_name"
2951 test -n "$_vers" && echo " $_vers"
2956 pp_solaris_conflict () {
2958 while read _name _vers; do
2959 if test -n "$_name"; then
2960 echo "I $_name $_name"
2961 test -n "$_vers" && echo " $_vers"
2966 pp_solaris_space() {
2967 echo "$2:$3:$1" >> $pp_wrkdir/space.cumulative
2970 pp_solaris_sum_space () {
2971 if test -s $pp_wrkdir/space.cumulative; then
2972 sort -t: +2 < $pp_wrkdir/space.cumulative |
2973 awk -F: 'NR==1{n=$3}{if($3==n){b+=$1;i+=$2}else{print n" "b" "i;b=$1;i=$2;n=$3}}END{print n" "b" "i}' > $pp_wrkdir/space
2977 pp_solaris_proto () {
2978 typeset t m o g f p st
2981 while read t m o g f p st; do
2982 # Use Solaris default mode, owner and group if all unspecified
2983 if test x"$m$o$g" = x"---"; then
2986 test x"$o" = x"-" && o="root"
2988 f) test x"$g" = x"-" && g="bin"
2989 test x"$m" = x"-" && m=444
2991 *v*) echo "v $1 $p=$pp_destdir$p $m $o $g";;
2992 *) echo "f $1 $p=$pp_destdir$p $m $o $g";;
2994 if test -r "$pp_destdir$p"; then
2995 #-- Use file to record ABI types seen
2996 case "`file "$pp_destdir$p"`" in
2997 *"ELF 32"*80386*) abi=i386;;
2998 *"ELF 64"*AMD*) abi=x86_64;;
2999 *"ELF 32"*SPARC*) abi=sparc;;
3000 *"ELF 64"*SPARC*) abi=sparc64;;
3003 if test -n "$abi"; then
3004 pp_add_to_list pp_solaris_abis_seen $abi
3008 d) test x"$g" = x"-" && g="sys"
3009 test x"$m" = x"-" && m=555
3010 echo "d $1 $p $m $o $g"
3012 s) test x"$g" = x"-" && g="bin"
3013 test x"$m" = x"-" && m=777
3014 if test x"$m" != x"777" -a x"$m" != x"?"; then
3015 pp_warn "$p: invalid mode $m for symlink, should be 777 or -"
3017 echo "s $1 $p=$st $m $o $g"
3023 pp_backend_solaris () {
3024 typeset _cmp _svc _grp
3026 prototype=$pp_wrkdir/prototype
3029 pkginfo=$pp_wrkdir/pkginfo
3031 echo "i pkginfo=$pkginfo" >> $prototype
3033 case "${pp_solaris_name:-$name}" in
3035 pp_error "Package name '${pp_solaris_name:-$name}'" \
3036 "cannot start with a number"
3039 pp_warn "Package name '${pp_solaris_name:-$name}'" \
3040 "too long for Solaris 2.6 or 2.7 (max 9 characters)"
3043 pp_warn "Package name '${pp_solaris_name:-$name}'" \
3044 "too long for 2.7 Solaris (max 9 characters)"
3048 #-- generate the package info file
3049 echo "VERSION=$version" >> $pkginfo
3050 echo "PKG=${pp_solaris_name:-$name}" >> $pkginfo
3051 echo "CLASSES=$pp_components" >> $pkginfo
3052 echo "BASEDIR=/" >> $pkginfo
3053 echo "NAME=$name $version" >> $pkginfo
3054 echo "CATEGORY=${pp_solaris_category:-application}" >> $pkginfo
3056 desc="${pp_solaris_desc:-$description}"
3058 echo "DESC=$desc" >> $pkginfo
3060 test -n "$pp_solaris_rstates" &&
3061 echo "RSTATES=$pp_solaris_rstates" >> $pkginfo
3062 test -n "$pp_solaris_istates" &&
3063 echo "ISTATES=$pp_solaris_istates" >> $pkginfo
3064 test -n "$pp_solaris_maxinst" &&
3065 echo "MAXINST=$pp_solaris_maxinst" >> $pkginfo
3066 test -n "${pp_solaris_vendor:-$vendor}" &&
3067 echo "VENDOR=${pp_solaris_vendor:-$vendor}" >> $pkginfo
3068 test -n "$pp_solaris_pstamp" &&
3069 echo "PSTAMP=$pp_solaris_pstamp" >> $pkginfo
3071 if test -n "${pp_solaris_copyright:-$copyright}"; then
3072 echo "${pp_solaris_copyright:-$copyright}" > $pp_wrkdir/copyright
3073 echo "i copyright=$pp_wrkdir/copyright" >> $prototype
3076 #-- scripts to run before and after install
3077 : > $pp_wrkdir/postinstall
3078 : > $pp_wrkdir/preremove
3079 : > $pp_wrkdir/postremove
3080 for _cmp in $pp_components; do
3081 #-- add the preinstall scripts in definition order
3082 if test -s $pp_wrkdir/%pre.$_cmp; then
3083 pp_solaris_procedure $_cmp preinst < $pp_wrkdir/%pre.$_cmp \
3084 >> $pp_wrkdir/preinstall
3086 #-- add the postinstall scripts in definition order
3087 if test -s $pp_wrkdir/%post.$_cmp; then
3088 pp_solaris_procedure $_cmp postinst < $pp_wrkdir/%post.$_cmp \
3089 >> $pp_wrkdir/postinstall
3091 #-- add the preremove rules in reverse definition order
3092 if test -s $pp_wrkdir/%preun.$_cmp; then
3093 pp_solaris_procedure $_cmp preremove < $pp_wrkdir/%preun.$_cmp |
3094 pp_prepend $pp_wrkdir/preremove
3096 #-- add the postremove scripts in definition order
3097 if test -s $pp_wrkdir/%postun.$_cmp; then
3098 pp_solaris_procedure $_cmp postremove < $pp_wrkdir/%postun.$_cmp \
3099 >> $pp_wrkdir/postremove
3101 #-- Add the check script in definition order
3102 if test -s $pp_wrkdir/%check.$_cmp; then
3103 pp_solaris_procedure $_cmp checkinstall \
3104 < $pp_wrkdir/%check.$_cmp \
3105 >> $pp_wrkdir/checkinstall
3107 #-- All dependencies and conflicts are merged together for Solaris pkgs
3108 test -s $pp_wrkdir/%depend.$_cmp &&
3109 pp_solaris_depend < $pp_wrkdir/%depend.$_cmp >> $pp_wrkdir/depend
3110 test -s $pp_wrkdir/%conflict.$_cmp &&
3111 pp_solaris_conflict < $pp_wrkdir/%conflict.$_cmp >> $pp_wrkdir/depend
3115 if pp_solaris_is_request_script_necessary; then
3116 pp_solaris_request > $pp_wrkdir/request
3119 test -n "$pp_services" &&
3120 for _svc in $pp_services; do
3121 pp_load_service_vars $_svc
3122 pp_solaris_smf $_svc
3123 pp_solaris_make_service $_svc
3124 pp_solaris_install_service $_svc | pp_prepend $pp_wrkdir/postinstall
3125 pp_solaris_remove_service $_svc | pp_prepend $pp_wrkdir/preremove
3126 pp_solaris_remove_service $_svc | pp_prepend $pp_wrkdir/postremove
3127 unset pp_svc_xml_file
3130 test -n "$pp_service_groups" &&
3131 for _grp in $pp_service_groups; do
3132 pp_solaris_make_service_group \
3133 $_grp "`pp_service_get_svc_group $_grp`"
3136 #-- if installf was used; we need to indicate a termination
3137 grep installf $pp_wrkdir/postinstall >/dev/null &&
3138 echo 'installf -f $PKGINST' >> $pp_wrkdir/postinstall
3140 pp_solaris_sum_space
3142 # NB: pkginfo and copyright are added earlier
3143 for f in compver depend space checkinstall \
3144 preinstall request postinstall \
3145 preremove postremove; do
3146 if test -s $pp_wrkdir/$f; then
3148 *install|*remove|request)
3149 # turn scripts into a proper shell scripts
3150 mv $pp_wrkdir/$f $pp_wrkdir/$f.tmp
3152 echo "# $f script for ${pp_solaris_name:-$name}-$version"
3153 cat $pp_wrkdir/$f.tmp
3154 echo "exit 0"; } > $pp_wrkdir/$f
3155 chmod +x $pp_wrkdir/$f
3156 rm -f $pp_wrkdir/$f.tmp
3159 if $pp_opt_debug; then
3160 pp_debug "contents of $f:"
3161 cat $pp_wrkdir/$f >&2
3163 echo "i $f=$pp_wrkdir/$f" >> $prototype
3167 #-- create the prototype file which lists the files to install
3168 # do this as late as possible because files could be added
3169 pp_solaris_abis_seen=
3170 for _cmp in $pp_components; do
3171 pp_solaris_proto $_cmp < $pp_wrkdir/%files.$_cmp
3174 if test x"$pp_solaris_package_arch" = x"auto"; then
3175 if pp_contains "$pp_solaris_abis_seen" sparc64; then
3176 pp_solaris_package_arch_std="sparc64"
3177 echo "ARCH=sparcv9" >> $pkginfo
3178 elif pp_contains "$pp_solaris_abis_seen" sparc; then
3179 pp_solaris_package_arch_std="sparc"
3180 echo "ARCH=sparc" >> $pkginfo
3181 elif pp_contains "$pp_solaris_abis_seen" x86_64; then
3182 pp_solaris_package_arch_std="x86_64"
3183 echo "ARCH=amd64" >> $pkginfo
3184 elif pp_contains "$pp_solaris_abis_seen" i386; then
3185 pp_solaris_package_arch_std="i386"
3186 echo "ARCH=i386" >> $pkginfo
3188 pp_warn "No ELF files found: not supplying an ARCH type"
3189 pp_solaris_package_arch_std="noarch"
3192 pp_solaris_package_arch_std="$pp_solaris_package_arch"
3193 echo "ARCH=$pp_solaris_package_arch" >> $pkginfo
3196 mkdir $pp_wrkdir/pkg
3200 if $pp_opt_debug; then
3201 echo "$pkginfo::"; cat $pkginfo
3202 echo "$prototype::"; cat $prototype
3205 pkgmk -d $pp_wrkdir/pkg -f $prototype \
3206 || { error "pkgmk failed"; return; }
3207 pkgtrans -s $pp_wrkdir/pkg \
3208 $pp_wrkdir/`pp_backend_solaris_names` \
3209 ${pp_solaris_name:-$name} \
3210 || { error "pkgtrans failed"; return; }
3213 pp_backend_solaris_cleanup () {
3217 pp_backend_solaris_names () {
3218 echo ${pp_solaris_name:-$name}-$version-${pp_solaris_package_arch_std:-$pp_solaris_arch}.pkg
3221 pp_backend_solaris_install_script () {
3222 typeset pkgname platform
3224 platform="${pp_solaris_os:-solaris}-${pp_solaris_package_arch_std:-$pp_solaris_arch}"
3227 pp_install_script_common
3228 pkgname=`pp_backend_solaris_names`
3231 tmpnocheck=/tmp/nocheck\$\$
3232 tmpresponse=/tmp/response\$\$
3233 trap 'rm -f \$tmpnocheck \$tmpresponse' 0
3236 cat <<-.. > \$tmpresponse
3238 SERVICES=$pp_services
3240 cat <<-.. > \$tmpnocheck
3255 test \$# -eq 0 && usage
3260 test \$# -eq 0 || usage \$op
3261 echo "$pp_components"
3264 test \$# -eq 0 || usage \$op
3268 test \$# -ge 1 || usage \$op
3269 echo \${PP_PKGDESTDIR:-.}/$pkgname
3272 test \$# -ge 1 || usage \$op
3274 verbose /usr/sbin/pkgadd -n -d \${PP_PKGDESTDIR:-.}/$pkgname \
3277 ${pp_solaris_name:-$name}
3280 test \$# -ge 1 || usage \$op
3282 verbose /usr/sbin/pkgrm -n \
3284 ${pp_solaris_name:-$name}
3287 test \$# -ge 1 || usage \$op
3291 verbose /etc/init.d/\$svc \$op || ec=1
3305 pp_solaris_dynlib_depend () {
3306 xargs ldd 2>/dev/null |
3307 sed -e '/^[^ ]*:$/d' -e 's,.*=>[ ]*,,' -e 's,^[ ]*,,' |
3309 grep -v '^/usr/platform/' | (
3313 if [ $# -gt 32 ]; then
3319 [ $# -gt 0 ] && pkgchk -l "$@"
3321 awk '/^Current status:/{p=0} p==1 {print $1} /^Referenced by/ {p=1}' |
3323 xargs -l32 pkginfo -x |
3324 awk 'NR % 2 == 1 { name=$1; } NR%2 == 0 { print name, $2 }'
3327 pp_solaris_add_dynlib_depends () {
3329 tmp=$pp_wrkdir/tmp.dynlib
3331 for _cmp in $pp_components; do
3332 awk '{print destdir $6}' destdir="$pp_destdir" \
3333 < $pp_wrkdir/%files.$_cmp |
3334 pp_solaris_dynlib_depend > $tmp
3335 if test -s $tmp; then
3336 cat $tmp >> $pp_wrkdir/%depend.$_cmp
3342 pp_backend_solaris_probe () {
3343 echo "${pp_solaris_os}-${pp_solaris_arch_std}"
3346 pp_backend_solaris_vas_platforms () {
3347 case `pp_backend_solaris_probe` in
3348 sol10-sparc* | sol9-sparc* | sol8-sparc*)
3349 echo solaris8-sparc solaris7-sparc solaris26-sparc;;
3350 sol7-sparc*) echo solaris7-sparc solaris26-sparc;;
3351 sol26-sparc*) echo solaris26-sparc;;
3352 sol8-*86) echo solaris8-x86;;
3353 sol10-*86 | sol10-x86_64)
3354 echo solaris10-x64 solaris8-x86;;
3355 *) pp_die "unknown system `pp_backend_solaris_probe`";;
3358 pp_backend_solaris_function() {
3360 pp_mkgroup) cat<<'.';;
3361 /usr/sbin/groupmod "$1" 2>/dev/null && return 0
3362 /usr/sbin/groupadd "$1"
3364 pp_mkuser:depends) echo pp_mkgroup;;
3365 pp_mkuser) cat<<'.';;
3366 id "$1" >/dev/null 2>/dev/null && return 0
3367 pp_mkgroup "${2:-$1}" || return 1
3370 -d "${3:-/nonexistent}" \
3371 -s "${4:-/bin/false}" \
3378 pp_backend_solaris_init_svc_vars () {
3379 _smf_category=${pp_solaris_smf_category:-application}
3380 _smf_method_envvar_name=${smf_method_envvar_name:-"PP_SMF_SERVICE"}
3381 pp_solaris_service_shell=/sbin/sh
3384 pp_solaris_init_svc () {
3388 solaris_stop_signal=
3389 solaris_sysv_init_start=S70 # invocation order for start scripts
3390 solaris_sysv_init_kill=K30 # invocation order for kill scripts
3391 solaris_sysv_init_start_states="2" # states to install start link
3392 solaris_sysv_init_kill_states="S 0 1" # states to install kill link
3395 # To have the service be installed to start automatically,
3397 # solaris_sysv_init_start_states="S 0 1 2"
3402 typeset f _pp_solaris_service_script svc _pp_solaris_manpage
3404 pp_solaris_name=${pp_solaris_name:-$name}
3405 pp_solaris_manpath=${pp_solaris_manpath:-"/usr/share/man"}
3406 pp_solaris_mansect=${pp_solaris_mansect:-1}
3407 smf_start_timeout=${smf_start_timeout:-60}
3408 smf_stop_timeout=${smf_stop_timeout:-60}
3409 smf_restart_timeout=${smf_restart_timeout:-60}
3411 svc=${pp_solaris_smf_service_name:-$1}
3412 _pp_solaris_service_script=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
3413 _pp_solaris_manpage=${pp_solaris_manpage:-$svc}
3415 if [ -z $pp_svc_xml_file ]; then
3416 pp_svc_xml_file="/var/svc/manifest/$_smf_category/$svc.xml"
3417 echo "## Generating the smf service manifest file for $pp_svc_xml_file"
3419 echo "## SMF service manifest file already defined at $pp_svc_xml_file"
3420 if [ -z $pp_solaris_smf_service_name ] || [ -z $pp_solaris_smf_category ] || [ -z $pp_solaris_service_script ] || [ -z $smf_method_envvar_name ]; then
3421 pp_error "All required variables are not set.\n"\
3422 "When using a custom manifest file all of the following variables must be set:\n"\
3423 "pp_solaris_smf_service_name, pp_solaris_smf_category, pp_solaris_service_script and smf_method_envvar_name.\n\n"\
3425 " \$pp_solaris_smf_category=application\n"\
3426 " \$pp_solaris_smf_service_name=pp\n\n"\
3427 " <service name='application/pp' type='service' version='1'>\n\n"\
3429 " \$pp_solaris_service_script=/etc/init.d/pp\n\n"\
3430 " <exec_method type='method' name='start' exec='/etc/init.d/pp' />\n\n"\
3432 " \$smf_method_envvar_name=PP_SMF_SERVICE\n\n"\
3433 " <method_environment>\n"\
3434 " <envvar name='PP_SMF_SERVICE' value='1'/>\n"\
3435 " </method_environment>\n"
3443 pp_add_file_if_missing $f ||
3445 pp_solaris_add_parent_dirs "$f"
3447 _pp_solaris_smf_dependencies="
3448 <dependency name='pp_local_filesystems'
3449 grouping='require_all'
3452 <service_fmri value='svc:/system/filesystem/local'/>
3455 <dependency name='pp_single-user'
3456 grouping='require_all'
3459 <service_fmri value='svc:/milestone/single-user' />
3462 _pp_solaris_smf_dependencies=${pp_solaris_smf_dependencies:-$_pp_solaris_smf_dependencies}
3464 cat <<-. >$pp_destdir$f
3465 <?xml version="1.0"?>
3466 <!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
3469 Generated by PolyPackage $pp_version
3472 <service_bundle type='manifest' name='${pp_solaris_name}:${svc}' >
3473 <service name='$_smf_category/$svc'
3475 version='$smf_version'>
3477 <create_default_instance enabled='false'/>
3481 $_pp_solaris_smf_dependencies
3483 $pp_solaris_smf_additional_dependencies
3486 <method_credential user='${solaris_user:-$user}' />
3487 <method_environment>
3488 <envvar name='$_smf_method_envvar_name' value='1'/>
3489 </method_environment>
3492 <exec_method type='method' name='start'
3493 exec='$_pp_solaris_service_script start'
3494 timeout_seconds='$smf_start_timeout' />
3496 <exec_method type='method' name='stop'
3497 exec='$_pp_solaris_service_script stop'
3498 timeout_seconds='$smf_stop_timeout' />
3500 <exec_method type='method' name='restart'
3501 exec='$_pp_solaris_service_script restart'
3502 timeout_seconds='$smf_restart_timeout' />
3506 <loctext xml:lang='C'>$description</loctext>
3509 <manpage title='$pp_solaris_manpage' section='$pp_solaris_mansect' manpath='$pp_solaris_manpath'/>
3517 pp_solaris_make_service_group () {
3518 typeset group out file svcs svc
3522 file="/etc/init.d/$group"
3523 out="$pp_destdir$file"
3525 #-- return if the script is supplied already
3526 pp_add_file_if_missing "$file" run 755 || return 0
3527 pp_solaris_add_parent_dirs "$file"
3529 echo "#! /sbin/sh" > $out
3530 echo "# polypkg service group script for these services:" >> $out
3531 echo "svcs=\"$svcs\"" >> $out
3535 #-- starts services in order.. stops them all if any break
3538 for svc in $svcs; do
3539 if /etc/init.d/$svc start; then
3542 if test -n "$undo"; then
3543 for svc in $undo; do
3544 /etc/init.d/$svc stop
3553 #-- stops services in reverse
3556 for svc in $svcs; do
3557 reverse="$svc $reverse"
3560 for svc in $reverse; do
3561 /etc/init.d/$svc stop || rc=$?
3566 #-- returns true only if all services return true status
3569 for svc in $svcs; do
3570 /etc/init.d/$svc status || rc=$?
3579 restart) pp_stop && pp_start;;
3580 *) echo "usage: $0 {start|stop|restart|status}" >&2; exit 1;;
3585 pp_solaris_make_service () {
3586 typeset file out _cmd svc
3588 svc="${pp_solaris_smf_service_name:-$1}"
3589 file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
3590 out="$pp_destdir$file"
3592 #-- return if we don't need to create the init script
3593 pp_add_file_if_missing "$file" run 755 ||
3595 pp_solaris_add_parent_dirs "$file"
3597 echo "#! /sbin/sh" >$out
3598 echo "#-- This service init file generated by polypkg" >>$out
3600 #-- Start SMF integration.
3601 if [ -n "$pp_svc_xml_file" ] ; then
3603 if [ -x /usr/sbin/svcadm ] && [ "x\$1" != "xstatus" ] && [ "t\$$_smf_method_envvar_name" = "t" ] ; then
3606 echo "starting $svc"
3607 /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1
3608 /usr/sbin/svcadm enable -s $_smf_category/$svc
3610 if [ "\$RESULT" -ne 0 ] ; then
3611 echo "Error \$RESULT starting $svc" >&2
3615 echo "stopping $svc"
3616 /usr/sbin/svcadm disable -ts $_smf_category/$svc
3620 echo "restarting $svc"
3621 /usr/sbin/svcadm disable -ts $_smf_category/$svc
3622 /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1
3623 /usr/sbin/svcadm enable -s $_smf_category/$svc
3625 if [ "\$RESULT" -ne 0 ] ; then
3626 echo "Error \$RESULT starting $svc" >&2
3630 echo "Usage: $file {start|stop|restart|status}" >&2
3638 #-- construct a start command that builds a pid file as needed
3639 # and forks the daemon
3641 if test -z "$pidfile"; then
3642 # The service does not define a pidfile, so we have to make
3643 # our own up. On Solaris systems where there is no /var/run
3644 # we must use /tmp to guarantee the pid files are removed after
3647 pp_piddir="/var/run"
3648 test -d "\$pp_piddir/." || pp_piddir="/tmp"
3649 pidfile="\$pp_piddir/$svc.pid"
3651 _cmd="$cmd & echo \$! > \$pidfile"
3653 # The service is able to write its own PID file
3659 if test "${user:-root}" != "root"; then
3660 _cmd="su $user -c exec $_cmd";
3664 stop_signal="${stop_signal:-TERM}"
3667 # generated command to run $svc as a daemon process
3668 pp_exec () { $_cmd; }
3671 #-- write the invariant section of the init script
3674 # returns true if $svc is running
3676 test -s "$pidfile" || return 1
3677 read pid junk < "$pidfile" 2>/dev/null
3678 test ${pid:-0} -gt 1 &&
3679 kill -0 "$pid" 2>/dev/null
3682 # prints a message describing $svc's running state
3685 echo "service $svc is running (pid $pid)"
3687 elif test -f "$pidfile"; then
3688 echo "service $svc is not running, but pid file exists"
3691 echo "service $svc is not running"
3699 echo "service $svc already running" >&2
3702 echo "starting $svc... \c"
3714 echo "stopping $svc... \c"
3715 if kill -$stop_signal $pid; then
3723 echo "service $svc already stopped" >&2
3733 restart) pp_stop && pp_start;;
3734 *) echo "usage: $0 {start|stop|restart|status}" >&2; exit 1;;
3739 pp_solaris_remove_service () {
3742 svc="${pp_solaris_smf_service_name:-$1}"
3743 file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
3746 '$file' stop >/dev/null 2>/dev/null
3747 if [ "x${PKG_INSTALL_ROOT}" = 'x' ]; then
3748 if [ -x /usr/sbin/svcadm ] ; then
3749 # Likely un-needed, but just in case.
3750 /usr/sbin/svcadm disable -s '$svc' 2>/dev/null
3751 /usr/sbin/svccfg delete '$svc' 2>/dev/null
3757 pp_solaris_install_service () {
3758 typeset s k l file svc
3760 svc="${pp_solaris_smf_service_name:-$1}"
3761 file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
3763 s="${solaris_sysv_init_start}$svc"
3764 k="${solaris_sysv_init_kill}$svc"
3767 if [ "x${PKG_INSTALL_ROOT}" != "x" ]; then
3768 if [ -x ${PKG_INSTALL_ROOT}/usr/sbin/svcadm ]; then
3769 echo "/usr/sbin/svccfg import '$pp_svc_xml_file' 2>/dev/null" >> ${PKG_INSTALL_ROOT}/var/svc/profile/upgrade
3771 test -n "${solaris_sysv_init_start_states}" &&
3772 for state in ${solaris_sysv_init_start_states}; do
3773 l="/etc/rc$state.d/$s"
3775 echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
3776 pp_solaris_space /etc/rc$state.d 0 1
3778 test -n "${solaris_sysv_init_kill_states}" &&
3779 for state in ${solaris_sysv_init_kill_states}; do
3780 l="/etc/rc$state.d/$k"
3782 echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
3783 pp_solaris_space /etc/rc$state.d 0 1
3788 if [ -x /usr/sbin/svcadm ]; then
3789 echo "Registering '$svc' with SMF"
3790 /usr/sbin/svcadm disable -s '$svc' 2>/dev/null
3791 /usr/sbin/svccfg delete '$svc' 2>/dev/null
3792 /usr/sbin/svccfg import '$pp_svc_xml_file'
3794 test -n "${solaris_sysv_init_start_states}" &&
3795 for state in ${solaris_sysv_init_start_states}; do
3796 l="/etc/rc$state.d/$s"
3798 echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
3799 pp_solaris_space /etc/rc$state.d 0 1
3801 test -n "${solaris_sysv_init_kill_states}" &&
3802 for state in ${solaris_sysv_init_kill_states}; do
3803 l="/etc/rc$state.d/$k"
3805 echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
3806 pp_solaris_space /etc/rc$state.d 0 1
3813 pp_solaris_add_parent_dirs () {
3817 while test -n "$dir"; do
3818 if awk "\$6 == \"$dir/\" {exit 1}" < $pp_wrkdir/%files.run; then
3819 echo "d - - - - $dir/" >> $pp_wrkdir/%files.run
3825 pp_platforms="$pp_platforms deb"
3827 pp_backend_deb_detect () {
3828 test -f /etc/debian_version
3831 pp_deb_cmp_full_name () {
3833 prefix="${pp_deb_name:-$name}"
3835 run) echo "${prefix}" ;;
3836 dbg) echo "${prefix}-${pp_deb_dbg_pkgname}";;
3837 dev) echo "${prefix}-${pp_deb_dev_pkgname}";;
3838 doc) echo "${prefix}-${pp_deb_doc_pkgname}";;
3839 *) pp_error "unknown component '$1'";
3843 pp_backend_deb_init () {
3844 pp_deb_dpkg_version="2.0"
3850 pp_deb_maintainer="Quest Software, Inc <support@quest.com>"
3853 pp_deb_control_description=
3856 pp_deb_dbg_pkgname="dbg"
3857 pp_deb_dev_pkgname="dev"
3858 pp_deb_doc_pkgname="doc"
3859 pp_deb_section=contrib # Free software that depends on non-free software
3861 # Detect the host architecture
3864 # Make sure any programs we require are installed
3865 pp_deb_check_required_programs
3868 pp_deb_check_required_programs () {
3869 local p needed notfound ok
3871 for prog in dpkg dpkg-deb install md5sum fakeroot
3873 if which $prog 2>/dev/null >/dev/null; then
3874 pp_debug "$prog: found"
3876 pp_debug "$prog: not found"
3878 dpkg|dpkg-deb) p=dpkg;;
3879 install|md5sum) p=coreutils;;
3880 fakeroot) p=fakeroot;;
3881 *) pp_die "unexpected dpkg tool $prog";;
3883 notfound="$notfound $prog"
3884 pp_contains "$needed" "$p" || needed="$needed $p"
3887 if [ -n "$notfound" ]; then
3888 pp_error "cannot find these programs: $notfound"
3889 pp_error "please install these packages: $needed"
3893 pp_deb_munge_description () {
3894 # Insert a leading space on each line, replace blank lines with a
3895 #space followed by a full-stop.
3896 pp_deb_control_description="`echo ${pp_deb_description:-$description} | \
3897 sed 's,^\(.*\)$, \1, ' | sed 's,^[ \t]*$, .,g' | fmt -w 80`"
3900 pp_deb_detect_arch () {
3901 pp_deb_arch=`dpkg --print-architecture`
3902 pp_deb_arch_std=`uname -m`
3905 pp_deb_sanitize_version() {
3906 echo "$@" | tr -d -c '[:alnum:].+-:~'
3909 pp_deb_version_final() {
3910 if test -n "$pp_deb_version"; then
3911 # Don't sanitize; assume the user is sane (hah!)
3912 echo "$pp_deb_version"
3914 pp_deb_sanitize_version "$version"
3918 pp_deb_conflict () {
3919 local _name _vers _conflicts
3921 _conflicts="Conflicts:"
3922 while read _name _vers; do
3923 case "$_name" in ""| "#"*) continue ;; esac
3924 _conflicts="$_conflicts $_name"
3925 test -n "$_vers" && _conflicts="$_conflicts $_name (>= $vers)"
3926 _conflicts="${_conflicts},"
3928 echo "${_conflicts%,}"
3931 pp_deb_make_control() {
3933 local installed_size
3935 # compute the installed size
3936 installed_size=`pp_deb_files_size < $pp_wrkdir/%files.$cmp`
3938 package_name=`pp_deb_cmp_full_name "$cmp"`
3940 Package: ${package_name}
3941 Version: `pp_deb_version_final`-${pp_deb_release:-1}
3942 Section: ${pp_deb_section:-contrib}
3944 Architecture: ${pp_deb_arch}
3945 Maintainer: ${pp_deb_maintainer:-$maintainer}
3946 Description: ${pp_deb_summary:-$summary}
3947 ${pp_deb_control_description}
3948 Installed-Size: ${installed_size}
3950 if test -s $pp_wrkdir/%depend."$cmp"; then
3951 sed -ne '/^[ ]*$/!s/^[ ]*/Depends: /p' \
3952 < $pp_wrkdir/%depend."$cmp"
3954 if test -s $pp_wrkdir/%conflict."$cmp"; then
3955 pp_deb_conflict < $pp_wrkdir/%conflict."$cmp"
3959 pp_deb_make_md5sums() {
3960 local cmp="$1"; shift
3963 pkg_dir=$pp_wrkdir/`pp_deb_cmp_full_name $cmp`
3964 (cd $pkg_dir && md5sum "$@") > $pkg_dir/DEBIAN/md5sums ||
3965 pp_error "cannot make md5sums"
3968 pp_deb_make_package_maintainer_script() {
3973 # See if we need to create this script at all
3978 cat <<-. >$output || pp_error "Cannot create $output"
3981 # Generated by PolyPackage $pp_version
3985 cat $source >> "$output" || pp_error "Cannot append to $output"
3988 chmod 755 "$output" || pp_error "Cannot chmod $output"
3992 pp_deb_handle_services() {
3995 #-- add service start/stop code
3996 if test -n "$pp_services"; then
3997 #-- record the uninstall commands in reverse order
3998 for svc in $pp_services; do
3999 pp_load_service_vars $svc
4001 # Create init script (unless one exists)
4002 pp_deb_service_make_init_script $svc
4004 #-- append %post code to install the svc
4005 test x"yes" = x"$enable" &&
4006 cat<<-. >> $pp_wrkdir/%post.run
4009 # Install the service links
4010 update-rc.d $svc defaults
4015 #-- prepend %preun code to stop svc
4016 cat<<-. | pp_prepend $pp_wrkdir/%preun.run
4018 remove|deconfigure|upgrade)
4019 # Stop the $svc service
4020 invoke-rc.d $svc stop
4025 #-- prepend %postun code to remove service
4026 cat<<-. | pp_prepend $pp_wrkdir/%postun.run
4029 # Remove the service links
4030 update-rc.d $svc remove
4035 #pp_deb_service_remove_common | pp_prepend $pp_wrkdir/%preun.run
4039 pp_deb_fakeroot () {
4040 if test -s $pp_wrkdir/fakeroot.save; then
4041 fakeroot -i $pp_wrkdir/fakeroot.save -s $pp_wrkdir/fakeroot.save "$@"
4043 fakeroot -s $pp_wrkdir/fakeroot.save "$@"
4047 pp_deb_files_size () {
4048 local t m o g f p st
4049 while read t m o g f p st; do
4051 f|s) du -k "${pp_destdir}$p";;
4054 done | awk '{n+=$1} END {print n}'
4057 pp_deb_make_DEBIAN() {
4058 local cmp="${1:-run}"
4059 local data cmp_full_name
4064 cmp_full_name=`pp_deb_cmp_full_name $cmp`
4065 data=$pp_wrkdir/$cmp_full_name
4067 # Create DEBIAN dir $data/DEBIAN
4068 mkdir -p $data/DEBIAN
4070 # Create control file
4071 pp_deb_make_control $cmp > $data/DEBIAN/control
4074 if test -f $pp_wrkdir/%conffiles.$cmp; then
4075 cp $pp_wrkdir/%conffiles.$cmp $data/DEBIAN/conffiles
4079 pp_deb_make_package_maintainer_script "$data/DEBIAN/preinst" \
4080 "$pp_wrkdir/%pre.$cmp" "Pre-install script for $cmp_full_name"\
4084 pp_deb_make_package_maintainer_script "$data/DEBIAN/postinst" \
4085 "$pp_wrkdir/%post.$cmp" "Post-install script for $cmp_full_name"\
4089 pp_deb_make_package_maintainer_script "$data/DEBIAN/prerm" \
4090 "$pp_wrkdir/%preun.$cmp" "Pre-uninstall script for $cmp_full_name"\
4094 pp_deb_make_package_maintainer_script "$data/DEBIAN/postrm" \
4095 "$pp_wrkdir/%postun.$cmp" "Post-uninstall script for $cmp_full_name"\
4101 pp_deb_make_data() {
4102 local _l t m o g f p st data
4103 local data share_doc owner group
4105 data=$pp_wrkdir/`pp_deb_cmp_full_name $cmp`
4106 cat $pp_wrkdir/%files.${cmp} | while read t m o g f p st; do
4107 if test x"$m" = x"-"; then
4113 test x"$o" = x"-" && o=root
4114 test x"$g" = x"-" && g=root
4117 pp_deb_fakeroot install -D -o $o -g $g -m ${m} $pp_destdir/$p $data/$p;
4120 # File marked as "volatile". Assume this means it's a conffile
4121 # TODO: check this as admins like modified conffiles to be left
4123 echo "$p" >> $pp_wrkdir/%conffiles.$cmp
4127 pp_deb_fakeroot install -m ${m} -o $o -g $g -d $data/$p;;
4130 # Remove leading / from vars
4131 rel_p=`echo $p | sed s,^/,,`
4132 rel_st=`echo $st | sed s,^/,,`
4133 # TODO: we are always doing absolute links here. We should follow
4134 # the debian policy of relative links when in the same top-level
4136 (cd $data; ln -sf $st $rel_p);;
4137 *) pp_error "Unsupported data file type: $t";;
4141 # If no copyright file is present add one. This is a debian requirement.
4142 share_doc="/usr/share/doc/`pp_deb_cmp_full_name $cmp`"
4143 if [ ! -f "$data/$share_doc/copyright" ]
4145 echo "${pp_deb_copyright:-$copyright}" > "$pp_wrkdir/copyright"
4146 install -D -m 644 "$pp_wrkdir/copyright" "$data/$share_doc/copyright"
4153 local package_build_dir
4157 package_build_dir=$pp_wrkdir/`pp_deb_cmp_full_name $cmp`
4159 # Create package dir
4160 mkdir -p $package_build_dir
4163 pp_deb_make_data $cmp ||
4164 pp_die "Could not make DEBIAN data files for $cmp"
4166 # Make control files
4167 # must be done after copying data so conffiles are found
4168 pp_deb_make_DEBIAN $cmp ||
4169 pp_die "Could not make DEBIAN control files for $cmp"
4172 pp_deb_make_md5sums $cmp `(cd $package_build_dir;
4173 find . -name DEBIAN -prune -o -type f -print | sed "s,^\./,,")` ||
4174 pp_die "Could not make DEBIAN md5sums for $cmp"
4180 # Munge description for control file inclusion
4181 pp_deb_munge_description
4184 pp_deb_handle_services $cmp
4186 for cmp in $pp_components
4188 debname=`pp_deb_name $cmp`
4194 for cmp in $pp_components
4196 debname=`pp_deb_name $cmp`
4197 # Create debian package
4198 pp_debug "Building `pp_deb_cmp_full_name $cmp` -> $output"
4199 pp_deb_fakeroot dpkg-deb \
4200 --build $pp_wrkdir/`pp_deb_cmp_full_name $cmp` \
4201 $pp_wrkdir/$debname ||
4202 pp_error "failed to create $cmp package"
4206 pp_backend_deb_cleanup () {
4212 local cmp="${1:-run}"
4213 echo `pp_deb_cmp_full_name $cmp`"_"`pp_deb_version_final`"-${pp_deb_release:-1}_${pp_deb_arch}.deb"
4215 pp_backend_deb_names () {
4216 for cmp in $pp_components
4222 pp_backend_deb_install_script () {
4223 local cmp _cmp_full_name
4226 pp_install_script_common
4231 test x"\$*" = x"all" &&
4232 set -- $pp_components
4237 for cmp in $pp_components; do
4238 echo "$cmp) echo '`pp_deb_cmp_full_name $cmp`';;"
4247 cmp_to_pathname () {
4248 test x"\$*" = x"all" &&
4249 set -- $pp_components
4254 for cmp in $pp_components; do
4255 echo "$cmp) echo \${PP_PKGDESTDIR:-.}/'`pp_deb_name $cmp`';;"
4263 test \$# -eq 0 && usage
4267 test \$# -eq 0 || usage \$op
4271 test \$# -eq 0 || usage \$op
4275 test \$# -ge 1 || usage \$op
4276 cmp_to_pathname "\$@"
4279 test \$# -ge 1 || usage \$op
4280 dpkg --install \`cmp_to_pathname "\$@"\`
4283 test \$# -ge 1 || usage \$op
4284 dpkg --remove \`cmp_to_pkgname "\$@"\`; :
4287 test \$# -ge 1 || usage \$op
4291 /etc/init.d/\$svc \$op || ec=1
4296 test \$# -eq 0 || usage \$op
4297 echo "linux-${pp_deb_arch}"
4306 pp_backend_deb_probe() {
4307 local arch distro release
4311 # /etc/debian_version exists on Debian & Ubuntu, so it's no use
4312 # to us. Use lsb_release instead.
4314 case `(lsb_release -is || echo no-lsb) 2>/dev/null` in
4322 echo unknown-$pp_deb_arch_std
4330 release=`lsb_release -rs`
4332 # If release is not numeric, use the codename
4335 release=`lsb_release -cs`
4373 # Remove trailing revision number and any dots
4374 release=`echo $release | cut -dr -f1 | tr -d .`
4378 echo $distro$release-$pp_deb_arch_std
4381 pp_backend_deb_vas_platforms () {
4382 case "$pp_deb_arch_std" in
4383 x86_64) echo "linux-x86_64.deb";; # DO NOT add linux-x86.deb here!!
4384 *86) echo "linux-x86.deb";;
4385 *) pp_die "unknown architecture ${pp_deb_arch_std}";;
4388 pp_backend_deb_init_svc_vars () {
4391 start_runlevels=${pp_deb_default_start_runlevels-"2 3 4 5"} # == lsb default-start
4392 stop_runlevels=${pp_deb_default_stop_runlevels-"0 1 6"} # == lsb default-stop
4393 svc_description="${pp_deb_default_svc_description}" # == lsb short descr
4396 lsb_required_start='$local_fs $network'
4398 lsb_required_stop='$local_fs'
4402 stop_priority=50 #-- stop_priority = 100 - start_priority
4405 pp_deb_service_make_init_script () {
4407 local script=/etc/init.d/$svc
4408 local out=$pp_destdir$script
4411 pp_add_file_if_missing $script run 755 v || return 0
4413 #-- start out as an empty shell script
4418 #-- determine the process name from $cmd unless $svc_process is given
4420 #_process=${svc_process:-"$1"} --? WTF
4422 #-- construct a start command that builds a pid file if needed
4423 #-- the command name in /proc/[pid]/stat is limited to 15 characters
4425 _cmd_path=`echo $cmd | cut -d" " -f1`
4426 _cmd_name=`basename $_cmd_path | cut -c1-15`
4427 _cmd_args=`echo $cmd | cut -d" " -f2-`
4428 test x"$_cmd_path" != x"$_cmd_args" || _cmd_args=
4430 #-- generate the LSB init info
4434 # Required-Start: ${lsb_required_start}
4435 # Should-Start: ${lsb_should_start}
4436 # Required-Stop: ${lsb_required_stop}
4437 # Default-Start: ${start_runlevels}
4438 # Default-Stop: ${stop_runlevels}
4439 # Short-Description: ${svc_description:-no description}
4441 # Generated by PolyPackage ${pp_version}
4446 if test x"${svc_description}" = x"${pp_deb_default_svc_description}"; then
4450 #-- write service-specific definitions
4453 DESC="${svc_description:-$svc service}"
4456 PIDFILE="${pidfile}"
4457 STOP_SIGNAL="${stop_signal}"
4458 RELOAD_SIGNAL="${reload_signal}"
4460 DAEMON="${_cmd_path}"
4461 DAEMON_ARGS="${_cmd_args}"
4462 SCRIPTNAME=${script}
4465 #-- write the generic part of the init script
4468 [ -x "$DAEMON" ] || exit 0
4470 [ -r /etc/default/$NAME ] && . /etc/default/$NAME
4472 [ -f /etc/default/rcS ] && . /etc/default/rcS
4474 . /lib/lsb/init-functions
4479 # 0 if daemon has been started
4480 # 1 if daemon was already running
4481 # 2 if daemon could not be started
4482 if [ -n "$PIDFILE" ]
4484 pidfile_opt="--pidfile $PIDFILE"
4486 pidfile_opt="--make-pidfile --background --pidfile /var/run/$NAME.pid"
4490 user_opt="--user $USER"
4494 group_opt="--group $GROUP"
4497 start-stop-daemon --start --quiet $pidfile_opt $user_opt --exec $DAEMON --test > /dev/null \
4500 # Note: there seems to be no way to tell whether the daemon will fork itself or not, so pass
4501 # --background for now
4502 start-stop-daemon --start --quiet $pidfile_opt $user_opt --exec $DAEMON -- \
4510 # 0 if daemon has been stopped
4511 # 1 if daemon was already stopped
4512 # 2 if daemon could not be stopped
4513 # other if a failure occurred
4514 if [ -n "$PIDFILE" ]
4516 pidfile_opt="--pidfile $PIDFILE"
4518 pidfile_opt="--pidfile /var/run/$NAME.pid"
4522 user_opt="--user $USER"
4524 if [ -n $STOP_SIGNAL ]
4526 signal_opt="--signal $STOP_SIGNAL"
4528 start-stop-daemon --stop --quiet $signal_opt --retry=TERM/30/KILL/5 $pidfile_opt --name $NAME
4530 [ "$RETVAL" = 2 ] && return 2
4531 # Wait for children to finish too if this is a daemon that forks
4532 # and if the daemon is only ever run from this initscript.
4533 # If the above conditions are not satisfied then add some other code
4534 # that waits for the process to drop all resources that could be
4535 # needed by services started subsequently. A last resort is to
4536 # sleep for some time.
4537 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
4538 [ "$?" = 2 ] && return 2
4539 # Many daemons don't delete their pidfiles when they exit.
4540 test -z $PIDFILE || rm -f $PIDFILE
4546 # If the daemon can reload its configuration without
4547 # restarting (for example, when it is sent a SIGHUP),
4548 # then implement that here.
4550 if [ -n "$PIDFILE" ]
4552 pidfile_opt="--pidfile $PIDFILE"
4554 pidfile_opt="--pidfile /var/run/$NAME.pid"
4556 if [ -n "$RELOAD_SIGNAL" ]
4558 start-stop-daemon --stop --signal $RELOAD_SIGNAL --quiet $pidfile_opt --name $NAME
4565 [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
4568 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
4569 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
4573 [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
4576 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
4577 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
4580 reload|force-reload)
4581 if [ -n "$RELOAD_SIGNAL" ]
4583 log_daemon_msg "Reloading $DESC" "$NAME"
4587 # Do a restart instead
4593 # If the "reload" option is implemented then remove the
4594 # 'force-reload' alias
4596 log_daemon_msg "Restarting $DESC" "$NAME"
4603 1) log_end_msg 1 ;; # Old process is still running
4604 *) log_end_msg 1 ;; # Failed to start
4614 #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
4615 echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
4624 pp_backend_deb_function() {
4626 pp_mkgroup) cat<<'.';;
4627 /usr/sbin/groupmod "$1" 2>/dev/null && return 0
4628 /usr/sbin/groupadd "$1"
4630 pp_mkuser:depends) echo pp_mkgroup;;
4631 pp_mkuser) cat<<'.';;
4633 id -u "$1" >/dev/null 2>/dev/null && return 0
4634 # deb 3.1's useradd changed API in 4.0. Gah!
4635 /usr/sbin/useradd --help 2>&1 | /bin/grep -q .--system &&
4636 pp_tmp_system=--system
4637 pp_mkgroup "${2:-$1}" || return 1
4640 -d "${3:-/nonexistent}" \
4641 -s "${4:-/bin/false}" \
4645 pp_havelib) cat<<'.';;
4646 for pp_tmp_dir in `echo "/usr/lib:/lib${3:+:$3}" | tr : ' '`; do
4647 test -r "$pp_tmp_dir/lib$1.so{$2:+.$2}" && return 0
4655 pp_platforms="$pp_platforms kit"
4657 pp_backend_kit_detect () {
4658 test x"$1" = x"OSF1"
4661 pp_backend_kit_init () {
4667 pp_readlink_fn=pp_ls_readlink
4668 pp_kit_startlevels="2 3"
4669 pp_kit_stoplevels="0 2 3"
4673 typeset mi_file k_file svc outfile
4676 pp_backend_kit_names > /dev/null
4678 if test -z "$pp_kit_desc"; then
4679 pp_kit_desc="$description"
4682 mi_file="$pp_wrkdir/$pp_kit_subset.mi"
4683 k_file="$pp_wrkdir/$pp_kit_subset.k"
4684 scp_file="$pp_wrkdir/$pp_kit_subset.scp"
4686 desc="${pp_kit_desc:-$description}"
4691 VERS=$pp_kit_version
4695 $pp_kit_subset . 0 '$desc'
4698 if test -n "$pp_services"; then
4699 for svc in $pp_services; do
4700 pp_kit_make_service $svc
4701 pp_prepend $pp_wrkdir/%preun.run <<-.
4702 /sbin/init.d/$svc stop
4707 pp_backend_kit_make_mi "$mi_file"
4708 pp_backend_kit_make_scp
4709 #rm -rf $pp_wrkdir/kit_dest
4710 mkdir -p $pp_wrkdir/kit_dest
4711 pp_backend_kit_kits $k_file $pp_opt_destdir $pp_wrkdir/kit_dest
4712 tar cvf $pp_wrkdir/$pp_kit_subset.tar -C $pp_wrkdir/kit_dest .
4713 gzip -c $pp_wrkdir/$pp_kit_subset.tar > $pp_wrkdir/$pp_kit_subset.tar.gz
4714 #rm -rf $pp_wrkdir/$pp_kit_subset.tar $pp_wrkdir/scps
4717 pp_backend_kit_make_mi () {
4718 # XXX this information should go into the .inv files
4719 typeset t m o g f p st line dm
4720 while read t m o g f p st; do
4723 echo "0 .$p $pp_kit_subset"
4724 echo " chmod $m $p" >> $pp_wrkdir/%post.run
4725 if [ x"$o" = x"-" ] ; then
4726 echo " chown root $p" >> $pp_wrkdir/%post.run
4728 echo " chown $o $p" >> $pp_wrkdir/%post.run
4730 if [ x"$g" = x"-" ] ; then
4731 echo " chgrp 0 $p" >> $pp_wrkdir/%post.run
4733 echo " chgrp $g $p" >> $pp_wrkdir/%post.run
4737 echo " ln -s $st $p" >> $pp_wrkdir/%post.run
4738 echo " rm -f $p" >> $pp_wrkdir/%preun.run
4741 done < $pp_wrkdir/%files.run | sort -k3 |uniq > $1
4745 pp_backend_kit_make_scp () {
4746 scpdir="$pp_wrkdir/scps"
4747 mkdir "$scpdir" && touch "$scpdir"/$pp_kit_subset.scp
4748 cat <<EOF >"$scpdir"/$pp_kit_subset.scp
4750 . /usr/share/lib/shell/libscp
4764 cat $pp_wrkdir/%post.run >>"$scpdir"/$pp_kit_subset.scp
4765 cat >>"$scpdir"/$pp_kit_subset.scp <<EOF
4771 cat $pp_wrkdir/%preun.run >>"$scpdir"/$pp_kit_subset.scp
4772 cat >>"$scpdir"/$pp_kit_subset.scp <<EOF
4782 echo "Installation of the \$_DESC (\$_SUB) subset is complete."
4796 chmod 744 "$scpdir"/$pp_kit_subset.scp
4800 pp_backend_kit_cleanup () {
4804 pp_backend_kit_names () {
4805 if test -z "$pp_kit_name"; then
4806 pp_warn "pp_kit_name not specified, using XXX"
4809 case "$pp_kit_name" in
4811 *) pp_error "\$pp_kit_name $pp_kit_name must be three characters";;
4813 if test -z "$pp_kit_package"; then
4814 pp_warn "pp_kit_package not specified, using YYYY"
4817 if test -z "$pp_kit_version"; then
4818 pp_kit_version=`echo $version|tr -d '.a-zA-Z'`
4820 case "$pp_kit_version" in
4821 [0-9]) pp_kit_version="${pp_kit_version}00";;
4822 [0-9][0-9]) pp_kit_version="${pp_kit_version}0";;
4823 [0-9][0-9][0-9]) : ok;;
4824 *) pp_error "\$pp_kit_version $pp_kit_version must be three digits, ";;
4826 if test -z "$pp_kit_subset"; then
4827 pp_kit_subset="$pp_kit_name$pp_kit_package$pp_kit_version"
4829 echo "$pp_kit_subset.tar.gz"
4832 pp_backend_kit_install_script () {
4833 typeset pkgname platform
4835 pkgname=`pp_backend_kit_names`
4836 platform="`pp_backend_kit_probe`"
4839 pp_install_script_common
4843 test x"\$*" = x"all" && set -- $pp_components
4850 test \$# -eq 0 && usage
4855 test \$# -eq 0 || usage \$op
4856 echo "$pp_components"
4859 test \$# -eq 0 || usage \$op
4863 test \$# -ge 1 || usage \$op
4864 echo \${PP_PKGDESTDIR:-.}/$pkgname
4867 test \$# -ge 1 || usage \$op
4868 verbose echo \${PP_PKGDESTDIR:-\`pwd\`}/$pkgname \`cpt_to_tags "\$@"\`
4869 #verbose swinstall -x verbose=0 -s \${PP_PKGDESTDIR:-\`pwd\`}/$pkgname \`cpt_to_tags "\$@"\`
4872 test \$# -ge 1 || usage \$op
4873 verbose echo \`cpt_to_tags "\$@"\`
4874 #verbose swremove -x verbose=0 \`cpt_to_tags "\$@"\`
4877 test \$# -ge 1 || usage \$op
4881 verbose /sbin/init.d/\$svc \$op
4882 [ \$? -eq 4 -o \$? -eq 0 ] || ec=1
4896 pp_backend_kit_function () {
4898 pp_mkgroup) cat <<'.';;
4899 grep "^$1:" /etc/group >/dev/null ||
4900 /usr/sbin/groupadd $1
4902 pp_mkuser) cat <<'.';;
4904 grep "^$user:" /etc/passwd >/dev/null ||
4905 /usr/sbin/useradd -s /usr/bin/false "$@"
4907 pp_havelib) cat <<'.';;
4908 for dir in `echo /usr/lib${3+:$3} | tr : ' '`; do
4909 test -r "$dir/lib$1.${2-sl}" && return 0
4913 *) pp_error "unknown function request: $1";;
4917 pp_backend_kit_init_svc_vars () {
4921 pp_backend_kit_probe () {
4922 echo tru64-`uname -r | sed 's/V\([0-9]*\)\.\([0-9]*\)/\1\2/'`
4925 pp_kit_service_group_script () {
4926 typeset grp svcs scriptpath out
4929 scriptpath="/sbin/init.d/$grp"
4930 out="$pp_destdir$scriptpath"
4932 pp_add_file_if_missing $scriptpath run 755 || return 0
4936 # generated by pp $pp_version
4941 #-- starts services in order.. stops them all if any break
4944 for svc in $svcs; do
4945 /sbin/init.d/$svc start
4951 if test -n "$undo"; then
4952 for svc in $undo; do
4953 /sbin/init.d/$svc stop
4963 #-- stops services in reverse
4966 for svc in $svcs; do
4967 reverse="$svc $reverse"
4970 for svc in $reverse; do
4971 /sbin/init.d/$svc stop || rc=$?
4977 start_msg) echo "Starting $svcs";;
4978 stop_msg) echo "Stopping $svcs";;
4981 *) echo "usage: $0 {start|stop|start_msg|stop_msg}"
4987 pp_kit_service_script () {
4988 typeset svc scriptpath out
4991 scriptpath="/sbin/init.d/$svc"
4993 pp_load_service_vars "$svc"
4995 test -n "$user" -a x"$user" != x"root" &&
4996 cmd="SHELL=/usr/bin/sh /usr/bin/su $user -c \"exec `echo $cmd | sed -e 's,[$\\\`],\\&,g'`\""
4997 if test -z "$pidfile"; then
4998 pidfile="/var/run/$svc.pid"
4999 cmd="$cmd & echo \$! > \$pidfile"
5002 pp_add_file_if_missing $scriptpath run 755
5004 cat <<-. > $pp_destdir$scriptpath
5012 cat <<-'.' >>$pp_destdir$scriptpath
5014 if test ! -s "$pidfile"; then
5015 echo "Unable to stop $svc (no pid file)"
5018 read pid < "$pidfile"
5019 if kill -0 "$pid" 2>/dev/null; then
5020 if kill -${stop_signal:-TERM} "$pid"; then
5024 echo "Unable to stop $svc"
5035 if test ! -s "$pidfile"; then
5038 read pid < "$pidfile"
5039 kill -0 "$pid" 2>/dev/null
5043 start_msg) echo "Starting the $svc service";;
5044 stop_msg) echo "Stopping the $svc service";;
5047 echo "$svc already running";
5050 echo "$svc started";
5051 # rc(1M) says we should exit 4, but nobody expects it!
5059 echo "$svc stopped";
5065 *) echo "usage: $0 {start|stop|start_msg|stop_msg}"
5072 pp_kit_make_service () {
5073 typeset level priority startlevels stoplevels
5077 svcvar=`pp_makevar $svc`
5079 #-- don't do anything if the script exists
5080 if test -s "$pp_destdir/sbin/init.d/$svc"; then
5081 pp_error "$pp_destdir/sbin/init.d/$svc exists"
5085 # symlink the script, depending on the priorities chosen
5086 eval priority='${pp_kit_priority_'$svcvar'}'
5087 test -z "$priority" && priority="${pp_kit_priority:-50}"
5089 eval startlevels='${pp_kit_startlevels_'$svcvar'}'
5090 test -z "$startlevels" && startlevels="$pp_kit_startlevels"
5092 eval stoplevels='${pp_kit_stoplevels_'$svcvar'}'
5093 test -z "$stoplevels" && stoplevels="$pp_kit_stoplevels"
5095 # create the script and config file
5096 pp_kit_service_script $svc
5098 # fix the priority up
5101 ??) priority=0$priority;;
5102 ?) priority=00$priority;;
5105 if test x"$stoplevels" = x"auto"; then
5107 test -z "$startlevels" || for level in $startlevels; do
5108 stoplevels="$stoplevels `expr $level - 1`"
5112 # create the symlinks
5113 test -z "$startlevels" || for level in $startlevels; do
5114 echo " ln -s /sbin/init.d/$svc /sbin/rc$level.d/S$priority$svc" >>$pp_wrkdir/%post.run
5115 echo " rm /sbin/rc$level.d/S$priority$svc" >>$pp_wrkdir/%preun.run
5117 test -z "$stoplevels" || for level in $stoplevels; do
5118 echo " ln -s /sbin/init.d/$svc /sbin/rc$level.d/K$priority$svc" >>$pp_wrkdir/%post.run
5119 echo " rm -f /sbin/rc$level.d/K$priority$svc" >>$pp_wrkdir/%preun.run
5126 pp_backend_kit_sizes () {
5128 BEGIN { root = usr = var = 0; }
5130 if (substr($9, 1, 1) != "l")
5131 if (substr($10, 1, 6) == "./var/")
5133 else if (substr($10, 1, 10) == "./usr/var/")
5135 else if (substr($10, 1, 6) == "./usr/")
5140 END { printf "%d\t%d\t%d", root, usr, var }
5144 pp_kit_kits_global () {
5145 line=`sed -n '/^%%/q;/^'$2'=/{s/^'$2'=//p;q;}' <"$1"`
5146 test -z "$line" && return 1
5151 pp_backend_kit_kits () {
5152 typeset KITFILE FROMDIR TODIR
5155 SCPDIR="$pp_wrkdir/scps"
5157 PATH="/usr/lbin:/usr/bin:/etc:/usr/ucb:$PATH"; export PATH # XXX
5160 test $# -ge 3 || pp_die "pp_backend_kit_kits: too few arguments"
5165 test -f "$KITFILE" || pp_die "$KITFILE not found"
5166 test -d "$FROMDIR" || pp_die "$FROMDIR not found"
5167 test -d "$TODIR" || pp_die "$TODIR not found"
5169 INSTCTRL="$TODIR/instctrl"
5170 mkdir -p "$INSTCTRL" || pp_die "cannot create instctrl directory"
5171 chmod 775 "$INSTCTRL"
5173 grep "%%" $KITFILE > /dev/null || pp_die "no %% in $KITFILE"
5175 typeset NAME CODE VERS MI ROOT COMPRESS
5176 typeset S_LIST ALLSUBS
5178 NAME=`pp_kit_kits_global "$KITFILE" NAME` || pp_die "no NAME in $KITFILE"
5179 CODE=`pp_kit_kits_global "$KITFILE" CODE` || pp_die "no CODE in $KITFILE"
5180 VERS=`pp_kit_kits_global "$KITFILE" VERS` || pp_die "no VERS in $KITFILE"
5181 MI=`pp_kit_kits_global "$KITFILE" MI` || pp_die "no MI in $KITFILE"
5182 ROOT=`pp_kit_kits_global "$KITFILE" ROOT`
5183 COMPRESS=`pp_kit_kits_global "$KITFILE" COMPRESS`
5185 test -f "$MI" || pp_die "Inventory file $MI not found"
5189 test -f "$TODIR/$ROOT" ||
5190 pp_die "Root image $ROOT not found in $TODIR" ;;
5193 ALLSUBS=`awk 'insub==1 {print $1} /^%%/ {insub=1}' <"$KITFILE"`
5194 test $# -eq 0 && set -- $ALLSUBS
5196 pp_debug "Creating $# $NAME subsets."
5197 pp_debug "ALLSUBS=<$ALLSUBS>"
5199 if test x"$COMPRESS" = x"1"; then
5205 #rm -f *.ctrl Volume*
5209 test -z "$SUB" && pp_die "SUB is empty"
5211 typeset INV CTRL ROOTSIZE USRSIZE VARSIZE TSSUB
5215 *) pp_verbose rm -f "$TODIR/$SUB"* "$INSTCTRL/$SUB"*;;
5218 TSSUB="$pp_wrkdir/ts.$SUB"
5220 pp_debug "kits: Subset $SUB"
5224 pp_debug "kits: Generating media creation information..."
5226 # Invcutter takes as input
5228 # and generates stl_inv(4) files, like this
5229 # f 0 00000 0 0 100644 2/11/09 010 f dir/path none SUB
5230 grep " $SUB\$" "$MI" |
5231 pp_verbose /usr/lbin/invcutter \
5232 -v "$VERS" -f "$FROMDIR" > "$INSTCTRL/$INV" ||
5233 pp_die "failed to create $INSTCTRL/$INV"
5234 chmod 664 "$INSTCTRL/$INV"
5236 pp_backend_kit_sizes "$INSTCTRL/$INV" > "$pp_wrkdir/kit.sizes"
5237 read ROOTSIZE USRSIZE VARSIZE < "$pp_wrkdir/kit.sizes"
5239 # Prefix each line with $FROMDIR. This will be stripped
5240 awk '$1 != "d" {print from $10}' from="$FROMDIR/" \
5241 > "$TSSUB" < "$INSTCTRL/$INV" ||
5246 pp_debug "kits: Creating $SUB control file..."
5248 sed '1,/^%%/d;/^'"$SUB"'/{p;q;}' < "$KITFILE" > "$pp_wrkdir/kit.line"
5249 read _SUB _IGNOR DEPS FLAGS DESC < "$pp_wrkdir/kit.line"
5250 if test -z "$_SUB"; then
5251 pp_warn "No such subset $SUB in $KITFILE"
5254 DEPS=`echo $DEPS | tr '|' ' '`
5256 FLGEXP*) pp_verbose FLAGS='"${'"$FLAGS"'}"' ;;
5259 *%*) DESC=`echo $DESC|awk -F% '{printf "%-36s%%%s\n", $1, $2}'`;;
5262 cat > "$INSTCTRL/$CTRL" <<-.
5273 chmod 664 "$INSTCTRL/$CTRL"
5275 pp_debug "kits: Making tar image"
5277 pp_verbose tar cfPR "$TODIR/$SUB" "$FROMDIR/" "$TSSUB" ||
5278 pp_error "problem creating kit file"
5281 pp_debug "kits: Compressing"
5282 (cd "$TODIR" && compress -f -v "$SUB") ||
5283 pp_die "problem compressing $TODIR/$SUB"
5284 SPC=`expr $SUB : '\(...\).*'` # first three characters
5285 SVC=`expr $SUB : '.*\(...\)'` # last three characters
5286 : > "$INSTCTRL/$SPC$SVC.comp"
5287 chmod 664 "$INSTCTRL/$SPC$SVC.comp"
5288 pp_debug "kits: Padding compressed file to 10kB" # wtf?
5291 dd if="$TODIR/$SUB.Z" of="$TODIR/$SUB" bs=10k conv=sync ||
5292 pp_die "problem moving compressed file"
5293 rm -f "$TODIR/$SUB.Z"
5295 chmod 664 "$TODIR/$SUB"
5297 if test -f "$SCPDIR/$SUB.scp"; then
5298 cp "$SCPDIR/$SUB.scp" "$INSTCTRL/$SUB.scp"
5299 chmod 755 "$INSTCTRL/$SUB.scp"
5301 pp_debug "kits: null subset control program for $SUB"
5302 : > "$INSTCTRL/$SUB.scp"
5303 chmod 744 "$INSTCTRL/$SUB.scp"
5306 pp_debug "kits: Finished creating media image for $SUB"
5309 pp_debug "kits: Creating $CODE.image"
5312 *ROOT) ALLSUBS="$ROOT $ALLSUBS"
5316 (cd "$TODIR" && sum $ALLSUBS) > "$INSTCTRL/$CODE.image"
5317 chmod 664 "$INSTTRL/$CODE.image"
5318 pp_debug "kits: Creating INSTCTRL"
5319 (cd "$INSTCTRL" && tar cpvf - *) > "$TODIR/INSTCTRL"
5320 chmod 664 "$TODIR/INSTCTRL"
5321 cp "$INSTCTRL/$CODE.image" "$TODIR/$CODE.image"
5322 chmod 664 "$TODIR/$CODE.image"
5324 pp_debug "kits: Media image production complete"
5327 pp_platforms="$pp_platforms rpm"
5329 pp_backend_rpm_detect () {
5330 test x"$1" = x"Linux" -a ! -f /etc/debian_version
5333 pp_backend_rpm_init () {
5338 pp_rpm_group="Applications/Internet"
5339 pp_rpm_license="Unspecified"
5347 pp_rpm_dev_group="Development/Libraries"
5348 pp_rpm_dbg_group="Development/Tools"
5349 pp_rpm_doc_group="Documentation"
5350 pp_rpm_dev_description=
5351 pp_rpm_dbg_description=
5352 pp_rpm_doc_description=
5353 pp_rpm_dev_requires=
5354 pp_rpm_dbg_requires=
5355 pp_rpm_doc_requires=
5356 pp_rpm_dev_provides=
5357 pp_rpm_dbg_provides=
5358 pp_rpm_doc_provides=
5360 pp_rpm_dbg_pkgname=debug
5361 pp_rpm_dev_pkgname=devel
5362 pp_rpm_doc_pkgname=doc
5364 pp_rpm_defattr_uid=root
5365 pp_rpm_defattr_gid=root
5368 pp_rpm_detect_distro
5369 pp_rpm_rpmbuild=`pp_rpm_detect_rpmbuild`
5371 # SLES8 doesn't always come with readlink
5372 test -x /usr/bin/readlink -o -x /bin/readlink ||
5373 pp_readlink_fn=pp_ls_readlink
5376 pp_rpm_detect_arch () {
5379 #-- Find the default native architecture that RPM is configured to use
5380 cat <<-. >$pp_wrkdir/dummy.spec
5385 Group: ${pp_rpm_group}
5386 License: ${pp_rpm_license}
5390 $pp_opt_debug && cat $pp_wrkdir/dummy.spec
5391 pp_rpm_arch_local=`rpm -q --qf '%{arch}\n' --specfile $pp_wrkdir/dummy.spec`
5392 rm $pp_wrkdir/dummy.spec
5394 #-- Ask the kernel what machine architecture is in use
5396 for arch in "`uname -m`" "`uname -p`"; do
5399 pp_rpm_arch_std=i386
5402 x86_64|ppc|ppc64|ia64|s390|s390x)
5403 pp_rpm_arch_std="$arch"
5408 case "`/usr/sbin/lsattr -El proc0 -a type -F value`" in
5409 PowerPC_POWER*) pp_rpm_arch_std=ppc64;;
5410 *) pp_rpm_arch_std=ppc;;
5414 *) pp_rpm_arch_std=unknown
5419 #-- Later on, when files are processed, we use 'file' to determine
5420 # what platform ABIs are used. This is used when pp_rpm_arch == auto
5424 pp_rpm_detect_distro () {
5426 if test -f /etc/whitebox-release; then
5427 pp_rpm_distro=`awk '
5428 /^White Box Enterprise Linux release/ { print "wbel" $6; exit; }
5429 ' /etc/whitebox-release`
5430 elif test -f /etc/mandrakelinux-release; then
5431 pp_rpm_distro=`awk '
5432 /^Mandrakelinux release/ { print "mand" $3; exit; }
5433 ' /etc/mandrake-release`
5434 elif test -f /etc/mandrake-release; then
5435 pp_rpm_distro=`awk '
5436 /^Linux Mandrake release/ { print "mand" $4; exit; }
5437 /^Mandrake Linux release/ { print "mand" $4; exit; }
5438 ' /etc/mandrake-release`
5439 elif test -f /etc/fedora-release; then
5440 pp_rpm_distro=`awk '
5441 /^Fedora Core release/ { print "fc" $4; exit; }
5442 /^Fedora release/ { print "f" $3; exit; }
5443 ' /etc/fedora-release`
5444 elif test -f /etc/redhat-release; then
5445 pp_rpm_distro=`awk '
5446 /^Red Hat Enterprise Linux/ { print "rhel" $7; exit; }
5447 /^CentOS release/ { print "centos" $3; exit; }
5448 /^CentOS Linux release/ { print "centos" $4; exit; }
5449 /^Red Hat Linux release/ { print "rh" $5; exit; }
5450 ' /etc/redhat-release`
5451 elif test -f /etc/SuSE-release; then
5452 pp_rpm_distro=`awk '
5453 /^SuSE Linux [0-9]/ { print "suse" $3; exit; }
5454 /^SUSE LINUX [0-9]/ { print "suse" $3; exit; }
5455 /^openSUSE [0-9]/ { print "suse" $2; exit; }
5456 /^S[uU]SE Linux Enterprise Server [0-9]/ { print "sles" $5; exit; }
5457 /^S[uU]SE LINUX Enterprise Server [0-9]/ { print "sles" $5; exit; }
5458 /^SuSE SLES-[0-9]/ { print "sles" substr($2,6); exit; }
5459 ' /etc/SuSE-release`
5460 elif test -f /etc/pld-release; then
5461 pp_rpm_distro=`awk '
5462 /^[^ ]* PLD Linux/ { print "pld" $1; exit; }
5464 elif test X"`uname -s 2>/dev/null`" = X"AIX"; then
5468 pp_rpm_distro="aix$v$r"
5470 pp_rpm_distro=`echo $pp_rpm_distro | tr -d .`
5471 test -z "$pp_rpm_distro" &&
5472 pp_warn "unknown distro"
5475 pp_rpm_detect_rpmbuild () {
5477 for cmd in rpmbuild rpm; do
5478 if `which $cmd > /dev/null 2>&1`; then
5484 pp_error "Could not find rpmbuild"
5485 # Default to `rpmbuild` in case it magically appears
5495 test -z "$arg" || echo "$label: $arg"
5499 pp_rpm_writefiles () {
5500 local _l t m o g f p st fo farch
5501 while read t m o g f p st; do
5503 test $t = d && _l="%dir ${_l%/}/"
5504 if test x"$m" = x"-"; then
5510 test x"$o" = x"-" && o="${pp_rpm_defattr_uid:-root}"
5511 test x"$g" = x"-" && g="${pp_rpm_defattr_gid:-root}"
5512 _l="%attr($m,$o,$g) $_l"
5514 if test "$t" = "f" -a x"$pp_rpm_arch" = x"auto"; then
5515 fo=`file "${pp_destdir}$p" 2>/dev/null`
5516 #NB: The following should match executables and shared objects,
5517 #relocatable objects. It will not match .a files however.
5519 *": ELF 32-bit LSB "*", Intel 80386"*)
5521 *": ELF 64-bit LSB "*", AMD x86-64"*|\
5522 *": ELF 64-bit LSB "*", x86-64"*)
5524 *": ELF 32-bit MSB "*", PowerPC"*)
5526 *": ELF 64-bit MSB "*", 64-bit PowerPC"*)
5528 *": ELF 64-bit LSB "*", IA-64"*)
5530 *": ELF 32-bit MSB "*", IBM S/390"*)
5532 *": ELF 64-bit MSB "*", IBM S/390"*)
5534 *"executable (RISC System/6000)"*)
5536 *"64-bit XCOFF executable"*)
5543 # If file(1) doesn't provide enough info, try readelf(1)
5544 if test "$farch" = "ELF"; then
5545 fo=`readelf -h "${pp_destdir}$p" | awk '{if ($1 == "Class:") {class=$2} else if ($1 == "Machine:") {machine=$0; sub(/^ *Machine: */, "", machine)}} END {print class " " machine}' 2>/dev/null`
5547 "ELF32 Intel 80386")
5549 "ELF64 "*[xX]"86-64")
5565 pp_debug "file: $fo -> $farch"
5566 test x"$farch" = x"noarch" || pp_add_to_list pp_rpm_arch_seen $farch
5569 case $f in *v*) _l="%config(noreplace) $_l";; esac
5578 dbg) echo "${2}${pp_rpm_dbg_pkgname}";;
5579 dev) echo "${2}${pp_rpm_dev_pkgname}";;
5580 doc) echo "${2}${pp_rpm_doc_pkgname}";;
5581 *) pp_error "unknown component '$1'";
5587 while read _name _vers; do
5588 case "$_name" in ""| "#"*) continue ;; esac
5589 echo "Requires: $_name ${_vers:+>= $_vers}"
5593 pp_rpm_conflict () {
5595 while read _name _vers; do
5596 case "$_name" in ""| "#"*) continue ;; esac
5597 echo "Conflicts: $_name ${_vers:+>= $_vers}"
5601 pp_rpm_override_requires () {
5602 local orig_find_requires
5604 if test -z "$pp_rpm_depend_filter_cmd"; then
5608 orig_find_requires=`rpm --eval '%{__find_requires}'`
5609 cat << EOF > "$pp_wrkdir/filtered-find-requires"
5610 $orig_find_requires \$@ | $pp_rpm_depend_filter_cmd
5612 chmod +x "$pp_wrkdir/filtered-find-requires"
5613 echo "%define __find_requires $pp_wrkdir/filtered-find-requires"
5614 # Might be necessary for old versions of RPM? Not for 4.4.2.
5615 #echo "%define _use_internal_dependency_generator 0"
5619 local cmp specfile _summary _group _desc _pkg _subname svc
5621 specfile=$pp_wrkdir/$name.spec
5624 #-- force existence of a 'run' component
5625 pp_add_component run
5626 : >> $pp_wrkdir/%files.run
5628 if test -z "$pp_rpm_arch"; then
5629 pp_error "Unknown RPM architecture"
5633 #-- Write the header components of the RPM spec file
5634 cat <<-. >>$specfile
5635 Name: ${pp_rpm_name:-$name}
5636 Version: ${pp_rpm_version:-$version}
5637 Release: ${pp_rpm_release:-1}
5638 Summary: ${pp_rpm_summary:-$summary}
5639 Group: ${pp_rpm_group}
5640 License: ${pp_rpm_license}
5642 if test -n "$pp_rpm_url"; then
5643 pp_rpm_label "URL" "$pp_rpm_url" >>$specfile
5645 pp_rpm_label "Vendor" "${pp_rpm_vendor:-$vendor}" >>$specfile
5646 pp_rpm_label "Packager" "$pp_rpm_packager" >>$specfile
5647 pp_rpm_label "Provides" "$pp_rpm_provides" >>$specfile
5648 pp_rpm_label "Requires" "$pp_rpm_requires" >>$specfile
5650 test -n "$pp_rpm_serial" && pp_warn "pp_rpm_serial deprecated"
5651 if test -n "$pp_rpm_epoch"; then
5652 #-- Epoch was introduced in RPM 2.5.6
5653 case `$pp_rpm_rpmbuild --version 2>/dev/null` in
5654 1.*|2.[0-5].*|2.5.[0-5])
5655 pp_rpm_label "Serial" $pp_rpm_epoch >>$specfile;;
5657 pp_rpm_label "Epoch" $pp_rpm_epoch >>$specfile;;
5661 if test -n "$pp_rpm_requires"; then
5662 pp_rpm_label "Requires" "$pp_rpm_requires" >>$specfile
5663 elif test -s $pp_wrkdir/%depend.run; then
5664 pp_rpm_depend < $pp_wrkdir/%depend.run >> $specfile
5666 if test -s $pp_wrkdir/%conflict.run; then
5667 pp_rpm_conflict < $pp_wrkdir/%conflict.run >> $specfile
5670 pp_rpm_override_requires >> $specfile
5672 cat <<-. >>$specfile
5675 ${pp_rpm_description:-$description}
5678 for cmp in $pp_components; do
5681 dev) _summary="development tools for $pp_rpm_summary"
5682 _group="$pp_rpm_dev_group"
5683 _desc="${pp_rpm_dev_description:-Development libraries for $name. $pp_rpm_description.}"
5685 doc) _summary="documentation for $pp_rpm_summary"
5686 _group="$pp_rpm_doc_group"
5687 _desc="${pp_rpm_doc_description:-Documentation for $name. $pp_rpm_description.}"
5689 dbg) _summary="diagnostic tools for $pp_rpm_summary"
5690 _group="$pp_rpm_dbg_group"
5691 _desc="${pp_rpm_dbg_description:-Diagnostic tools for $name.}"
5695 _subname=`pp_rpm_subname $cmp`
5699 Summary: $name $_summary
5702 eval '_pkg="$pp_rpm_'$cmp'_requires"'
5703 if test -n "$_pkg"; then
5704 eval pp_rpm_label Requires ${pp_rpm_name:-$name} $_pkg
5705 elif test -s $pp_wrkdir/%depend.$cmp; then
5706 pp_rpm_depend < $pp_wrkdir/%depend.$cmp >> $specfile
5708 if test -s $pp_wrkdir/%conflict.$cmp; then
5709 pp_rpm_conflict < $pp_wrkdir/%conflict.$cmp >> $specfile
5712 eval '_pkg="$pp_rpm_'$cmp'_provides"'
5713 eval pp_rpm_label Provides $_pkg
5717 %description $_subname
5722 #-- NB: we don't put any %prep, %build or %install RPM sections
5723 # into the spec file.
5725 #-- add service start/stop code
5726 if test -n "$pp_services"; then
5727 pp_rpm_service_install_common >> $pp_wrkdir/%post.run
5729 #-- record the uninstall commands in reverse order
5730 for svc in $pp_services; do
5731 pp_load_service_vars $svc
5733 pp_rpm_service_make_init_script $svc
5735 #-- append %post code to install the svc
5736 pp_rpm_service_install $svc >> $pp_wrkdir/%post.run
5738 #-- prepend %preun code to uninstall svc
5739 # (use files in case vars are modified)
5740 pp_rpm_service_remove $svc | pp_prepend $pp_wrkdir/%preun.run
5742 pp_rpm_service_remove_common | pp_prepend $pp_wrkdir/%preun.run
5745 # make convenience service groups
5746 if test -n "$pp_service_groups"; then
5747 for grp in $pp_service_groups; do
5748 pp_rpm_service_group_make_init_script \
5749 $grp "`pp_service_get_svc_group $grp`"
5753 #-- Write the RPM %file sections
5754 # (do this after services, since services adds to %files.run)
5755 for cmp in $pp_components; do
5756 _subname=`pp_rpm_subname $cmp`
5758 if test -s $pp_wrkdir/%check.$cmp; then
5760 echo "%pre $_subname"
5761 cat $pp_wrkdir/%check.$cmp
5762 echo : # causes script to exit true by default
5765 if test -s $pp_wrkdir/%files.$cmp; then
5767 echo "%files $_subname"
5768 pp_rpm_writefiles < $pp_wrkdir/%files.$cmp
5771 if test -n "$pp_rpm_ghost"; then
5772 for ghost in $pp_rpm_ghost; do
5773 echo "%ghost $ghost"
5777 if test -s $pp_wrkdir/%pre.$cmp; then
5779 echo "%pre $_subname"
5780 cat $pp_wrkdir/%pre.$cmp
5781 echo : # causes script to exit true
5784 if test -s $pp_wrkdir/%post.$cmp; then
5786 echo "%post $_subname"
5787 cat $pp_wrkdir/%post.$cmp
5788 echo : # causes script to exit true
5791 if test -s $pp_wrkdir/%preun.$cmp; then
5793 echo "%preun $_subname"
5794 cat $pp_wrkdir/%preun.$cmp
5795 echo : # causes script to exit true
5798 if test -s $pp_wrkdir/%postun.$cmp; then
5800 echo "%postun $_subname"
5801 cat $pp_wrkdir/%postun.$cmp
5802 echo : # causes script to exit true
5806 #-- create a suitable work area for rpmbuild
5807 cat <<-. >$pp_wrkdir/.rpmmacros
5809 # XXX Note escaped %% for use in headerSprintf
5810 %_rpmfilename %%{ARCH}/%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
5812 mkdir $pp_wrkdir/RPMS
5813 mkdir $pp_wrkdir/BUILD
5815 if test x"$pp_rpm_arch" = x"auto"; then
5816 #-- Reduce the arch_seen list to exactly one item
5817 case "$pp_rpm_arch_seen" in
5818 "i386 x86_64"|"x86_64 i386")
5819 pp_rpm_arch_seen=x86_64;;
5820 *"s390 s390x"* | *"s390x s390"* )
5821 pp_rpm_arch_seen=s390x;;
5823 pp_error "detected multiple targets: $pp_rpm_arch_seen"
5824 pp_rpm_arch_seen=unknown;; # not detected
5826 pp_warn "detected no binaries: using target noarch"
5827 pp_rpm_arch_seen=noarch;;
5829 pp_debug "detected architecture $pp_rpm_arch_seen"
5831 pp_rpm_arch="$pp_rpm_arch_seen"
5836 $pp_opt_debug && cat $specfile
5838 pp_debug "creating: `pp_backend_rpm_names`"
5840 pp_debug "pp_rpm_arch_seen = <${pp_rpm_arch_seen}>"
5841 pp_debug "pp_rpm_arch = <${pp_rpm_arch}>"
5845 $pp_rpm_rpmbuild -bb \
5846 --buildroot="$pp_destdir/" \
5847 --target="${pp_rpm_arch}" \
5848 --define='_unpackaged_files_terminate_build 0' \
5849 --define='_use_internal_dependency_generator 0' \
5850 `$pp_opt_debug && echo --verbose || echo --quiet` \
5851 $pp_rpm_rpmbuild_extra_flags \
5853 pp_error "Problem creating RPM packages"
5855 for f in `pp_backend_rpm_names`; do
5856 # The package might be in an arch-specific subdir
5858 for dir in $pp_wrkdir/RPMS/${pp_rpm_arch} $pp_wrkdir/RPMS; do
5859 if test -f $dir/$f; then
5863 if test x"$pkgfile" = x"not-found"; then
5864 pp_error "Problem predicting RPM filename: $f"
5866 ln $pkgfile $pp_wrkdir/$f
5871 pp_rpm_output_name () {
5872 echo "${pp_rpm_name:-$name}`pp_rpm_subname "$1" -`-${pp_rpm_version:-$version}-${pp_rpm_release:-1}.${pp_rpm_arch}.rpm"
5875 pp_backend_rpm_names () {
5877 for cmp in $pp_components; do
5878 pp_rpm_output_name $cmp
5882 pp_backend_rpm_cleanup () {
5886 pp_rpm_print_requires () {
5887 local _subname _name
5889 echo "CPU:$pp_rpm_arch"
5890 ## XXX should be lines of the form (from file/ldd/objdump)
5892 # RTLD:libc.so.4:open
5893 rpm -q --requires -p $pp_wrkdir/`pp_rpm_output_name $1` |sed -e '/^rpmlib(/d;s/ //g;s/^/RPM:/' | sort -u
5896 pp_backend_rpm_install_script () {
5900 pp_install_script_common
5906 if test x"\$1" = x"--only-installed"; then
5907 #-- only print if installation detected
5913 test x"\$*" = x"all" &&
5914 set -- $pp_components
5919 for cmp in $pp_components; do
5920 _subname=`pp_rpm_subname $cmp -`
5921 echo "$cmp) name=${pp_rpm_name:-$name}${_subname};;"
5926 if \$oi || rpm -q "\$name" >/dev/null 2>/dev/null; then
5933 cmp_to_pathname () {
5934 test x"\$*" = x"all" &&
5935 set -- $pp_components
5940 for cmp in $pp_components; do
5941 echo "$cmp) echo \${PP_PKGDESTDIR:-.}/`pp_rpm_output_name $cmp` ;;"
5950 test x"\$*" = x"all" &&
5951 set -- $pp_components
5956 for cmp in $pp_components; do
5957 echo "$cmp) cat <<'._end'"
5958 pp_rpm_print_requires $cmp
5959 echo "._end"; echo ';;'
5967 test \$# -eq 0 && usage
5971 test \$# -eq 0 || usage \$op
5975 test \$# -eq 0 || usage \$op
5979 test \$# -ge 1 || usage \$op
5980 cmp_to_pathname "\$@"
5983 test \$# -ge 1 || usage \$op
5984 verbose rpm -U --replacepkgs --oldpackage \
5985 \`cmp_to_pathname "\$@"\`
5988 test \$# -ge 1 || usage \$op
5989 pkgs=\`cmp_to_pkgname --only-installed "\$@"\`
5990 if test -z "\$pkgs"; then
5991 verbosemsg "nothing to uninstall"
5993 verbose rpm -e \$pkgs
5997 test \$# -ge 1 || usage \$op
6001 verbose /etc/init.d/\$svc \$op || ec=1
6006 test \$# -eq 0 || usage \$op
6007 echo "linux-${pp_rpm_arch}"
6010 test \$# -ge 1 || usage \$op
6011 print_requires "\$@"
6021 pp_backend_rpm_probe () {
6022 echo "${pp_rpm_distro}-${pp_rpm_arch_std}"
6025 pp_backend_rpm_vas_platforms () {
6026 case "$pp_rpm_arch_std" in
6027 x86_64) echo "linux-x86_64.rpm linux-x86.rpm";;
6028 *86) echo "linux-x86.rpm";;
6029 s390) echo "linux-s390";;
6030 s390x) echo "linux-s390x";;
6031 ppc*) echo "linux-glibc23-ppc64 linux-glibc22-ppc64";;
6032 ia64) echo "linux-ia64";;
6033 *) pp_die "unknown architecture $pp_rpm_arch_std";;
6037 pp_rpm_service_install_common () {
6040 _pp_install_service () {
6043 if [ -x /usr/lib/lsb/install_initd -a ! -r /etc/redhat-release ]
6046 /usr/lib/lsb/install_initd /etc/init.d/$svc &> /dev/null
6047 elif [ -x /sbin/chkconfig ]; then
6048 # Red Hat/chkconfig-style install
6049 /sbin/chkconfig --add $svc &> /dev/null
6050 /sbin/chkconfig $svc off &> /dev/null
6052 : # manual links under /etc/init.d
6056 _pp_enable_service () {
6059 if [ -x /usr/lib/lsb/install_initd -a ! -r /etc/redhat-release ]
6062 : # not sure how to enable
6063 elif [ -x /sbin/chkconfig ]; then
6064 # Red Hat/chkconfig-style install
6065 /sbin/chkconfig $svc on &> /dev/null
6068 set -- `sed -n -e 's/^# Default-Start://p' /etc/init.d/$svc`
6069 start_priority=`sed -n -e 's/^# X-Quest-Start-Priority:[[:space:]]*//p' /etc/init.d/$svc`
6070 stop_priority=`sed -n -e 's/^# X-Quest-Stop-Priority:[[:space:]]*//p' /etc/init.d/$svc`
6072 # Provide default start & stop priorities of 20 & 80 in
6073 # accordance with Debian update-rc.d defaults
6074 if [ -z "$start_priority" ]; then
6077 if [ -z "$stop_priority" ]; then
6081 if [ -d "/etc/rc.d" ];then
6088 do ln -sf /etc/init.d/$svc $rcdir/rc$level.d/S$start_priority$svc; done
6089 set -- `sed -n -e 's/^# Default-Stop://p' /etc/init.d/$svc`
6091 do ln -sf /etc/init.d/$svc $rcdir/rc$level.d/K$stop_priority$svc; done
6097 pp_rpm_service_remove_common () {
6100 _pp_remove_service () {
6103 /etc/init.d/$svc stop >/dev/null 2>&1
6104 if [ -x /usr/lib/lsb/remove_initd -a ! -r /etc/redhat-release ]
6106 /usr/lib/lsb/remove_initd /etc/init.d/$svc &> /dev/null
6107 elif [ -x /sbin/chkconfig ]; then
6108 /sbin/chkconfig --del $svc &> /dev/null
6110 if [ -d "/etc/rc.d" ];then
6116 rm -f $rcdir/rc?.d/[SK]??$svc
6123 pp_rpm_service_install () {
6124 pp_rpm_service_make_init_script $1 >/dev/null ||
6125 pp_error "could not create init script for service $1"
6126 echo "_pp_install_service $1"
6127 test $enable = yes && echo "_pp_enable_service $1"
6130 pp_rpm_service_remove () {
6132 if [ "\$1" = "remove" -o "\$1" = "0" ]; then
6133 # only remove the service if not upgrade
6134 _pp_remove_service $1
6140 pp_backend_rpm_init_svc_vars () {
6143 start_runlevels=${pp_rpm_default_start_runlevels-"2 3 4 5"} # == lsb default-start
6144 stop_runlevels=${pp_rpm_default_stop_runlevels-"0 1 6"} # == lsb default-stop
6145 svc_description="${pp_rpm_default_svc_description}" # == lsb short descr
6148 lsb_required_start='$local_fs $network'
6154 stop_priority=50 #-- stop_priority = 100 - start_priority
6157 pp_rpm_service_group_make_init_script () {
6160 local script=/etc/init.d/$grp
6161 local out=$pp_destdir$script
6163 pp_add_file_if_missing $script run 755 || return 0
6172 #-- prints usage message
6174 echo "usage: $0 {start|stop|status|restart|reload|condrestart|try-restart|force-reload}" >&2
6178 #-- starts services in order.. stops them all if any break
6181 for svc in $svcs; do
6182 if /etc/init.d/$svc start; then
6185 if test -n "$undo"; then
6186 for svc in $undo; do
6187 /etc/init.d/$svc stop
6196 #-- stops services in reverse
6199 for svc in $svcs; do
6200 reverse="$svc $reverse"
6203 for svc in $reverse; do
6204 /etc/init.d/$svc stop || rc=$?
6209 #-- returns true only if all services return true status
6212 for svc in $svcs; do
6213 /etc/init.d/$svc status || rc=$?
6220 for svc in $svcs; do
6221 /etc/init.d/$svc reload || rc=$?
6229 restart) pp_stop; pp_start;;
6231 try-restart|condrestart)
6232 if pp_status >/dev/null; then
6236 force-reload) if pp_status >/dev/null; then
6247 pp_rpm_service_make_init_script () {
6249 local script=/etc/init.d/$svc
6250 local out=$pp_destdir$script
6251 local _process _cmd _rpmlevels
6253 pp_add_file_if_missing $script run 755 || return 0
6255 #-- start out as an empty shell script
6260 #-- determine the process name from $cmd unless $svc_process is given
6262 _process=${svc_process:-"$1"}
6264 #-- construct a start command that builds a pid file if needed
6266 if test -z "$pidfile"; then
6267 pidfile=/var/run/$svc.pid
6268 _cmd="$cmd & echo \$! > \$pidfile"
6270 if test "$user" != "root"; then
6271 _cmd="su $user -c exec $_cmd";
6274 #-- generate the Red Hat chkconfig headers
6275 _rpmlevels=`echo $start_runlevels | tr -d ' '`
6277 # chkconfig: ${_rpmlevels:--} ${start_priority:-50} ${stop_priority:-50}
6278 # description: ${svc_description:-no description}
6279 # processname: ${_process}
6280 # pidfile: ${pidfile}
6283 #-- generate the LSB init info
6287 # Required-Start: ${lsb_required_start}
6288 # Should-Start: ${lsb_should_start}
6289 # Required-Stop: ${lsb_required_stop}
6290 # Default-Start: ${start_runlevels}
6291 # Default-Stop: ${stop_runlevels}
6292 # Short-Description: ${svc_description}
6294 # Generated by PolyPackage ${pp_version}
6299 if test x"${svc_description}" = x"${pp_rpm_default_svc_description}"; then
6303 #-- write service-specific definitions
6305 #-- definitions specific to service ${svc}
6306 svc_name="${svc_description:-$svc service}"
6308 pidfile="${pidfile}"
6309 stop_signal="${stop_signal}"
6310 reload_signal="${reload_signal}"
6311 pp_exec_cmd () { $_cmd; }
6314 #-- write the generic part of the init script
6317 #-- use system message logging, if available
6318 if [ -f /lib/lsb/init-functions -a ! -r /etc/redhat-release ]; then
6319 . /lib/lsb/init-functions
6320 pp_success_msg () { log_success_msg "$@"; }
6321 pp_failure_msg () { log_failure_msg "$@"; }
6322 pp_warning_msg () { log_warning_msg "$@"; }
6323 elif [ -f /etc/init.d/functions ]; then
6324 . /etc/init.d/functions
6325 pp_success_msg () { echo -n "$*"; success "$@"; echo; }
6326 pp_failure_msg () { echo -n "$*"; failure "$@"; echo; }
6327 pp_warning_msg () { echo -n "$*"; warning "$@"; echo; }
6329 pp_success_msg () { echo ${1:+"$*:"} OK; }
6330 pp_failure_msg () { echo ${1:+"$*:"} FAIL; }
6331 pp_warning_msg () { echo ${1:+"$*:"} WARNING; }
6334 #-- prints a status message
6335 pp_msg () { echo -n "$*: "; }
6337 #-- prints usage message
6339 echo "usage: $0 {start|stop|status|restart|reload|condrestart|try-restart|force-reload}" >&2
6343 #-- reloads the service, if possible
6344 # returns 0=success 1=failure 3=unimplemented
6346 test -n "$reload_signal" || return 3 # unimplemented
6347 pp_msg "Reloading ${svc_name}"
6348 if pp_signal -${reload_signal}; then
6352 pp_failure_msg "not running"
6357 #-- delivers signal $1 to the pidfile
6358 # returns 0=success 1=failure
6360 if test -r "$pidfile"; then
6362 kill "$@" "$pid" 2>/dev/null
6368 #-- prints information about the service status
6369 # returns 0=running 1=crashed 3=stopped
6371 pp_msg "Checking for ${svc_name}"
6372 if pp_signal -0; then
6373 pp_success_msg "running"
6375 elif test -r "$pidfile"; then
6376 pp_failure_msg "not running (crashed)"
6379 pp_failure_msg "not running"
6384 #-- starts the service
6385 # returns 0=success 1=failure
6387 pp_msg "Starting ${svc_name}"
6388 if pp_status >/dev/null; then
6389 pp_warning_msg "already started"
6391 elif pp_exec_cmd; then
6395 pp_failure_msg "cannot start"
6400 #-- stops the service
6401 # returns 0=success (always)
6403 pp_msg "Stopping ${svc_name}"
6404 if pp_signal -${stop_signal}; then
6407 pp_success_msg "already stopped"
6413 #-- stops and starts the service
6422 restart) pp_restart;;
6424 try-restart|condrestart)
6425 if pp_status >/dev/null; then
6429 force-reload) if pp_status >/dev/null; then
6440 pp_backend_rpm_function () {
6442 pp_mkgroup) cat<<'.';;
6443 /usr/sbin/groupadd -f -r "$1"
6445 pp_mkuser:depends) echo pp_mkgroup;;
6446 pp_mkuser) cat<<'.';;
6447 pp_mkgroup "${2:-$1}" || return 1
6450 -M -d "${3:-/nonexistent}" \
6451 -s "${4:-/bin/false}" \
6454 pp_havelib) cat<<'.';;
6455 for pp_tmp_dir in `echo "/usr/lib:/lib${3:+:$3}" | tr : ' '`; do
6456 test -r "$pp_tmp_dir/lib$1.so{$2:+.$2}" && return 0
6466 # creating a dmg file for publishing on the web
6467 hdiutil create -srcfolder /path/foo foo.dmg
6468 hdiutil internet-enable -yes /path/foo.dmg
6469 # Layout for packages
6470 <name>-<cpy>/component/<file>
6471 <name>-<cpt>/extras/postinstall
6472 <name>-<cpt>/extras/postupgrade
6473 # /Developer/usr/bin/packagemaker (man packagemaker)
6475 Make a bunch of packages, and then build a 'distribution'
6476 which is only understood by macos>10.4
6478 # Message files in the resource path used are
6479 Welcome.{rtf,html,rtfd,txt} - limited text shown in Intro
6480 ReadMe.{rtf,html,rtfd,txt} - scrollable/printable, after Intro
6481 License.{rtf,html,rtfd,txt} - ditto, user must click 'Accept'
6482 background.{jpg,tif,gif,pict,eps,pdf} 620x418 background image
6484 # These scripts looked for in the resource path
6485 InstallationCheck $pkgpath $defaultloc $targetvol
6486 0:ok 32:warn 32+x:warn[1] 64:stop 96+x:stop[2]
6487 VolumeCheck $volpath
6488 0:ok 32:failure 32+x:failure[3]
6489 preflight $pkgpath $targetloc $targetvol [priv]
6490 preinstall $pkgpath $targetloc $targetvol [priv]
6491 preupgrade $pkgpath $targetloc $targetvol [priv]
6492 postinstall $pkgpath $targetloc $targetvol [priv]
6493 postupgrade $pkgpath $targetloc $targetvol [priv]
6494 postflight $pkgpath $targetloc $targetvol [priv]
6495 0:ok else fail (for all scripts)
6497 A detailed reason is deduced by finding an index x (16..31)
6498 in the file InstallationCheck.strings or VolumeCheck.strings.
6500 Scripts marked [priv] are executed with root privileges.
6501 None of the [priv] scripts are used by metapackages.
6503 # Default permissions
6504 Permissions of existing directories should match those
6505 of a clean install of the OS; typically root:admin 0775
6506 New directories or files should be 0775 or 0664 with the
6507 appropriate user:group.
6509 /etc root:admin 0755
6510 /var root:admin 0755
6512 <http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution4/Concepts/sd_pkg_flags.html>
6514 CFBundleGetInfoString: "1.2.3, Quest Software, Inc.",
6515 CFBundleIdentifier: "com.quest.rc.openssh",
6516 CFBundleShortVersionString: "1.2.3",
6519 IFPkgFlagAllowBackRev: false,
6520 IFPkgFlagAuthorizationAction: "AdminAuthorization",
6521 IFPkgFlagDefaultLocation: "/",
6522 IFPkgFlagFollowLinks: true,
6523 IFPkgFlagInstallFat: false,
6524 IFPkgFlagInstalledSize: <integer>, # this is added by packagemaker
6525 IFPkgFlagIsRequired: false,
6526 IFPkgFlagOverwritePermissions: false,
6527 IFPkgFlagRelocatable: false,
6528 IFPkgFlagRestartAction: "NoRestart",
6529 IFPkgFlagRootVolumeOnly: false,
6530 IFPkgFlagUpdateInstalledLanguages: false,
6531 IFPkgFormatVersion= 0.10000000149011612,
6532 IFRequirementDicts: [ {
6534 SpecArgument = "/opt/quest/lib/libvas.4.2.0.dylib",
6537 TestOperator = "eq", } ]
6540 Description.plist = {
6541 IFPkgDescriptionDescription = "this is the description text",
6542 IFPkgDescriptionTitle = "quest-openssh"
6546 'launchd' is a kind of combined inetd and rc/init.d system.
6547 <http://developer.apple.com/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/DesigningDaemons.html>
6548 Create a /Library/LaunchDaemons/$daemonname.plist file
6549 Examples found in /System/Library/LaunchDaemons/
6550 See manual page launchd.plist(5) for details:
6552 { Label: "com.quest.rc.foo", # required
6553 Program: "/sbin/program",
6554 ProgramArguments: [ "/sbin/program", "arg1", "arg2" ], # required
6556 WatchPaths: [ "/etc/crontab" ],
6557 QueueDirectories: [ "/var/cron/tabs" ],
6558 inetdCompatibility: { Wait: false }, # inetd-only
6559 OnDemand: false, # recommended
6560 SessionCreate: true,
6563 Sockets: { # inetd only
6565 SockServiceName: "ssh",
6566 Bonjour: ["ssh", "sftp-ssh"], } },
6568 StandardErrorPath: "/dev/null",
6572 How to add a new user
6573 dscl . -create /Users/$user
6574 dscl . -create /Users/$user UserShell /bin/bash
6575 dscl . -create /Users/$user RealName "$user"
6576 dscl . -create /Users/$user UniqueID $uid
6577 dscl . -create /Users/$user PrimaryGroupID $gid
6578 dscl . -create /Users/$user NFSHomeDirectory /Users/$user
6579 dscl . -passwd /Users/$user "$passwd"
6581 chown $uid.$gid /Users/$user
6586 pp_platforms="$pp_platforms macos"
6588 pp_backend_macos_detect () {
6589 [ x"$1" = x"Darwin" ]
6592 pp_backend_macos_init () {
6593 pp_macos_default_bundle_id_prefix="com.quest.rc."
6595 pp_macos_bundle_vendor=
6596 pp_macos_bundle_version=
6597 pp_macos_bundle_info_string=
6598 pp_macos_pkg_type=bundle
6599 pp_macos_pkg_license=
6600 pp_macos_pkg_readme=
6601 pp_macos_pkg_welcome=
6603 pp_macos_installer_plugin=
6604 # OS X puts the library version *before* the .dylib extension
6605 pp_shlib_suffix='*.dylib'
6611 while test $# -gt 0; do
6614 start-plist) cat <<-.; in=" "; shift ;;
6615 <?xml version="1.0" encoding="UTF-8"?>
6616 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
6617 <plist version="1.0">
6619 end-plist) echo "</plist>"; in=; shift;;
6621 '[') echo "$in<array>"; in="$in "; shift;;
6622 ']') echo "$in</array>"; in="${in# }"; shift;;
6623 '{') echo "<dict>"; in="$in "; shift;;
6624 '}') echo "</dict>"; in="${in# }"; shift;;
6625 key) shift; echo "$in<key>$1</key>"; shift;;
6627 echo "$1" | sed -e 's/&/&/g;s/</\</g;s/>/\>/g;' \
6628 -e 's/^/'"$in"'<string>/;s/$/<\/string>/';
6630 true) echo "$in<true/>"; shift;;
6631 false) echo "$in<false/>"; shift;;
6632 real) shift; echo "$in<real>$1</real>"; shift;;
6633 integer) shift; echo "$in<integer>$1</integer>"; shift;;
6634 date) shift; echo "$in<date>$1</date>"; shift;; # ISO 8601 format
6635 data) shift; echo "$in<data>$1</data>"; shift;; # base64 encoded
6636 *) pp_error "pp_macos_plist: bad argument '$1'"; shift;;
6641 pp_macos_rewrite_cpio () {
6643 script=$pp_wrkdir/cpio-rewrite.pl
6647 # Filter a cpio file, applying the user/group/mode specified in %files
6649 # A CPIO header block has octal fields at the following offset/lengths:
6659 # 59 6 namesize (including NUL terminator)
6667 # set %uid, %gid, %mode based on %files
6668 my (%uid, %gid, %mode, %users, %groups);
6669 my %type_map = ( d => 0040000, f => 0100000, s => 0120000 );
6671 my ($type,$mode,$uid,$gid,$flags,$name) =
6672 m/^(.) (\S+) (\S+) (\S+) (\S+) (\S+)/;
6673 $mode = $type eq "f" ? "0644" : "0755" if $mode eq "-";
6674 $uid = 0 if $uid eq "-";
6675 $gid = 0 if $gid eq "-";
6676 if ($uid ne "=" and $uid =~ m/\D/) {
6677 unless (exists $users{$uid}) {
6678 my @pw = getpwnam($uid) or die "bad username '$uid'";
6679 $users{$uid} = $pw[2];
6681 $uid = $users{$uid};
6683 if ($gid ne "=" and $gid =~ m/\D/) {
6684 unless (exists $groups{$gid}) {
6685 my @gr = getgrnam($gid) or die "bad group'$gid'";
6686 $groups{$gid} = $gr[2];
6688 $gid = $groups{$gid};
6690 $name =~ s:/$:: if $type eq "d";
6691 $name = ".".$name."\0";
6692 $uid{$name} = sprintf("%06o",int($uid)) unless $uid eq "=";
6693 $gid{$name} = sprintf("%06o",int($gid)) unless $gid eq "=";
6694 $mode{$name} = sprintf("%06o",oct($mode)|$type_map{$type}) unless $mode eq "=";
6698 # parse the cpio file
6700 while (read(STDIN, my $header, $hdrlen)) {
6701 my ($name, $namesize, $filesize);
6703 if ($header =~ m/^07070[12]/) {
6704 # SVR4 ASCII format, convert to ODC
6705 if ($hdrlen == 76) {
6706 # Read in rest of header and update header len for SVR4
6707 read(STDIN, $header, 110 - 76, 76);
6710 my $ino = hex(substr($header, 6, 8)) & 0x3ffff;
6711 my $mode = hex(substr($header, 14, 8)) & 0x3ffff;
6712 my $uid = hex(substr($header, 22, 8)) & 0x3ffff;
6713 my $gid = hex(substr($header, 30, 8)) & 0x3ffff;
6714 my $nlink = hex(substr($header, 38, 8)) & 0x3ffff;
6715 my $mtime = hex(substr($header, 46, 8)) & 0xffffffff;
6716 $filesize = hex(substr($header, 54, 8)) & 0xffffffff;
6717 my $dev_maj = hex(substr($header, 62, 8));
6718 my $dev_min = hex(substr($header, 70, 8));
6719 my $dev = &makedev($dev_maj, $dev_min) & 0x3ffff;
6720 my $rdev_maj = hex(substr($header, 78, 8));
6721 my $rdev_min = hex(substr($header, 86, 8));
6722 my $rdev = &makedev($rdev_maj, $rdev_min) & 0x3ffff;
6723 $namesize = hex(substr($header, 94, 8)) & 0x3ffff;
6724 read(STDIN, $name, $namesize);
6725 # Header + name is padded to a multiple of 4 bytes
6726 my $namepad = (($hdrlen + $namesize + 3) & 0xfffffffc) - ($hdrlen + $namesize);
6727 read(STDIN, my $padding, $namepad) if ($namepad);
6728 # File data is padded to be a multiple of 4 bytes
6729 $filepad = (($filesize + 3) & 0xfffffffc) - $filesize;
6731 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);
6732 $header = $new_header;
6733 } elsif ($header =~ m/^070707/) {
6734 # POSIX Portable ASCII Format
6735 $namesize = oct(substr($header, 59, 6));
6736 $filesize = oct(substr($header, 65, 11));
6737 read(STDIN, $name, $namesize);
6741 # update uid, gid and mode (already in octal)
6742 substr($header, 24, 6) = $uid{$name} if exists $uid{$name};
6743 substr($header, 30, 6) = $gid{$name} if exists $gid{$name};
6744 substr($header, 18, 6) = $mode{$name} if exists $mode{$name};
6745 print($header, $name);
6746 # check for trailer at EOF
6747 last if $filesize == 0 && $name =~ /^TRAILER!!!\0/;
6748 # copy-through the file data
6749 while ($filesize > 0) {
6751 $seg = $filesize if $filesize < $seg;
6752 read(STDIN, my $data, $seg);
6756 # If file data is padded, skip it
6757 read(STDIN, my $padding, $filepad) if ($filepad);
6759 # pass through any padding at the end (blocksize-dependent)
6761 my $numread = read(STDIN, my $data, 8192);
6762 last unless $numread;
6768 (((($_[0] & 0xff)) << 24) | ($_[1] & 0xffffff));
6772 # Append to the script the %files data
6773 cat "$@" </dev/null >> $script
6774 /usr/bin/perl $script || pp_error "pp_macos_rewrite_cpio error";
6777 pp_macos_files_bom () {
6778 typeset _l t m o g f p st owner
6779 while read t m o g f p st; do
6780 # make sure that $m is padded up to 4 digits long
6785 ?????*) pp_error "pp_macos_writebom: mode '$m' too long";;
6788 # convert owner,group into owner/group in octal
6789 case $o in -) o=0;; esac
6790 case $g in -) g=0;; esac
6791 owner=`pp_d2o $o`/`pp_d2o $g`
6795 test x"$m" = x"000-" && m=0644
6796 echo ".$p 10$m $owner `
6797 /usr/bin/cksum < "${pp_destdir}$p" |
6798 awk '{print $2 " " $1}'`"
6801 test x"$m" = x"000-" && m=0755
6802 echo ".${p%/} 4$m $owner"
6805 test x"$m" = x"000-" && m=0755
6806 rl=`/usr/bin/readlink "${pp_destdir}$p"`
6807 #test x"$rl" = x"$st" ||
6808 # pp_error "symlink mismatch $rl != $st"
6809 echo ".$p 12$m $owner `
6810 /usr/bin/readlink -n "${pp_destdir}$p" |
6812 awk '{print $2 " " $1}'` $st"
6818 pp_macos_bom_fix_parents () {
6820 sub dirname { my $d=shift; $d=~s,/[^/]*$,,; $d; }
6821 sub chk { my $d=shift;
6822 &chk(&dirname($d)) if $d =~ m,/,;
6823 unless ($seen{$d}++) {
6824 # Make sure we do not override system directories
6825 if ($d =~ m:^\./(etc|var)$:) {
6826 my $tgt = "private/$1";
6827 my ($sum, $len) = split(/\s+/, `/usr/bin/printf "$tgt" | /usr/bin/cksum /dev/stdin`);
6828 print "$d\t120755\t0/0\t$len\t$sum\t$tgt\n";
6829 } elsif ($d eq "." || $d eq "./Library") {
6830 print "$d\t41775\t0/80\n";
6831 } elsif ($d eq "./Applications" || $d eq "./Developer") {
6832 print "$d\t40775\t0/80\n";
6834 print "$d\t40755\t0/0\n";
6839 if (oct($2) & 040000) {
6840 $seen{$1}++; # directory
6842 &chk(&dirname($1));'
6845 pp_macos_files_size () {
6846 typeset _l t m o g f p st owner
6847 while read t m o g f p st; do
6849 f) wc -c < "${pp_destdir}$p";;
6851 d) ;; # always seems to be zero
6853 done | awk '{n+=1+int($1/4096)} END {print n*4}'
6857 awk 'BEGIN { x=0; '`echo "$1" |
6858 sed -e 's/./x=x*8+&;/g'`'print x;}' </dev/null
6863 *) awk 'BEGIN { printf("%o\n", 0+('"$1"'));}' < /dev/null;;
6868 #/usr/bin/mkbom -i $1 $2
6869 typeset path mode ugid size cksum linkpath
6872 # Use mkbom if it understands -i (avoids a copy)
6873 if /usr/bin/mkbom -i /dev/null "$2" 2>/dev/null; then
6875 /usr/bin/mkbom -i "$1" "$2"
6879 # On 10.4 we have this nonsense.
6880 pp_warn "mkbom workaround: copying source files to staging area"
6882 bomstage=$pp_wrkdir/bom_stage
6883 $pp_macos_sudo /bin/mkdir "$bomstage"
6884 while IFS=' ' read path mode ugid size cksumi linkpath; do
6885 if test -h "$pp_destdir/$path"; then
6886 $pp_macos_sudo /bin/ln -s "$linkpath" "$bomstage/$path"
6888 if test -d "$pp_destdir/$path"; then
6889 $pp_macos_sudo /bin/mkdir -p "$bomstage/$path"
6891 $pp_macos_sudo /bin/cp "$pp_destdir/$path" "$bomstage/$path"
6893 $pp_macos_sudo /bin/chmod $mode "$bomstage/$path"
6894 $pp_macos_sudo /usr/sbin/chown `echo $ugid| tr / :` "$bomstage/$path"
6897 (cd $bomstage && $pp_macos_sudo mkbom . $pp_wrkdir/bom_stage.bom) ||
6898 pp_error "mkbom failed"
6899 $pp_macos_sudo mv $pp_wrkdir/bom_stage.bom "$2"
6902 pp_backend_macos () {
6903 : ${pp_macos_bundle_id:=$pp_macos_default_bundle_id_prefix$name}
6904 case "$pp_macos_pkg_type" in
6905 bundle) pp_backend_macos_bundle;;
6906 flat) pp_backend_macos_flat;;
6907 *) pp_error "unsupported package type $pp_macos_pkg_type";;
6911 pp_backend_macos_bundle () {
6912 typeset pkgdir Contents Resources lprojdir svc
6913 typeset Info_plist Description_plist
6914 typeset bundle_vendor bundle_version size cmp filelists
6916 mac_version=`sw_vers -productVersion`
6917 bundle_vendor=${pp_macos_bundle_vendor:-$vendor}
6919 if test -z "$pp_macos_bundle_version"; then
6920 bundle_version=`echo "$version.0.0.0" | sed -n -e 's/[^0-9.]//g' \
6921 -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'`
6923 bundle_version="$pp_macos_bundle_version"
6925 source_version=`echo $version | sed 's/.*\.//'`
6927 # build the package layout
6928 pkgdir=$pp_wrkdir/$name.pkg
6929 Contents=$pkgdir/Contents
6930 Resources=$Contents/Resources
6931 lprojdir=$Resources/en.lproj
6932 mkdir $pkgdir $Contents $Resources $lprojdir ||
6933 pp_error "Can't make package temporary directories"
6935 echo "major: 1" > $Resources/package_version
6936 echo "minor: 0" >> $Resources/package_version
6937 echo "pmkrpkg1" > $Contents/PkgInfo
6938 case $mac_version in
6940 xattr -w "com.apple.TextEncoding" "macintosh;0" "$Resources/package_version"
6941 xattr -w "com.apple.TextEncoding" "macintosh;0" "$Contents/PkgInfo"
6945 # Copy welcome file/dir for display at package install time.
6946 if test -n "$pp_macos_pkg_welcome"; then
6948 sfx=`echo "$pp_macos_pkg_welcome"|sed 's/^.*\.\([^\.]*\)$/\1/'`
6950 rtf|html|rtfd|txt) ;;
6953 cp -R ${pp_macos_pkg_welcome} $Resources/Welcome.$sfx
6956 # Copy readme file/dir for display at package install time.
6957 if test -n "$pp_macos_pkg_readme"; then
6959 sfx=`echo "$pp_macos_pkg_readme"|sed 's/^.*\.\([^\.]*\)$/\1/'`
6961 rtf|html|rtfd|txt) ;;
6964 cp -R ${pp_macos_pkg_readme} $Resources/ReadMe.$sfx
6967 # Copy license file/dir for display at package install time.
6968 if test -n "$pp_macos_pkg_license"; then
6970 sfx=`echo "$pp_macos_pkg_license"|sed 's/^.*\.\([^\.]*\)$/\1/'`
6972 rtf|html|rtfd|txt) ;;
6975 cp -R ${pp_macos_pkg_license} $Resources/License.$sfx
6978 # Add services (may modify %files)
6979 for svc in $pp_services .; do
6980 test . = "$svc" && continue
6981 pp_macos_add_service $svc
6984 # Find file lists (%files.* includes ignore files)
6985 for cmp in $pp_components; do
6986 test -f $pp_wrkdir/%files.$cmp && filelists="$filelists${filelists:+ }$pp_wrkdir/%files.$cmp"
6989 # compute the installed size
6990 size=`cat $filelists | pp_macos_files_size`
6992 #-- Create Info.plist
6993 Info_plist=$Contents/Info.plist
6996 key CFBundleGetInfoString string \
6997 "${pp_macos_bundle_info_string:-$version $bundle_vendor}" \
6998 key CFBundleIdentifier string \
6999 "${pp_macos_bundle_id}" \
7000 key CFBundleName string "$name" \
7001 key CFBundleShortVersionString string "$bundle_version" \
7002 key IFMajorVersion integer 1 \
7003 key IFMinorVersion integer 0 \
7004 key IFPkgFlagAllowBackRev false \
7005 key IFPkgFlagAuthorizationAction string "RootAuthorization" \
7006 key IFPkgFlagDefaultLocation string "/" \
7007 key IFPkgFlagFollowLinks true \
7008 key IFPkgFlagInstallFat true \
7009 key IFPkgFlagInstalledSize integer $size \
7010 key IFPkgFlagIsRequired false \
7011 key IFPkgFlagOverwritePermissions true \
7012 key IFPkgFlagRelocatable false \
7013 key IFPkgFlagRestartAction string "NoRestart" \
7014 key IFPkgFlagRootVolumeOnly true \
7015 key IFPkgFlagUpdateInstalledLanguages false \
7016 key IFPkgFlagUseUserMask false \
7017 key IFPkgFormatVersion real 0.10000000149011612 \
7018 key SourceVersion string $source_version \
7019 \} end-plist> $Info_plist
7021 # write en.lproj/Description.plist
7022 Description_plist=$lprojdir/Description.plist
7025 key IFPkgDescriptionDeleteWarning string "" \
7026 key IFPkgDescriptionDescription string "$pp_macos_bundle_info_string" \
7027 key IFPkgDescriptionTitle string "$name" \
7028 key IFPkgDescriptionVersion string "$version" \
7029 \} end-plist > $Description_plist
7031 # write Resources/files
7032 awk '{print $6}' $filelists > $Resources/files
7034 # write package size file
7039 " > $Resources/$name.sizes
7041 # write Resources/preinstall
7042 for cmp in $pp_components; do
7043 if test -s $pp_wrkdir/%pre.$cmp; then
7044 if test ! -s $Resources/preinstall; then
7045 echo "#!/bin/sh" > $Resources/preinstall
7046 chmod +x $Resources/preinstall
7048 cat $pp_wrkdir/%pre.$cmp >> $Resources/preinstall
7049 echo : >> $Resources/preinstall
7053 # write Resources/postinstall
7054 for cmp in $pp_components; do
7055 if test -s $pp_wrkdir/%post.$cmp; then
7056 if test ! -s $Resources/postinstall; then
7057 echo "#!/bin/sh" > $Resources/postinstall
7058 chmod +x $Resources/postinstall
7060 cat $pp_wrkdir/%post.$cmp >> $Resources/postinstall
7061 echo : >> $Resources/postinstall
7065 # write Resources/postupgrade
7066 for cmp in $pp_components; do
7067 if test -s $pp_wrkdir/%postup.$cmp; then
7068 if test ! -s $Resources/postupgrade; then
7069 echo "#!/bin/sh" > $Resources/postupgrade
7070 chmod +x $Resources/postupgrade
7072 cat $pp_wrkdir/%postup.$cmp >> $Resources/postupgrade
7073 echo : >> $Resources/postupgrade
7077 # write Resources/preremove
7078 for cmp in $pp_components; do
7079 if test -s $pp_wrkdir/%preun.$cmp; then
7080 if test ! -s $Resources/preremove; then
7081 echo "#!/bin/sh" > $Resources/preremove
7082 chmod +x $Resources/preremove
7084 cat $pp_wrkdir/%preun.$cmp >> $Resources/preremove
7085 echo : >> $Resources/preremove
7089 # write Resources/postremove
7090 for cmp in $pp_components; do
7091 if test -s $pp_wrkdir/%postun.$cmp; then
7092 if test ! -s $Resources/postremove; then
7093 echo "#!/bin/sh" > $Resources/postremove
7094 chmod +x $Resources/postremove
7096 cat $pp_wrkdir/%postun.$cmp >> $Resources/postremove
7097 echo : >> $Resources/postremove
7101 # write uninstall info
7102 echo "version=$version" > $Resources/uninstall
7103 if [ -n "$pp_macos_requires" ];then
7104 echo "requires=$pp_macos_requires" >> $Resources/uninstall
7109 # Create the bill-of-materials (Archive.bom)
7110 cat $filelists | pp_macos_files_bom | sort |
7111 pp_macos_bom_fix_parents > $pp_wrkdir/tmp.bomls
7113 pp_macos_mkbom $pp_wrkdir/tmp.bomls $Contents/Archive.bom
7115 # Create the cpio archive (Archive.pax.gz)
7118 awk '{ print "." $6 }' $filelists | sed 's:/$::' | sort | /usr/bin/cpio -o | pp_macos_rewrite_cpio $filelists | gzip -9f -c > $Contents/Archive.pax.gz
7121 # Copy installer plugins if any
7122 if test -n "$pp_macos_installer_plugin"; then
7123 if test ! -f "$pp_macos_installer_plugin/InstallerSections.plist"; then
7124 pp_error "Missing InstallerSections.plist file in $pp_macos_installer_plugin"
7126 mkdir -p $pkgdir/Plugins
7127 cp -R "$pp_macos_installer_plugin"/* $pkgdir/Plugins
7130 test -d $pp_wrkdir/bom_stage && $pp_macos_sudo rm -rf $pp_wrkdir/bom_stage
7132 rm -f ${name}-${version}.dmg
7133 hdiutil create -fs HFS+ -srcfolder $pkgdir -volname $name ${name}-${version}.dmg
7136 pp_backend_macos_flat () {
7137 typeset pkgdir bundledir Resources lprojdir svc
7138 typeset Info_plist Description_plist
7139 typeset bundle_vendor bundle_version size numfiles cmp filelists
7141 mac_version=`sw_vers -productVersion`
7142 bundle_vendor=${pp_macos_bundle_vendor:-$vendor}
7144 if test -z "$pp_macos_bundle_version"; then
7145 bundle_version=`echo "$version.0.0.0" | sed -n -e 's/[^0-9.]//g' \
7146 -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'`
7148 bundle_version="$pp_macos_bundle_version"
7150 source_version=`echo $version | sed 's/.*\.//'`
7152 # build the flat package layout
7153 pkgdir=$pp_wrkdir/pkg
7154 bundledir=$pp_wrkdir/pkg/$name.pkg
7155 Resources=$pkgdir/Resources
7156 lprojdir=$Resources/en.lproj
7157 mkdir $pkgdir $bundledir $Resources $lprojdir ||
7158 pp_error "Can't make package temporary directories"
7160 # Add services (may modify %files)
7161 for svc in $pp_services .; do
7162 test . = "$svc" && continue
7163 pp_macos_add_service $svc
7166 # Find file lists (%files.* includes ignore files)
7167 for cmp in $pp_components; do
7168 test -f $pp_wrkdir/%files.$cmp && filelists="$filelists${filelists:+ }$pp_wrkdir/%files.$cmp"
7171 # compute the installed size and number of files/dirs
7172 size=`cat $filelists | pp_macos_files_size`
7173 numfiles=`cat $filelists | wc -l`
7174 numfiles="${numfiles##* }"
7176 # Write Distribution file
7177 cat <<-. >$pkgdir/Distribution
7178 <?xml version="1.0" encoding="UTF-8"?>
7179 <installer-script minSpecVersion="1.000000" authoringTool="com.quest.rc.PolyPkg" authoringToolVersion="$pp_version" authoringToolBuild="$pp_revision">
7180 <title>$name $version</title>
7181 <options customize="never" allow-external-scripts="no"/>
7182 <domains enable_localSystem="true"/>
7184 if test -n "$pp_macos_pkg_welcome"; then
7185 cp -R "${pp_macos_pkg_welcome}" $Resources
7186 echo " <welcome file=\"${pp_macos_pkg_welcome##*/}\"/>" >>$pkgdir/Distribution
7188 if test -n "$pp_macos_pkg_readme"; then
7189 cp -R "${pp_macos_pkg_readme}" $Resources
7190 echo " <readme file=\"${pp_macos_pkg_readme##*/}\"/>" >>$pkgdir/Distribution
7192 if test -n "$pp_macos_pkg_license"; then
7193 cp -R "${pp_macos_pkg_license}" $Resources
7194 echo " <license file=\"${pp_macos_pkg_license##*/}\"/>" >>$pkgdir/Distribution
7196 cat <<-. >>$pkgdir/Distribution
7198 <line choice="choice0"/>
7200 <choice id="choice0" title="$name $version">
7201 <pkg-ref id="${pp_macos_bundle_id}"/>
7203 <pkg-ref id="${pp_macos_bundle_id}" installKBytes="$size" version="$version" auth="Root">#$name.pkg</pkg-ref>
7207 # write scripts archive
7208 # XXX - missing preupgrade, preflight, postflight
7209 mkdir $pp_wrkdir/scripts
7210 for cmp in $pp_components; do
7211 if test -s $pp_wrkdir/%pre.$cmp; then
7212 if test ! -s $pp_wrkdir/scripts/preinstall; then
7213 echo "#!/bin/sh" > $pp_wrkdir/scripts/preinstall
7214 chmod +x $pp_wrkdir/scripts/preinstall
7216 cat $pp_wrkdir/%pre.$cmp >> $pp_wrkdir/scripts/preinstall
7217 echo : >> $pp_wrkdir/scripts/preinstall
7219 if test -s $pp_wrkdir/%post.$cmp; then
7220 if test ! -s $pp_wrkdir/scripts/postinstall; then
7221 echo "#!/bin/sh" > $pp_wrkdir/scripts/postinstall
7222 chmod +x $pp_wrkdir/scripts/postinstall
7224 cat $pp_wrkdir/%post.$cmp >> $pp_wrkdir/scripts/postinstall
7225 echo : >> $pp_wrkdir/scripts/postinstall
7227 if test -s $pp_wrkdir/%postup.$cmp; then
7228 if test ! -s $pp_wrkdir/scripts/postupgrade; then
7229 echo "#!/bin/sh" > $pp_wrkdir/scripts/postupgrade
7230 chmod +x $pp_wrkdir/scripts/postupgrade
7232 cat $pp_wrkdir/%postup.$cmp >> $pp_wrkdir/scripts/postupgrade
7233 echo : >> $pp_wrkdir/scripts/postupgrade
7235 # XXX - not supported
7236 if test -s $pp_wrkdir/%preun.$cmp; then
7237 if test ! -s $pp_wrkdir/scripts/preremove; then
7238 echo "#!/bin/sh" > $pp_wrkdir/scripts/preremove
7239 chmod +x $pp_wrkdir/scripts/preremove
7241 cat $pp_wrkdir/%preun.$cmp >> $pp_wrkdir/scripts/preremove
7242 echo : >> $pp_wrkdir/scripts/preremove
7244 # XXX - not supported
7245 if test -s $pp_wrkdir/%postun.$cmp; then
7246 if test ! -s $pp_wrkdir/scripts/postremove; then
7247 echo "#!/bin/sh" > $pp_wrkdir/scripts/postremove
7248 chmod +x $pp_wrkdir/scripts/postremove
7250 cat $pp_wrkdir/%postun.$cmp >> $pp_wrkdir/scripts/postremove
7251 echo : >> $pp_wrkdir/scripts/postremove
7254 if test "`echo $pp_wrkdir/scripts/*`" != "$pp_wrkdir/scripts/*"; then
7255 # write scripts archive, scripts are mode 0755 uid/gid 0/0
7256 # resetting the owner and mode is not strictly required
7258 cd $pp_wrkdir/scripts || pp_error "Can't cd to $pp_wrkdir/scripts"
7259 rm -f $pp_wrkdir/tmp.files.scripts
7261 echo "f 0755 0 0 - ./$s" >>$pp_wrkdir/tmp.files.scripts
7263 find . -type f | /usr/bin/cpio -o | pp_macos_rewrite_cpio $pp_wrkdir/tmp.files.scripts | gzip -9f -c > $bundledir/Scripts
7267 # Write PackageInfo file
7268 cat <<-. >$bundledir/PackageInfo
7269 <?xml version="1.0" encoding="UTF-8"?>
7270 <pkg-info format-version="2" identifier="${pp_macos_bundle_id}" version="$version" install-location="/" relocatable="false" overwrite-permissions="true" followSymLinks="true" auth="root">
7271 <payload installKBytes="$size" numberOfFiles="$numfiles"/>
7273 if test -s $bundledir/Scripts; then
7274 echo " <scripts>" >>$bundledir/PackageInfo
7275 for s in preflight postflight preinstall postinstall preupgrade postupgrade; do
7276 if test -s "$pp_wrkdir/scripts/$s"; then
7277 echo " <$s file=\"$s\"/>" >>$bundledir/PackageInfo
7280 echo " </scripts>" >>$bundledir/PackageInfo
7282 cat <<-. >>$bundledir/PackageInfo
7288 # Create the bill-of-materials (Bom)
7289 cat $filelists | pp_macos_files_bom | sort |
7290 pp_macos_bom_fix_parents > $pp_wrkdir/tmp.bomls
7291 pp_macos_mkbom $pp_wrkdir/tmp.bomls $bundledir/Bom
7293 # Create the cpio payload
7295 cd $pp_destdir || pp_error "Can't cd to $pp_destdir"
7296 awk '{ print "." $6 }' $filelists | sed 's:/$::' | sort | /usr/bin/cpio -o | pp_macos_rewrite_cpio $filelists | gzip -9f -c > $bundledir/Payload
7299 # Copy installer plugins if any
7300 if test -n "$pp_macos_installer_plugin"; then
7301 if test ! -f "$pp_macos_installer_plugin/InstallerSections.plist"; then
7302 pp_error "Missing InstallerSections.plist file in $pp_macos_installer_plugin"
7304 mkdir -p $pkgdir/Plugins
7305 cp -R "$pp_macos_installer_plugin"/* $pkgdir/Plugins
7308 test -d $pp_wrkdir/bom_stage && $pp_macos_sudo rm -rf $pp_wrkdir/bom_stage
7310 # Create the flat package with xar (like pkgutil --flatten does)
7311 # Note that --distribution is only supported by Mac OS X 10.6 and above
7312 xar_flags="--compression=bzip2 --no-compress Scripts --no-compress Payload"
7313 case $mac_version in
7315 *) xar_flags="$xar_flags --distribution";;
7317 (cd $pkgdir && /usr/bin/xar $xar_flags -cf "../$name-$version.pkg" *)
7320 pp_backend_macos_cleanup () {
7324 pp_backend_macos_names () {
7325 case "$pp_macos_pkg_type" in
7326 bundle) echo ${name}.pkg;;
7327 flat) echo ${name}-${version}.pkg;;
7328 *) pp_error "unsupported package type $pp_macos_pkg_type";;
7332 pp_backend_macos_install_script () {
7334 typeset pkgname platform
7336 pkgname="`pp_backend_macos_names`"
7337 platform="`pp_backend_macos_probe`"
7338 pp_install_script_common
7341 test \$# -eq 0 && usage
7346 test \$# -eq 0 || usage \$op
7347 echo "$pp_components"
7350 test \$# -eq 0 || usage \$op
7354 test \$# -ge 1 || usage \$op
7355 echo \${PP_PKGDESTDIR:-.}/"$pkgname"
7358 test \$# -ge 1 || usage \$op
7360 pkg=\$vol/${name}-${version}.pkg
7361 hdiutil attach -readonly -mountpoint \$vol \
7362 \${PP_PKGDESTDIR:-.}/"$pkgname"
7363 trap "hdiutil detach \$vol" 0
7364 installer -pkginfo -pkg \$pkg
7365 installer -verbose -pkg \$pkg -target /
7368 test \$# -ge 1 || usage \$op
7370 echo "Uninstall not implemented" >&2
7373 test \$# -ge 1 || usage \$op
7378 echo "\${op} not implemented" >&2
7392 pp_backend_macos_init_svc_vars () {
7393 pp_macos_start_services_after_install=false
7394 pp_macos_service_name=
7395 pp_macos_default_service_id_prefix="com.quest.rc."
7396 pp_macos_service_id=
7397 pp_macos_service_user=
7398 pp_macos_service_group=
7399 pp_macos_service_initgroups=
7400 pp_macos_service_umask=
7401 pp_macos_service_cwd=
7402 pp_macos_service_nice=
7403 pp_macos_svc_plist_file=
7406 pp_macos_launchd_plist () {
7414 if [ -n "$pp_macos_svc_plist_file" ]; then
7415 echo "## Launchd plist file already defined at $pp_macos_svc_plist_file"
7419 echo "## Generating the launchd plist file for $svc"
7420 pp_macos_svc_plist_file="$pp_wrkdir/$svc.plist"
7421 cat <<-. > $pp_macos_svc_plist_file
7422 <?xml version="1.0" encoding="UTF-8"?>
7423 <!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
7424 http://www.apple.com/DTDs/PropertyList-1.0.dtd >
7425 <plist version="1.0">
7428 <string>$svc_id</string>
7429 <key>ProgramArguments</key>
7432 while test $# != 0; do
7433 printf " <string>$1</string>\n" >> $pp_macos_svc_plist_file
7436 cat <<-. >> $pp_macos_svc_plist_file
7438 <key>KeepAlive</key>
7441 if test -n "$pp_macos_service_user"; then
7442 printf " <key>UserName</key>\n" >> $pp_macos_svc_plist_file
7443 printf " <string>$pp_macos_service_user</string>\n" >> $pp_macos_svc_plist_file
7445 if test -n "$pp_macos_service_group"; then
7446 printf " <key>GroupName</key>\n" >> $pp_macos_svc_plist_file
7447 printf " <string>$pp_macos_service_group</string>\n" >> $pp_macos_svc_plist_file
7449 if test -n "$pp_macos_service_initgroups"; then
7450 printf " <key>InitGroups</key>\n" >> $pp_macos_svc_plist_file
7451 printf " <string>$pp_macos_service_initgroups</string>\n" >> $pp_macos_svc_plist_file
7453 if test -n "$pp_macos_service_umask"; then
7454 printf " <key>Umask</key>\n" >> $pp_macos_svc_plist_file
7455 printf " <string>$pp_macos_service_umask</string>\n" >> $pp_macos_svc_plist_file
7457 if test -n "$pp_macos_service_cwd"; then
7458 printf " <key>WorkingDirectory</key>\n" >> $pp_macos_svc_plist_file
7459 printf " <string>$pp_macos_service_cwd</string>\n" >> $pp_macos_svc_plist_file
7461 if test -n "$pp_macos_service_nice"; then
7462 printf " <key>Nice</key>\n" >> $pp_macos_svc_plist_file
7463 printf " <string>$pp_macos_service_nice</string>\n" >> $pp_macos_svc_plist_file
7465 cat <<-. >> $pp_macos_svc_plist_file
7471 pp_macos_add_service () {
7472 typeset svc svc_id plist_file plist_dir
7474 pp_load_service_vars "$1"
7475 svc=${pp_macos_service_name:-$1}
7476 svc_id=${pp_macos_service_id:-$pp_macos_default_service_id_prefix$svc}
7478 #-- create a plist file for svc
7479 pp_macos_launchd_plist "$svc" "$svc_id"
7481 #-- copy the plist file into place and add to %files
7482 plist_dir="/Library/LaunchDaemons"
7483 plist_file="$plist_dir/$svc_id.plist"
7484 mkdir -p "$pp_destdir/$plist_dir"
7485 cp "$pp_macos_svc_plist_file" "$pp_destdir/$plist_file"
7486 pp_add_file_if_missing "$plist_file"
7488 #-- add code to start the service on install
7489 ${pp_macos_start_services_after_install} && <<-. >> $pp_wrkdir/%post.$svc
7490 # start service '$svc' automatically after install
7491 launchctl load "$plist_file"
7495 pp_backend_macos_probe () {
7496 typeset name vers arch
7497 case `sw_vers -productName` in
7498 "Mac OS X") name="macos";;
7501 vers=`sw_vers -productVersion | sed -e 's/^\([^.]*\)\.\([^.]*\).*/\1\2/'`
7503 echo "$name$vers-$arch"
7506 pp_backend_macos_vas_platforms () {
7507 echo "osx" # XXX non-really sure what they do.. it should be "macos"
7509 pp_backend_macos_function () {
7511 _pp_macos_search_unused) cat<<'.';;
7512 # Find an unused value in the given path
7513 # args: path attribute minid [maxid]
7516 test $pp_tmp_val -ge ${4:-999999} && return 1
7517 /usr/bin/dscl . -search "$1" "$2" $pp_tmp_val |
7518 grep . > /dev/null || break
7519 pp_tmp_val=`expr $pp_tmp_val + 1`
7523 pp_mkgroup:depends) echo _pp_macos_search_unused;;
7524 pp_mkgroup) cat<<'.';;
7526 /usr/bin/dscl . -read /Groups/"$1" >/dev/null 2>&1 && return
7527 pp_tmp_gid=`_pp_macos_search_unused /Groups PrimaryGroupID 100`
7528 /usr/bin/dscl . -create /Groups/"$1"
7529 /usr/bin/dscl . -create /Groups/"$1" PrimaryGroupID $pp_tmp_gid
7530 /usr/bin/dscl . -create /Groups/"$1" RealName "Group $1"
7531 /usr/bin/dscl . -create /Groups/"$1" GroupMembership ""
7532 /usr/bin/dscl . -create /Groups/"$1" Password '*'
7534 pp_mkuser:depends) echo pp_mkgroup _pp_macos_search_unused;;
7535 pp_mkuser) cat<<'.';;
7537 /usr/bin/dscl . -read /Users/"$1" >/dev/null 2>&1 && return
7538 pp_tmp_uid=`_pp_macos_search_unused /Users UniqueID 100`
7539 pp_mkgroup "${2:-$1}"
7540 pp_tmp_gid=`/usr/bin/dscl . -read /Groups/"${2:-$1}" \
7541 PrimaryGroupID | awk '{print $2}'`
7542 /usr/bin/dscl . -create /Users/"$1"
7543 /usr/bin/dscl . -create /Users/"$1" PrimaryGroupID $pp_tmp_gid
7544 /usr/bin/dscl . -create /Users/"$1" NFSHomeDirectory \
7546 /usr/bin/dscl . -create /Users/"$1" UserShell \
7547 "${4:-/usr/bin/false}"
7548 /usr/bin/dscl . -create /Users/"$1" RealName "$1"
7549 /usr/bin/dscl . -create /Users/"$1" UniqueID $pp_tmp_uid
7550 /usr/bin/dscl . -create /Users/"$1" Password '*'
7552 pp_havelib) cat<<'.';;
7553 # (use otool -L to find dependent libraries)
7554 for pp_tmp_dir in `echo "${3:+$3:}/usr/local/lib:/lib:/usr/lib" |
7556 test -r "$pp_tmp_dir/lib$1{$2:+.$2}.dylib" && return 0
7564 pp_platforms="$pp_platforms inst"
7566 pp_backend_inst_detect () {
7573 pp_backend_inst_init () {
7574 pp_readlink_fn=pp_ls_readlink
7577 pp_backend_inst_create_idb()
7579 typeset t m o g f p st
7581 while read t m o g f p st; do
7582 if test x"$o" = x"-"; then
7585 if test x"$g" = x"-"; then
7589 f) test x"$m" = x"-" && m=444
7590 echo "f 0$m $o $g $p $p $name.sw.base"
7592 d) test x"$m" = x"-" && m=555
7593 echo "d 0$m $o $g $p $p $name.sw.base"
7595 s) test x"$m" = x"-" && m=777
7596 test x"$m" = x"777" ||
7597 pp_warn "$p: invalid mode $m for symlink, should be 777 or -"
7598 echo "l 0$m $o $g $p $p $name.sw.base symval($st)"
7604 pp_backend_inst_create_spec()
7606 echo "product $name"
7607 echo " id \"${summary}. Version: ${version}\""
7609 echo " id \"Software\""
7610 echo " version $version"
7613 echo " id \"Base Software\""
7614 echo " replaces self"
7615 echo " exp $name.sw.base"
7621 pp_backend_inst () {
7627 pp_inst_tardist=tardist
7628 pp_inst_spec=${name}.spec
7629 pp_inst_idb=${name}.idb
7631 rm -rf $pp_inst_tardist $pp_inst_spec $pp_inst_idb
7632 mkdir -p $pp_inst_tardist
7635 (for _cmp in $pp_components; do
7636 cat %files.$_cmp | sort +4u -6 | pp_backend_inst_create_idb
7637 done) >> $pp_inst_idb
7639 pp_backend_inst_create_spec >> $pp_inst_spec
7642 gendist -verbose -all -root / -source $pp_opt_destdir -idb $pp_inst_idb -spec $pp_inst_spec -dist $pp_inst_tardist $name
7643 tar -cvf `pp_backend_inst_names` $pp_inst_tardist
7648 pp_backend_inst_cleanup () {
7652 pp_backend_inst_names () {
7653 echo ${name}-${version}.tardist
7656 pp_backend_inst_install_script () {
7660 pp_backend_inst_function () {
7664 pp_backend_inst_init_svc_vars () {
7668 pp_backend_inst_probe () {
7669 cpu=`hinv|sed -n '/^CPU/{s/000 /k /;s/^CPU: //;s/ Process.*//;s/^MIPS //;p;q;}'|tr A-Z a-z`
7670 echo irix`uname -r`-$cpu
7673 pp_backend_inst_vas_platforms () {
7677 pp_platforms="$pp_platforms null"
7679 pp_backend_null_detect () {
7683 pp_backend_null_init () {
7688 pp_backend_null () {
7692 pp_backend_null_cleanup () {
7696 pp_backend_null_names () {
7700 pp_backend_null_install_script () {
7704 pp_backend_null_function () {
7708 pp_backend_null_init_svc_vars () {
7712 pp_backend_null_probe () {
7713 echo unknown-unknown
7716 pp_backend_null_vas_platforms () {
7721 quest_require_vas () {
7724 if test $# -ne 1; then
7727 set -- `echo "$1" | tr . ' '` 0 0 0
7731 echo $d | grep '^[0-9][0-9]*$' > /dev/null ||
7732 pp_error "quest_require_vas: Bad version component $d"
7736 pp_error "quest_require_vas: missing version number"
7738 case "$1.$2.$3.$4" in
7741 *.*.*.0) v=$1.$2.$3;;
7746 if test -x /opt/quest/bin/vastool &&
7747 /opt/quest/bin/vastool -v |
7748 awk 'NR == 1 {print \$4}' |
7749 awk -F. '{ if (\$1<$1 || \$1==$1 && ( \
7750 \$2<$2 || \$2==$2 && ( \
7751 \$3<$3 || \$2==$3 && ( \
7752 \$4<$4 )))) exit(1); }'
7756 echo "Requires VAS $v or later"