Your IP : 18.220.206.218
Current Path : /usr/libexec/snapd/ |
|
Current File : //usr/libexec/snapd/snap-mgmt-selinux |
#!/bin/bash
set -e
set +x
SNAP_MOUNT_DIR="/var/lib/snapd/snap"
show_help() {
exec cat <<'EOF'
Usage: snap-mgmt-selinux.sh [OPTIONS]
A helper script to manage SELinux contexts used by snapd
Arguments:
--snap-mount-dir=<path> Provide a path to be used as $SNAP_MOUNT_DIR
--patch-selinux-mount-context=<context> Add SELinux context to mount units
--remove-selinux-mount-context=<context> Remove SELinux context from mount units
EOF
}
SNAP_UNIT_PREFIX="$(systemd-escape -p ${SNAP_MOUNT_DIR})"
patch_selinux_mount_context() {
if ! command -v selinuxenabled > /dev/null; then
return
fi
if ! selinuxenabled; then
# The tools are there, but SELinux is not enabled
return
fi
selinux_mount_context="$1"
remove="$2"
if ! echo "$selinux_mount_context" | grep -qE '[a-zA-Z0-9_]+(:[a-zA-Z0-9_]+){2,3}'; then
echo "invalid mount context '$selinux_mount_context'"
exit 1
fi
context_opt="context=$selinux_mount_context"
mounts=$(systemctl list-unit-files --no-legend --full "$SNAP_UNIT_PREFIX-*.mount" | cut -f1 -d ' ' || true)
changed_mounts=
for unit in $mounts; do
# Ensure its really a snap mount unit or systemd unit
if ! grep -q 'What=/var/lib/snapd/snaps/' "/etc/systemd/system/$unit" && ! grep -q 'X-Snappy=yes' "/etc/systemd/system/$unit"; then
echo "Skipping non-snapd systemd unit $unit"
continue
fi
if [ "$remove" == "" ]; then
if grep -q "Options=.*,$context_opt" < "/etc/systemd/system/$unit"; then
# already patched
continue
fi
if ! sed -i -e "s#^\\(Options=nodev.*\\)#\\1,$context_opt#" "/etc/systemd/system/$unit"; then
echo "Cannot patch $unit"
fi
changed_mounts="$changed_mounts $unit"
elif [ "$remove" == "remove" ]; then
if ! grep -q "Options=.*,$context_opt" < "/etc/systemd/system/$unit"; then
# Not patched
continue
fi
if ! sed -i -e "s#^\\(Options=nodev.*\\),$context_opt\\(,.*\\)\\?#\\1\\2#" "/etc/systemd/system/$unit"; then
echo "Cannot patch $unit"
fi
changed_mounts="$changed_mounts $unit"
fi
done
if [ -z "$changed_mounts" ]; then
# Nothing changed, no need to reload
return
fi
systemctl daemon-reload
for unit in $changed_mounts; do
if ! systemctl try-restart "$unit" ; then
echo "Cannot restart $unit"
fi
done
}
while [ -n "$1" ]; do
case "$1" in
--help)
show_help
exit
;;
--snap-mount-dir=*)
SNAP_MOUNT_DIR=${1#*=}
SNAP_UNIT_PREFIX=$(systemd-escape -p "$SNAP_MOUNT_DIR")
shift
;;
--patch-selinux-mount-context=*)
patch_selinux_mount_context "${1#*=}"
shift
;;
--remove-selinux-mount-context=*)
patch_selinux_mount_context "${1#*=}" remove
shift
;;
*)
echo "Unknown command: $1"
exit 1
;;
esac
done