mirror of
https://gitlab.gnome.org/GNOME/gparted
synced 2024-10-29 23:08:41 +00:00
f38ccd0284
GParted fails to display when run under Wayland [1][2][3]. This is because by intentional design Wayland doesn't allow applications with root privileges access to the display [4]. As an interim workaround make the gparted shell wrapper use xhost to grant root access to the X11 server if root doesn't already have access, but only when configured. Granting root access must be explicitly enabled when building GParted like this: ./configure --enable-xhost-root It defaults to disabled. When gpartedbin binary ends the shell wrapper revokes root access only if it granted such access. [1] GNOME Bug 776437 - GParted fails to run as root under Wayland https://bugzilla.gnome.org/show_bug.cgi?id=776437 [2] Ubuntu Bug 1652282 - GParted does not work in GNOME on Wayland https://bugs.launchpad.net/ubuntu/+source/gparted/+bug/1652282 [3] Fedora Bug 1397103 - gparted not working under Wayland https://bugzilla.redhat.com/show_bug.cgi?id=1397103 [4] Common Fedora 25 bugs Running graphical apps with root privileges (e.g. gparted) does not work on Wayland https://fedoraproject.org/wiki/Common_F25_bugs#wayland-root-apps Bug 776437 - GParted fails to run as root under Wayland
241 lines
7.5 KiB
Bash
Executable file
241 lines
7.5 KiB
Bash
Executable file
#!/bin/sh
|
|
# Name: gparted
|
|
# Purpose: Perform appropriate startup of GParted executable gpartedbin.
|
|
#
|
|
# The purpose of these startup methods is to prevent
|
|
# devices from being automounted, and to ensure only one
|
|
# instance of GParted is running. File system problems can
|
|
# occur if devices are mounted prior to the completion of
|
|
# GParted's operations, or if multiple partition editing
|
|
# tools are in use concurrently.
|
|
#
|
|
# Copyright (C) 2008, 2009, 2010, 2013, 2015 Curtis Gedak
|
|
#
|
|
# This file is part of GParted.
|
|
#
|
|
# GParted 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; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# GParted 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 GParted. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
#
|
|
# Only permit one instance of GParted to execute at a time
|
|
#
|
|
if test "z`ps -e | grep gpartedbin`" != "z"; then
|
|
echo "The process gpartedbin is already running."
|
|
echo "Only one gpartedbin process is permitted."
|
|
exit 1
|
|
fi
|
|
|
|
#
|
|
# Define base command for executing GParted
|
|
#
|
|
BASE_CMD="@sbindir@/gpartedbin $*"
|
|
|
|
#
|
|
# For non-root users try to get authorisation to run GParted as root.
|
|
#
|
|
if test "x`id -u`" != "x0"; then
|
|
#
|
|
# If there is no configured SU program run gpartedbin as
|
|
# non-root to display the graphical error about needing root
|
|
# privileges.
|
|
#
|
|
if test "x@gksuprog@" = "x"; then
|
|
echo "Root privileges are required for running gparted."
|
|
$BASE_CMD
|
|
exit 1
|
|
fi
|
|
|
|
#
|
|
# Interim workaround to allow GParted run by root access to the
|
|
# X11 display server under Wayland. If configured with
|
|
# './configure --enable-xhost-root', the xhost command is
|
|
# available and root has not been granted access to the X11
|
|
# display via xhost, then grant access.
|
|
#
|
|
ENABLE_XHOST_ROOT=@enable_xhost_root@
|
|
GRANTED_XHOST_ROOT=no
|
|
if test "x$ENABLE_XHOST_ROOT" = 'xyes' && xhost 1> /dev/null 2>&1; then
|
|
if ! xhost | grep -qi 'SI:localuser:root$'; then
|
|
xhost +SI:localuser:root
|
|
GRANTED_XHOST_ROOT=yes
|
|
fi
|
|
fi
|
|
|
|
#
|
|
# Run gparted as root.
|
|
#
|
|
@gksuprog@ '@bindir@/gparted' "$@"
|
|
status=$?
|
|
|
|
#
|
|
# Revoke root access to the X11 display, only if we granted it.
|
|
#
|
|
if test "x$GRANTED_XHOST_ROOT" = 'xyes'; then
|
|
xhost -SI:localuser:root
|
|
fi
|
|
exit $status
|
|
fi
|
|
|
|
#
|
|
# Search PATH to determine if systemctl program can be found
|
|
# and if appropriate daemon is running.
|
|
#
|
|
HAVE_SYSTEMCTL=no
|
|
for k in '' `echo "$PATH" | sed 's,:, ,g'`; do
|
|
if test -x "$k/systemctl"; then
|
|
if test "z`ps -e | grep systemd`" != "z"; then
|
|
HAVE_SYSTEMCTL=yes
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
#
|
|
# Check if udisks2-inhibit exists in known location
|
|
# and if appropriate daemon is running.
|
|
#
|
|
HAVE_UDISKS2_INHIBIT=no
|
|
if test -x "/usr/lib/udisks2/udisks2-inhibit"; then
|
|
if test "z`ps -e | grep 'udisksd'`" != "z"; then
|
|
HAVE_UDISKS2_INHIBIT=yes
|
|
fi
|
|
fi
|
|
|
|
#
|
|
# Search PATH to determine if udisks program can be found
|
|
# and if appropriate daemon is running.
|
|
#
|
|
HAVE_UDISKS=no
|
|
for k in '' `echo "$PATH" | sed 's,:, ,g'`; do
|
|
if test -x "$k/udisks"; then
|
|
if test "z`ps -e | grep udisks-daemon`" != "z"; then
|
|
HAVE_UDISKS=yes
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
#
|
|
# Search PATH to determine if devkit-disks program can be found
|
|
# and if appropriate daemon is running.
|
|
# On December 1, 2009, devkit-disks was named udisks.
|
|
#
|
|
HAVE_DEVKIT_DISKS=no
|
|
for k in '' `echo "$PATH" | sed 's,:, ,g'`; do
|
|
if test -x "$k/devkit-disks"; then
|
|
if test "z`ps -e | grep devkit-disks-da`" != "z"; then
|
|
HAVE_DEVKIT_DISKS=yes
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
#
|
|
# Search PATH to determine if hal-lock program can be found
|
|
# and if appropriate daemon is running.
|
|
#
|
|
HAVE_HAL_LOCK=no
|
|
for k in '' `echo "$PATH" | sed 's,:, ,g'`; do
|
|
if test -x "$k/hal-lock"; then
|
|
if test "z`ps -e | grep hald`" != "z"; then
|
|
HAVE_HAL_LOCK=yes
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
#
|
|
# Use systemctl to prevent automount by masking currently unmasked mount points
|
|
#
|
|
if test "x$HAVE_SYSTEMCTL" = "xyes"; then
|
|
MOUNTLIST=`systemctl list-units --full --all -t mount --no-legend \
|
|
| grep -v masked | cut -f1 -d' ' \
|
|
| egrep -v '^(dev-hugepages|dev-mqueue|proc-sys-fs-binfmt_misc|run-user-.*-gvfs|sys-fs-fuse-connections|sys-kernel-config|sys-kernel-debug)'`
|
|
systemctl --runtime mask --quiet -- $MOUNTLIST
|
|
fi
|
|
|
|
#
|
|
# Create temporary blank overrides for all udev rules which automatically
|
|
# start Linux Software RAID array members.
|
|
#
|
|
# Udev stores volatile / temporary runtime rules in directory /run/udev/rules.d.
|
|
# Older versions use /dev/.udev/rules.d instead, and even older versions don't
|
|
# have such a directory at all. Volatile / temporary rules are use to override
|
|
# default rules from /lib/udev/rules.d. (Permanent local administrative rules
|
|
# in directory /etc/udev/rules.d override all others). See udev(7) manual page
|
|
# from various versions of udev for details.
|
|
#
|
|
# Default udev rules containing mdadm to incrementally start array members are
|
|
# found in 64-md-raid.rules and/or 65-md-incremental.rules, depending on the
|
|
# distribution and age. The rules may be commented out or not exist at all.
|
|
#
|
|
UDEV_TEMP_MDADM_RULES='' # List of temporary override rules files.
|
|
for udev_temp_d in /run/udev /dev/.udev; do
|
|
if test -d "$udev_temp_d"; then
|
|
test ! -d "$udev_temp_d/rules.d" && mkdir "$udev_temp_d/rules.d"
|
|
udev_mdadm_rules=`egrep -l '^[^#].*mdadm (-I|--incremental)' /lib/udev/rules.d/*.rules 2> /dev/null`
|
|
UDEV_TEMP_MDADM_RULES=`echo "$udev_mdadm_rules" | sed 's,^/lib/udev,'"$udev_temp_d"','`
|
|
break
|
|
fi
|
|
done
|
|
for rule in $UDEV_TEMP_MDADM_RULES; do
|
|
touch "$rule"
|
|
done
|
|
|
|
#
|
|
# Use udisks2-inhibit if udisks2-inhibit exists and deamon running.
|
|
# Else use both udisks and hal-lock for invocation if both binaries exist and both
|
|
# daemons are running.
|
|
# Else use udisks if binary exists and daemon is running.
|
|
# Else use both devkit-disks and hal-lock for invocation if both binaries exist
|
|
# and both of the daemons are running.
|
|
# Else use devkit-disks if binary exists and daemon is running.
|
|
# Otherwise use hal-lock for invocation if binary exists and daemon is running.
|
|
# If the above checks fail then simply run gpartedbin.
|
|
#
|
|
if test "x$HAVE_UDISKS2_INHIBIT" = "xyes"; then
|
|
/usr/lib/udisks2/udisks2-inhibit $BASE_CMD
|
|
elif test "x$HAVE_UDISKS" = "xyes" && test "x$HAVE_HAL_LOCK" = "xyes"; then
|
|
udisks --inhibit -- \
|
|
hal-lock --interface org.freedesktop.Hal.Device.Storage --exclusive \
|
|
--run "$BASE_CMD"
|
|
elif test "x$HAVE_UDISKS" = "xyes"; then
|
|
udisks --inhibit -- $BASE_CMD
|
|
elif test "x$HAVE_DEVKIT_DISKS" = "xyes" && test "x$HAVE_HAL_LOCK" = "xyes"; then
|
|
devkit-disks --inhibit -- \
|
|
hal-lock --interface org.freedesktop.Hal.Device.Storage --exclusive \
|
|
--run "$BASE_CMD"
|
|
elif test "x$HAVE_DEVKIT_DISKS" = "xyes"; then
|
|
devkit-disks --inhibit -- $BASE_CMD
|
|
elif test "x$HAVE_HAL_LOCK" = "xyes"; then
|
|
hal-lock --interface org.freedesktop.Hal.Device.Storage --exclusive \
|
|
--run "$BASE_CMD"
|
|
else
|
|
$BASE_CMD
|
|
fi
|
|
|
|
#
|
|
# Clear any temporary override udev rules used to stop udev automatically
|
|
# starting Linux Software RAID array members.
|
|
#
|
|
for rule in $UDEV_TEMP_MDADM_RULES; do
|
|
rm -f "$rule"
|
|
done
|
|
|
|
#
|
|
# Use systemctl to restore that status of any mount points changed above
|
|
#
|
|
if test "x$HAVE_SYSTEMCTL" = "xyes"; then
|
|
systemctl --runtime unmask --quiet -- $MOUNTLIST
|
|
fi
|