|
|
- #!/bin/sh
- #
- # xrdp: A Remote Desktop Protocol server.
- #
- # Copyright (C) 2021 Matt Burt, all xrdp contributors
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- #
-
- # Wrapper to call install_pulseaudio_sources.sh and tidy up afterwards
- #
- # The following command line switches are supported, for systems based on
- # Debian or Ubuntu:-
- #
- # 1) --mirror= Specify an alternative mirror for debootstrap
- # 2) --keyring= Specify an alternative keyring for debootstrap
- # 3) --suite= Specify an alternative suite for debootstrap
- #
- # The first two of these are are needed for systems with their own
- # mirrors and signing keys (i.e. Raspberry PI OS).
- #
- # --suite is useful for systems which report their own codename for
- # `lsb_release -c`, but are otherwise based on a standard distro. For
- # example Linux Mint 20.04 reports 'una', but is largely based on
- # Ubuntu 'focal'
-
- # ---------------------------------------------------------------------------
- # G L O B A L S
- # ---------------------------------------------------------------------------
- # Where the output files are going
- PULSE_DIRNAME=pulseaudio.src
- PULSE_DIR=$HOME/$PULSE_DIRNAME
-
- # Absolute path to the script we're wrapping. This picks it up from
- # the same directory this file is in
- WRAPPED_SCRIPT=$(cd $(dirname $0) && pwd)/install_pulseaudio_sources_apt.sh
-
- # The buildroot directory. Choose fast, temporary storage if available
- BUILDROOT=/var/lib/pa-build/$USER
-
- # Extra packages to install in the build root which the wrapped script
- # may be using. These are packages available by default when using
- # GitHub actions
- WRAPPED_SCRIPT_DEPS="sudo lsb-release"
-
- # -----------------------------------------------------------------------------
- # S U I T E E X I S T S
- #
- # Does the specified debootstrap suite exist?
- # -----------------------------------------------------------------------------
- SuiteExists()
- {
- [ -f "/usr/share/debootstrap/scripts/$1" ]
- }
-
- # -----------------------------------------------------------------------------
- # I N S T A L L R E Q U I R E D P A C K A G E S
- #
- # Installs packages required for the build on the host machine
- # -----------------------------------------------------------------------------
- InstallRequiredPackages()
- {
- set -- \
- /usr/sbin/debootstrap debootstrap \
- /usr/bin/schroot schroot \
- /usr/bin/lsb_release lsb-release
-
- pkgs=
- while [ $# -ge 2 ]; do
- if [ ! -x $1 ]; then
- pkgs="$pkgs $2"
- fi
- shift 2
- done
-
- if [ -n "$pkgs" ]; then
- echo "- Need to install packages :$pkgs"
- echo
- echo " These can be removed when this script completes with:-"
- echo " sudo apt-get purge$pkgs && apt-get autoremove"
- echo
- sudo apt-get install -y $pkgs
- fi
- }
-
- # -----------------------------------------------------------------------------
- # R U N W R A P P E D S C R I P T
- #
- # Runs the wrapped build script using schroot
- #
- # This function definition uses () rather than {} to create an extra
- # sub-process where we can run 'set -e' without affecting the parent
- #
- # Parameters : <script> [<script params>...]
- # -----------------------------------------------------------------------------
- RunWrappedScript()
- (
- # In this sub-process, fail on error
- set -e
-
- # Define default args for running program
- # -c : Define the schroot config to use
- # -d : Directory to switch to before running command
- schroot="schroot -c pa-build-$USER -d /build"
-
- # Install extra dependencies
- $schroot -u root -- apt-get install -y $WRAPPED_SCRIPT_DEPS
-
- # Allow normal user to sudo without a password
- $schroot -u root -- \
- /bin/sh -c "echo '$USER ALL=(ALL) NOPASSWD:ALL'>/etc/sudoers.d/nopasswd-$USER"
- $schroot -u root -- chmod 400 /etc/sudoers.d/nopasswd-$USER
-
- # Call the wrapped script
- $schroot -- "$@"
- )
-
- # -----------------------------------------------------------------------------
- # M A I N
- # -----------------------------------------------------------------------------
- debootstrap_mirror=""
- debootstrap_switches=""
- debootstrap_suite=""
-
- # Parse command line switches
- while [ -n "$1" ]; do
- case "$1" in
- --mirror=*)
- debootstrap_mirror="${1#--mirror=}"
- ;;
- --keyring=*)
- file="${1#--keyring=}"
- if [ -f "$file" ]; then
- debootstrap_switches="$debootstrap_switches $1"
- else
- echo "** Ignoring missing keyring $1" >&2
- fi
- ;;
- --suite=*)
- debootstrap_suite="${1#--suite=}"
- if ! SuiteExists "$debootstrap_suite"; then
- echo "** Unsupported suite '$debootstrap_suite'" >&2
- exit 1
- fi
- ;;
- *) echo "** Unrecognised parameter '$1'" >&2
- exit 1
- esac
- shift
- done
-
- # Start with a few sanity checks
- if [ -d $PULSE_DIR ]; then
- echo "** Target directory $PULSE_DIR already exists" >&2
- exit 0
- fi
-
- if [ ! -x $WRAPPED_SCRIPT ]; then
- echo "** Can't find wrapped script $WRAPPED_SCRIPT" >&2
- exit 1
- fi
-
- if [ -e $BUILDROOT ]; then
- echo "** Remove old build root $BUILDROOT before running this script"
- exit 1
- fi
-
- # Do we need extra packages?
- InstallRequiredPackages || exit $?
-
- # We should be able to determine the suite now, if it's not specified
- if [ -z "$debootstrap_suite" ]; then
- debootstrap_suite=$(lsb_release -cs) ; # e.g. 'bullseye'
- if [ -z "$debootstrap_suite" ]; then
- echo "** Can't determine current suite" >&2
- exit 1
- fi
-
- if ! SuiteExists "$debootstrap_suite" ; then
- echo "** Current distro '$debootstrap_suite' does not appear to be supported by debootstrap" >&2
- echo " Need --suite switch?" >&2
- exit 1
- fi
- fi
-
- # Create the build root
- log=/var/tmp/pa-build-$USER-debootstrap.log
- echo "- Creating $debootstrap_suite build root. Log file in $log"
- sudo debootstrap \
- $debootstrap_switches \
- $debootstrap_suite $BUILDROOT "$debootstrap_mirror" >$log 2>&1 || {
- echo "** debootstrap failed. Check log file $log" >&2
- exit 1
- }
-
- # Create the config file for schroot
- schroot_conf=/etc/schroot/chroot.d/pa-build-$USER.conf
- echo "- Creating schroot config file $schroot_conf"
- {
- echo "[pa-build-$USER]"
- echo "description=Build PA on current system for $USER"
- echo "directory=$BUILDROOT"
- echo "root-users=$USER"
- echo "users=$USER"
- echo "type=directory"
- } | sudo tee $schroot_conf >/dev/null || exit $?
-
- # Copy some files to the build root
- for file in /etc/apt/sources.list; do
- echo "- Copying $file to the root"
- sudo install -m 0644 $file $BUILDROOT/$file || exit $?
- done
-
- # Create a separate directory in $BUILDROOT to hold the build
- # artefacts.
- #
- # We used to do the build on the user's home directory, but this
- # isn't supported by schroot out-of-the-box on all configurations -
- # see https://github.com/neutrinolabs/pulseaudio-module-xrdp/issues/76
- echo "- Creating the build directory /build"
- sudo install -d --mode=0775 --owner=$USER --group=$(id -g) \
- $BUILDROOT/build || exit $?
-
- # Copy the wrapped script to the buildroot root
- echo "- Copying the wrapped script to the build directory"
- sudo install -m 755 $WRAPPED_SCRIPT $BUILDROOT/build/wrapped_script || exit $?
-
- # Run the wrapped script
- log=/var/tmp/pa-build-$USER-schroot.log
- echo "- Building PA sources. Log file in $log"
- RunWrappedScript /build/wrapped_script -d /build/$PULSE_DIRNAME >$log 2>&1 || {
- echo "** schroot failed. Check log file $log" >&2
- exit 1
- }
-
- # Done! Copy the resulting directory out of the build root
- echo "- Copying sources out of the build root"
- cp -pr $BUILDROOT/build/$PULSE_DIRNAME $PULSE_DIR || exit $?
-
- # Remove the schroot config file as its no longer needed
- echo "- Removing schroot config file and build root"
- sudo rm -rf $schroot_conf $BUILDROOT
-
- echo "- All done. Configure PA xrdp module with PULSE_DIR=$PULSE_DIR"
- exit 0
|