
systemd-sysext currently messes up SElinux labeling[0]. As a workaround, we can delegate to the systemd-sysext service that doesn't exercise the same issue. [0] https://github.com/systemd/systemd/issues/34387 Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3498>
146 lines
3.0 KiB
Bash
Executable File
146 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/bash
|
|
|
|
set -eu
|
|
|
|
DEFAULT_TOOLBOX=gnome-shell-devel
|
|
CONFIG_FILE=${XDG_CONFIG_HOME:-$HOME/.config}/gnome-shell-toolbox-tools.conf
|
|
|
|
usage() {
|
|
cat <<-EOF
|
|
Usage: $(basename $0) [OPTION…]
|
|
|
|
Extract and install a systemd-sysext extension from a toolbox
|
|
|
|
Options:
|
|
-t, --toolbox=TOOLBOX Use TOOLBOX instead of the default "$DEFAULT_TOOLBOX"
|
|
|
|
--persistent Install extension under /var/lib/extensions/ to persist after reboots
|
|
|
|
-h, --help Display this help
|
|
|
|
EOF
|
|
}
|
|
|
|
die() {
|
|
echo "$@" >&2
|
|
exit 1
|
|
}
|
|
|
|
init_sysext() {
|
|
rm -rf $HOME_SYSEXT_DIR
|
|
mkdir -p $HOME_SYSEXT_DIR
|
|
podman cp $TOOLBOX:/var/lib/extensions/$TOOLBOX/. $HOME_SYSEXT_DIR
|
|
|
|
local ext_dir=$HOME_SYSEXT_DIR/usr/lib/extension-release.d
|
|
mkdir -p $ext_dir
|
|
podman cp $TOOLBOX:/etc/os-release $ext_dir/extension-release.$TOOLBOX
|
|
}
|
|
|
|
runtime_install_command() {
|
|
local dest=$(dirname $RUN_SYSEXT_DIR)
|
|
|
|
echo -n "mkdir -p $dest && "
|
|
echo -n "ln -sf $HOME_SYSEXT_DIR $dest && "
|
|
echo -n "rm -fr $VAR_SYSEXT_DIR"
|
|
}
|
|
|
|
system_install_command() {
|
|
local dest=$(dirname $VAR_SYSEXT_DIR)
|
|
local attr=mode
|
|
|
|
selinuxenabled 2>/dev/null && attr="$attr,context"
|
|
|
|
echo -n "mkdir -p $dest && "
|
|
echo -n "cp -r --preserve=$attr $HOME_SYSEXT_DIR $dest && "
|
|
echo -n "rm -fr $RUN_SYSEXT_DIR"
|
|
}
|
|
|
|
install_command() {
|
|
if [[ ${PERSISTENT:-0} ]]; then
|
|
system_install_command
|
|
else
|
|
runtime_install_command
|
|
fi
|
|
}
|
|
|
|
sysext_merge_command() {
|
|
#echo -n systemd-sysext refresh
|
|
# workaround for https://github.com/systemd/systemd/issues/34387
|
|
echo -n systemctl restart systemd-sysext.service
|
|
}
|
|
|
|
compile_schemas_command() {
|
|
local schemadir=usr/share/glib-2.0/schemas
|
|
if [ -d $HOME_SYSEXT_DIR/$schemadir ]
|
|
then
|
|
echo -n "$(runtime_install_command) && "
|
|
echo -n "$(sysext_merge_command) && "
|
|
echo -n "glib-compile-schemas --targetdir $HOME_SYSEXT_DIR/$schemadir /$schemadir 2>/dev/null && "
|
|
echo -n "chown $(id -un):$(id -gn) $HOME_SYSEXT_DIR/$schemadir/gschemas.compiled"
|
|
else
|
|
echo -n :
|
|
fi
|
|
}
|
|
|
|
relabel_command() {
|
|
local setfiles=$(which setfiles 2>/dev/null)
|
|
if [ -x "$setfiles" ]
|
|
then
|
|
local spec=/etc/selinux/targeted/contexts/files/file_contexts
|
|
echo -n "$setfiles -F -r $HOME_SYSEXT_DIR $spec $HOME_SYSEXT_DIR/usr"
|
|
else
|
|
echo -n :
|
|
fi
|
|
}
|
|
|
|
# load defaults
|
|
. $CONFIG_FILE
|
|
TOOLBOX=$DEFAULT_TOOLBOX
|
|
|
|
TEMP=$(getopt \
|
|
--name $(basename $0) \
|
|
--options 't:h' \
|
|
--longoptions 'toolbox:' \
|
|
--longoptions 'persistent' \
|
|
--longoptions 'help' \
|
|
-- "$@") || die "Run $(basename $0) --help to see available options"
|
|
|
|
eval set -- "$TEMP"
|
|
unset TEMP
|
|
|
|
while true; do
|
|
case $1 in
|
|
-t|--toolbox)
|
|
TOOLBOX=$2
|
|
shift 2
|
|
;;
|
|
|
|
--persistent)
|
|
PERSISTENT=1
|
|
shift
|
|
;;
|
|
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
HOME_SYSEXT_DIR=$HOME/.local/lib/toolbox-extensions/$TOOLBOX
|
|
RUN_SYSEXT_DIR=/run/extensions/$TOOLBOX
|
|
VAR_SYSEXT_DIR=/var/lib/extensions/$TOOLBOX
|
|
|
|
init_sysext
|
|
|
|
sudo sh -c "
|
|
$(compile_schemas_command) &&
|
|
$(relabel_command) &&
|
|
$(install_command) &&
|
|
$(sysext_merge_command)"
|