diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:49:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:49:04 +0000 |
commit | 16f504a9dca3fe3b70568f67b7d41241ae485288 (patch) | |
tree | c60f36ada0496ba928b7161059ba5ab1ab224f9d /src/VBox/Installer/solaris/makepackage.sh | |
parent | Initial commit. (diff) | |
download | virtualbox-16f504a9dca3fe3b70568f67b7d41241ae485288.tar.xz virtualbox-16f504a9dca3fe3b70568f67b7d41241ae485288.zip |
Adding upstream version 7.0.6-dfsg.upstream/7.0.6-dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Installer/solaris/makepackage.sh')
-rwxr-xr-x | src/VBox/Installer/solaris/makepackage.sh | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/src/VBox/Installer/solaris/makepackage.sh b/src/VBox/Installer/solaris/makepackage.sh new file mode 100755 index 00000000..73b83121 --- /dev/null +++ b/src/VBox/Installer/solaris/makepackage.sh @@ -0,0 +1,307 @@ +#!/bin/sh +# $Id: makepackage.sh $ +## @file +# VirtualBox package creation script, Solaris hosts. +# + +# +# Copyright (C) 2007-2022 Oracle and/or its affiliates. +# +# This file is part of VirtualBox base platform packages, as +# available from https://www.virtualbox.org. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation, in version 3 of the +# License. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <https://www.gnu.org/licenses>. +# +# SPDX-License-Identifier: GPL-3.0-only +# + +# +# Usage: +# makepackage.sh [--hardened] [--ips] $(PATH_TARGET)/install packagename {$(KBUILD_TARGET_ARCH)|neutral} $(VBOX_SVN_REV) + + +# Parse options. +HARDENED="" +IPS_PACKAGE="" +PACKAGE_SPEC="prototype" +while [ $# -ge 1 ]; +do + case "$1" in + --hardened) + HARDENED=1 + ;; + --ips) + IPS_PACKAGE=1 + PACKAGE_SPEC="virtualbox.p5m" + ;; + *) + break + ;; + esac + shift +done + +if [ -z "$4" ]; then + echo "Usage: $0 installdir packagename x86|amd64 svnrev" + echo "-- packagename must not have any extension (e.g. VirtualBox-SunOS-amd64-r28899)" + exit 1 +fi + +PKG_BASE_DIR="$1" +PACKAGE_SPEC="$PKG_BASE_DIR/$PACKAGE_SPEC" +VBOX_INSTALLED_DIR=/opt/VirtualBox +if [ -n "$IPS_PACKAGE" ]; then + VBOX_PKGFILE="$2".p5p +else + VBOX_PKGFILE="$2".pkg +fi +# VBOX_PKG_ARCH is currently unused. +VBOX_PKG_ARCH="$3" +VBOX_SVN_REV="$4" + +if [ -n "$IPS_PACKAGE" ] ; then + VBOX_PKGNAME=system/virtualbox +else + VBOX_PKGNAME=SUNWvbox +fi +# any egrep should do the job, the one from /usr/xpg4/bin isn't required +VBOX_EGREP=/usr/bin/egrep +# need dynamic regex support which isn't available in S11 /usr/bin/awk +VBOX_AWK=/usr/xpg4/bin/awk + +# bail out on non-zero exit status +set -e + +if [ -n "$IPS_PACKAGE" ]; then + +package_spec_create() +{ + > "$PACKAGE_SPEC" +} + +package_spec_append_info() +{ + : # provided by vbox-ips.mog +} + +package_spec_append_content() +{ + rm -rf "$1/vbox-repo" + pkgsend generate "$1" | pkgfmt >> "$PACKAGE_SPEC" +} + +package_spec_append_hardlink() +{ + if [ -f "$3$4/amd64/$2" -o -f "$3$4/i386/$2" ]; then + echo "hardlink path=$4/$2 target=$1" >> "$PACKAGE_SPEC" + fi +} + +package_spec_fixup_content() +{ + : +} + +package_create() +{ + VBOX_DEF_HARDENED= + [ -z "$HARDENED" ] && VBOX_DEF_HARDENED='#' + + pkgmogrify -DVBOX_PKGNAME="$VBOX_PKGNAME" -DHARDENED_ONLY="$VBOX_DEF_HARDENED" "$PACKAGE_SPEC" "$1/vbox-ips.mog" | pkgfmt > "$PACKAGE_SPEC.1" + + pkgdepend generate -m -d "$1" "$PACKAGE_SPEC.1" | pkgfmt > "$PACKAGE_SPEC.2" + + pkgdepend resolve -m "$PACKAGE_SPEC.2" + + # Too expensive, and in this form not useful since it does not have + # the package manifests without using options -r (for repo access) and + # -c (for caching the data). Not viable since the cache would be lost + # for every build. + #pkglint "$PACKAGE_SPEC.2.res" + + pkgrepo create "$1/vbox-repo" + pkgrepo -s "$1/vbox-repo" set publisher/prefix=virtualbox + + # Create package in local file repository + pkgsend -s "$1/vbox-repo" publish -d "$1" "$PACKAGE_SPEC.2.res" + + pkgrepo -s "$1/vbox-repo" info + pkgrepo -s "$1/vbox-repo" list + + # Convert into package archive + rm -f "$1/$2" + pkgrecv -a -s "$1/vbox-repo" -d "$1/$2" -m latest "$3" + rm -rf "$1/vbox-repo" +} + +else + +package_spec_create() +{ + > "$PACKAGE_SPEC" +} + +package_spec_append_info() +{ + echo 'i pkginfo=vbox.pkginfo' >> "$PACKAGE_SPEC" + echo 'i checkinstall=checkinstall.sh' >> "$PACKAGE_SPEC" + echo 'i postinstall=postinstall.sh' >> "$PACKAGE_SPEC" + echo 'i preremove=preremove.sh' >> "$PACKAGE_SPEC" + echo 'i space=vbox.space' >> "$PACKAGE_SPEC" +} + +# Our package is a non-relocatable package. +# +# pkgadd will take care of "relocating" them when they are used for remote installations using +# $PKG_INSTALL_ROOT and not $BASEDIR. Seems this little subtlety led to it's own page: +# https://docs.oracle.com/cd/E19253-01/820-4042/package-2/index.html + +package_spec_append_content() +{ + cd "$1" + # Exclude directories to not cause install-time conflicts with existing system directories + 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" + cd - + "$VBOX_AWK" 'NF == 3 && $1 == "s" && $2 == "none" { $3="/"$3 } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp" + mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC" + "$VBOX_AWK" 'NF == 6 && ($1 == "f" || $1 == "l") && ($2 == "none" || $2 == "manifest") { $3="/"$3 } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp" + mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC" + + cd "$1" + # Include opt/VirtualBox and subdirectories as we want uninstall to clean up directory structure. + # Include var/svc for manifest class action script does not create them. + find . -type d | "$VBOX_EGREP" 'opt/VirtualBox|var/svc/manifest/application/virtualbox' | LC_COLLATE=C sort | pkgproto >> "$PACKAGE_SPEC" + cd - + "$VBOX_AWK" 'NF == 6 && $1 == "d" && $2 == "none" { $3="/"$3 } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp" + mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC" +} + +package_spec_append_hardlink() +{ + if [ -f "$3$4/amd64/$2" -o -f "$3$4/i386/$2" ]; then + echo "l none $4/$2=$1" >> "$PACKAGE_SPEC" + fi +} + +# Fixup filelist using awk, the parameters must be in awk syntax +# params: filename condition action +package_spec_fixup_filelist() +{ + "$VBOX_AWK" 'NF == 6 && '"$1"' { '"$2"' } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp" + mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC" +} + +package_spec_fixup_dirlist() +{ + "$VBOX_AWK" 'NF == 6 && $1 == "d" && '"$1"' { '"$2"' } { print }' "$PACKAGE_SPEC" > "$PACKAGE_SPEC.tmp" + mv -f "$PACKAGE_SPEC.tmp" "$PACKAGE_SPEC" +} + +package_spec_fixup_content() +{ + # fix up file permissions (owner/group) + # don't grok for class-specific files (like sed, if any) + package_spec_fixup_filelist '$2 == "none"' '$5 = "root"; $6 = "bin"' + + # HostDriver vboxdrv + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxdrv.conf"' '$6 = "sys"' + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxdrv"' '$6 = "sys"' + + # NetFilter vboxflt + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxflt.conf"' '$6 = "sys"' + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxflt"' '$6 = "sys"' + + # NetFilter vboxbow + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxbow.conf"' '$6 = "sys"' + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxbow"' '$6 = "sys"' + + # NetAdapter vboxnet + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxnet.conf"' '$6 = "sys"' + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxnet"' '$6 = "sys"' + + # USBMonitor vboxusbmon + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxusbmon.conf"' '$6 = "sys"' + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxusbmon"' '$6 = "sys"' + + # USB Client vboxusb + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/vboxusb.conf"' '$6 = "sys"' + package_spec_fixup_filelist '$3 == "/platform/i86pc/kernel/drv/amd64/vboxusb"' '$6 = "sys"' + + # Manifest class action scripts + package_spec_fixup_filelist '$3 == "/var/svc/manifest/application/virtualbox/virtualbox-webservice.xml"' '$2 = "manifest";$6 = "sys"' + package_spec_fixup_filelist '$3 == "/var/svc/manifest/application/virtualbox/virtualbox-balloonctrl.xml"' '$2 = "manifest";$6 = "sys"' + package_spec_fixup_filelist '$3 == "/var/svc/manifest/application/virtualbox/virtualbox-zoneaccess.xml"' '$2 = "manifest";$6 = "sys"' + + # Use 'root' as group so as to match attributes with the previous installation and prevent a conflict. Otherwise pkgadd bails out thinking + # we're violating directory attributes of another (non existing) package + package_spec_fixup_dirlist '$3 == "/var/svc/manifest/application/virtualbox"' '$6 = "root"' + + # Hardening requires some executables to be marked setuid. + if [ -n "$HARDENED" ]; then + package_spec_fixup_filelist '( $3 == "/opt/VirtualBox/amd64/VirtualBoxVM" \ + || $3 == "/opt/VirtualBox/amd64/VBoxHeadless" \ + || $3 == "/opt/VirtualBox/amd64/VBoxSDL" \ + || $3 == "/opt/VirtualBox/i386/VirtualBox" \ + || $3 == "/opt/VirtualBox/i386/VBoxHeadless" \ + || $3 == "/opt/VirtualBox/i386/VBoxSDL" )' '$4 = "4755"' + fi + + # Other executables that need setuid root (hardened or otherwise) + package_spec_fixup_filelist '( $3 == "/opt/VirtualBox/amd64/VBoxNetAdpCtl" \ + || $3 == "/opt/VirtualBox/i386/VBoxNetAdpCtl" \ + || $3 == "/opt/VirtualBox/amd64/VBoxNetDHCP" \ + || $3 == "/opt/VirtualBox/i386/VBoxNetDHCP" \ + || $3 == "/opt/VirtualBox/amd64/VBoxNetNAT" \ + || $3 == "/opt/VirtualBox/i386/VBoxNetNAT" )' '$4 = "4755"' + + echo " --- start of $PACKAGE_SPEC ---" + cat "$PACKAGE_SPEC" + echo " --- end of $PACKAGE_SPEC ---" +} + +package_create() +{ + # Create the package instance + pkgmk -o -f "$PACKAGE_SPEC" -r "$1" + + # Translate into package datastream + pkgtrans -s -o /var/spool/pkg "$1/$2" "$3" + + rm -rf "/var/spool/pkg/$2" +} + +fi + + +# Prepare package spec +package_spec_create + +# Metadata +package_spec_append_info "$PKG_BASE_DIR" + +# File and direcory list +package_spec_append_content "$PKG_BASE_DIR" + +# Add hardlinks for executables to launch the 32-bit or 64-bit executable +for f in VBoxManage VBoxSDL VBoxAutostart vboxwebsrv VBoxZoneAccess VBoxSVC VBoxBugReport VBoxBalloonCtrl VBoxTestOGL VirtualBox VirtualBoxVM vbox-img VBoxHeadless; do + package_spec_append_hardlink VBoxISAExec $f "$PKG_BASE_DIR" "$VBOX_INSTALLED_DIR" +done + +package_spec_fixup_content + +package_create "$PKG_BASE_DIR" "$VBOX_PKGFILE" "$VBOX_PKGNAME" "$VBOX_SVN_REV" + +echo "## Package file created successfully!" + +exit $? |