VirtualBox

source: vbox/trunk/src/VBox/Installer/solaris/makepackage.sh@ 98676

最後變更 在這個檔案從98676是 98676,由 vboxsync 提交於 2 年 前

Installer/*: Check VBOX_WITH_FE_BUGREPORT before assuming VBoxBugReport is there. bugref:10030

  • 屬性 svn:eol-style 設為 LF
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 11.2 KB
 
1#!/bin/sh
2# $Id: makepackage.sh 98676 2023-02-21 15:26:57Z vboxsync $
3## @file
4# VirtualBox package creation script, Solaris hosts.
5#
6
7#
8# Copyright (C) 2007-2023 Oracle and/or its affiliates.
9#
10# This file is part of VirtualBox base platform packages, as
11# available from https://www.alldomusa.eu.org.
12#
13# This program is free software; you can redistribute it and/or
14# modify it under the terms of the GNU General Public License
15# as published by the Free Software Foundation, in version 3 of the
16# License.
17#
18# This program is distributed in the hope that it will be useful, but
19# WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21# General Public License for more details.
22#
23# You should have received a copy of the GNU General Public License
24# along with this program; if not, see <https://www.gnu.org/licenses>.
25#
26# SPDX-License-Identifier: GPL-3.0-only
27#
28
29#
30# Usage:
31# makepackage.sh [--hardened] [--ips] [--without-VBoxBugReport] \
32# $(PATH_TARGET)/install packagename {$(KBUILD_TARGET_ARCH)|neutral} $(VBOX_SVN_REV)
33
34
35# Parse options.
36HARDENED=""
37IPS_PACKAGE=""
38PACKAGE_SPEC="prototype"
39OPT_WITHOUT_VBoxBugReport=""
40while [ $# -ge 1 ];
41do
42 case "$1" in
43 --hardened)
44 HARDENED=1
45 ;;
46 --ips)
47 IPS_PACKAGE=1
48 PACKAGE_SPEC="virtualbox.p5m"
49 ;;
50 --without-VBoxBugReport
51 OPT_WITHOUT_VBoxBugReport="yes"
52 ;;
53 *)
54 break
55 ;;
56 esac
57 shift
58done
59
60if [ -z "$4" ]; then
61 echo "Usage: $0 installdir packagename x86|amd64 svnrev"
62 echo "-- packagename must not have any extension (e.g. VirtualBox-SunOS-amd64-r28899)"
63 exit 1
64fi
65
66PKG_BASE_DIR="$1"
67PACKAGE_SPEC="$PKG_BASE_DIR/$PACKAGE_SPEC"
68VBOX_INSTALLED_DIR=/opt/VirtualBox
69if [ -n "$IPS_PACKAGE" ]; then
70 VBOX_PKGFILE="$2".p5p
71else
72 VBOX_PKGFILE="$2".pkg
73fi
74# VBOX_PKG_ARCH is currently unused.
75VBOX_PKG_ARCH="$3"
76VBOX_SVN_REV="$4"
77
78if [ -n "$IPS_PACKAGE" ] ; then
79 VBOX_PKGNAME=system/virtualbox
80else
81 VBOX_PKGNAME=SUNWvbox
82fi
83# any egrep should do the job, the one from /usr/xpg4/bin isn't required
84VBOX_EGREP=/usr/bin/egrep
85# need dynamic regex support which isn't available in S11 /usr/bin/awk
86VBOX_AWK=/usr/xpg4/bin/awk
87
88# bail out on non-zero exit status
89set -e
90
91if [ -n "$IPS_PACKAGE" ]; then
92
93package_spec_create()
94{
95 > "$PACKAGE_SPEC"
96}
97
98package_spec_append_info()
99{
100 : # provided by vbox-ips.mog
101}
102
103package_spec_append_content()
104{
105 rm -rf "$1/vbox-repo"
106 pkgsend generate "$1" | pkgfmt >> "$PACKAGE_SPEC"
107}
108
109package_spec_append_hardlink()
110{
111 if [ -f "$3$4/amd64/$2" -o -f "$3$4/i386/$2" ]; then
112 echo "hardlink path=$4/$2 target=$1" >> "$PACKAGE_SPEC"
113 fi
114}
115
116package_spec_fixup_content()
117{
118 :
119}
120
121package_create()
122{
123 VBOX_DEF_HARDENED=
124 [ -z "$HARDENED" ] && VBOX_DEF_HARDENED='#'
125
126 pkgmogrify -DVBOX_PKGNAME="$VBOX_PKGNAME" -DHARDENED_ONLY="$VBOX_DEF_HARDENED" "$PACKAGE_SPEC" "$1/vbox-ips.mog" | pkgfmt > "$PACKAGE_SPEC.1"
127
128 pkgdepend generate -m -d "$1" "$PACKAGE_SPEC.1" | pkgfmt > "$PACKAGE_SPEC.2"
129
130 pkgdepend resolve -m "$PACKAGE_SPEC.2"
131
132 # Too expensive, and in this form not useful since it does not have
133 # the package manifests without using options -r (for repo access) and
134 # -c (for caching the data). Not viable since the cache would be lost
135 # for every build.
136 #pkglint "$PACKAGE_SPEC.2.res"
137
138 pkgrepo create "$1/vbox-repo"
139 pkgrepo -s "$1/vbox-repo" set publisher/prefix=virtualbox
140
141 # Create package in local file repository
142 pkgsend -s "$1/vbox-repo" publish -d "$1" "$PACKAGE_SPEC.2.res"
143
144 pkgrepo -s "$1/vbox-repo" info
145 pkgrepo -s "$1/vbox-repo" list
146
147 # Convert into package archive
148 rm -f "$1/$2"
149 pkgrecv -a -s "$1/vbox-repo" -d "$1/$2" -m latest "$3"
150 rm -rf "$1/vbox-repo"
151}
152
153else
154
155package_spec_create()
156{
157 > "$PACKAGE_SPEC"
158}
159
160package_spec_append_info()
161{
162 echo 'i pkginfo=vbox.pkginfo' >> "$PACKAGE_SPEC"
163 echo 'i checkinstall=checkinstall.sh' >> "$PACKAGE_SPEC"
164 echo 'i postinstall=postinstall.sh' >> "$PACKAGE_SPEC"
165 echo 'i preremove=preremove.sh' >> "$PACKAGE_SPEC"
166 echo 'i space=vbox.space' >> "$PACKAGE_SPEC"
167}
168
169# Our package is a non-relocatable package.
170#
171# pkgadd will take care of "relocating" them when they are used for remote installations using
172# $PKG_INSTALL_ROOT and not $BASEDIR. Seems this little subtlety led to it's own page:
173# https://docs.oracle.com/cd/E19253-01/820-4042/package-2/index.html
174
175package_spec_append_content()
176{
177 cd "$1"
178 # Exclude directories to not cause install-time conflicts with existing system directories
179 find . ! -type d | "$VBOX_EGREP" -v '^\./(LICENSE|prototype|makepackage\.sh|vbox\.pkginfo|postinstall\.sh|checkinstall\.sh|preremove\.sh|vbox\.space|vbox-ips.mog|virtualbox\.p5m.*)$' | LC_COLLATE=C sort | pkgproto >> "$PACKAGE_SPEC"
180 cd -
181 "$VBOX_AWK" 'NF == 3 && $1 == "s" && $2 == "none" { $3="/"$3 } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp"
182 mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC"
183 "$VBOX_AWK" 'NF == 6 && ($1 == "f" || $1 == "l") && ($2 == "none" || $2 == "manifest") { $3="/"$3 } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp"
184 mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC"
185
186 cd "$1"
187 # Include opt/VirtualBox and subdirectories as we want uninstall to clean up directory structure.
188 # Include var/svc for manifest class action script does not create them.
189 find . -type d | "$VBOX_EGREP" 'opt/VirtualBox|var/svc/manifest/application/virtualbox' | LC_COLLATE=C sort | pkgproto >> "$PACKAGE_SPEC"
190 cd -
191 "$VBOX_AWK" 'NF == 6 && $1 == "d" && $2 == "none" { $3="/"$3 } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp"
192 mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC"
193}
194
195package_spec_append_hardlink()
196{
197 if [ -f "$3$4/amd64/$2" -o -f "$3$4/i386/$2" ]; then
198 echo "l none $4/$2=$1" >> "$PACKAGE_SPEC"
199 fi
200}
201
202# Fixup filelist using awk, the parameters must be in awk syntax
203# params: filename condition action
204package_spec_fixup_filelist()
205{
206 "$VBOX_AWK" 'NF == 6 && '"$1"' { '"$2"' } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp"
207 mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC"
208}
209
210package_spec_fixup_dirlist()
211{
212 "$VBOX_AWK" 'NF == 6 && $1 == "d" && '"$1"' { '"$2"' } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp"
213 mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC"
214}
215
216package_spec_fixup_content()
217{
218 # fix up file permissions (owner/group)
219 # don't grok for class-specific files (like sed, if any)
220 package_spec_fixup_filelist '$2 == "none"' '$5 = "root"; $6 = "bin"'
221
222 # HostDriver vboxdrv
223 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxdrv.conf"' '$6 = "sys"'
224 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxdrv"' '$6 = "sys"'
225
226 # NetFilter vboxflt
227 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxflt.conf"' '$6 = "sys"'
228 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxflt"' '$6 = "sys"'
229
230 # NetFilter vboxbow
231 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxbow.conf"' '$6 = "sys"'
232 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxbow"' '$6 = "sys"'
233
234 # NetAdapter vboxnet
235 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxnet.conf"' '$6 = "sys"'
236 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxnet"' '$6 = "sys"'
237
238 # USBMonitor vboxusbmon
239 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxusbmon.conf"' '$6 = "sys"'
240 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxusbmon"' '$6 = "sys"'
241
242 # USB Client vboxusb
243 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxusb.conf"' '$6 = "sys"'
244 package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxusb"' '$6 = "sys"'
245
246 # Manifest class action scripts
247 package_spec_fixup_filelist '$3 == "/var/svc/manifest/application/virtualbox/virtualbox-webservice.xml"' '$2 = "manifest";$6 = "sys"'
248 package_spec_fixup_filelist '$3 == "/var/svc/manifest/application/virtualbox/virtualbox-balloonctrl.xml"' '$2 = "manifest";$6 = "sys"'
249 package_spec_fixup_filelist '$3 == "/var/svc/manifest/application/virtualbox/virtualbox-zoneaccess.xml"' '$2 = "manifest";$6 = "sys"'
250
251 # Use 'root' as group so as to match attributes with the previous installation and prevent a conflict. Otherwise pkgadd bails out thinking
252 # we're violating directory attributes of another (non existing) package
253 package_spec_fixup_dirlist '$3 == "/var/svc/manifest/application/virtualbox"' '$6 = "root"'
254
255 # Hardening requires some executables to be marked setuid.
256 if [ -n "$HARDENED" ]; then
257 package_spec_fixup_filelist '( $3 == "/opt/VirtualBox/amd64/VirtualBoxVM" \
258 || $3 == "/opt/VirtualBox/amd64/VBoxHeadless" \
259 || $3 == "/opt/VirtualBox/amd64/VBoxSDL" \
260 || $3 == "/opt/VirtualBox/i386/VirtualBox" \
261 || $3 == "/opt/VirtualBox/i386/VBoxHeadless" \
262 || $3 == "/opt/VirtualBox/i386/VBoxSDL" )' '$4 = "4755"'
263 fi
264
265 # Other executables that need setuid root (hardened or otherwise)
266 package_spec_fixup_filelist '( $3 == "/opt/VirtualBox/amd64/VBoxNetAdpCtl" \
267 || $3 == "/opt/VirtualBox/i386/VBoxNetAdpCtl" \
268 || $3 == "/opt/VirtualBox/amd64/VBoxNetDHCP" \
269 || $3 == "/opt/VirtualBox/i386/VBoxNetDHCP" \
270 || $3 == "/opt/VirtualBox/amd64/VBoxNetNAT" \
271 || $3 == "/opt/VirtualBox/i386/VBoxNetNAT" )' '$4 = "4755"'
272
273 echo " --- start of $PACKAGE_SPEC ---"
274 cat "$PACKAGE_SPEC"
275 echo " --- end of $PACKAGE_SPEC ---"
276}
277
278package_create()
279{
280 # Create the package instance
281 pkgmk -o -f "$PACKAGE_SPEC" -r "$1"
282
283 # Translate into package datastream
284 pkgtrans -s -o /var/spool/pkg "$1/$2" "$3"
285
286 rm -rf "/var/spool/pkg/$2"
287}
288
289fi
290
291
292# Prepare package spec
293package_spec_create
294
295# Metadata
296package_spec_append_info "$PKG_BASE_DIR"
297
298# File and direcory list
299package_spec_append_content "$PKG_BASE_DIR"
300
301# Add hardlinks for executables to launch the 32-bit or 64-bit executable
302for f in VBoxManage VBoxSDL VBoxAutostart vboxwebsrv VBoxZoneAccess VBoxSVC VBoxBalloonCtrl VBoxTestOGL VirtualBox VirtualBoxVM vbox-img VBoxHeadless; do
303 package_spec_append_hardlink VBoxISAExec $f "$PKG_BASE_DIR" "$VBOX_INSTALLED_DIR"
304done
305if [ -z "${OPT_WITHOUT_VBoxBugReport}" ]; then
306 package_spec_append_hardlink VBoxISAExec VBoxBugReport "$PKG_BASE_DIR" "$VBOX_INSTALLED_DIR"
307fi
308
309package_spec_fixup_content
310
311package_create "$PKG_BASE_DIR" "$VBOX_PKGFILE" "$VBOX_PKGNAME" "$VBOX_SVN_REV"
312
313echo "## Package file created successfully!"
314
315exit $?
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette