mirror of
https://gitlab.gnome.org/GNOME/gparted
synced 2024-10-29 23:08:41 +00:00
2cfca5b38a
Udev stopped supporting volatile udev rules in /dev/.udev/rules.d in udev 176, released 2012-01-11 [1]. The oldest supported distributions use much more recent combined systemd and udev releases. Distro EOL udevadm -V Debian 9 2022-Jun 232 RHEL / CentOS 7 2024-Jun 219 Ubuntu 18.04 LTS 2023-Apr 237 Now udev only reads volatile rules from /run/udev/ruled.d [2]. Simplify the code a little. [1] udev 176 NEWS https://git.kernel.org/pub/scm/linux/hotplug/udev.git/tree/NEWS?h=176 "A writable /run directory (ususally tmpfs) is required now for a fully functional udev, there is no longer a fallback to /dev/.udev." [2] man 7 udev "RULES FILES The udev rules are read from the files located in the system rules directory /usr/lib/udev/rules.d, the volatile runtime directory /run/udev/rules.d and the local administration directory /etc/udev/rules.d."
240 lines
7 KiB
Bash
Executable file
240 lines
7 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 pidof gpartedbin 1> /dev/null; 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="@libexecdir@/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 pidof systemd 1> /dev/null; then
|
|
HAVE_SYSTEMCTL=yes
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
#
|
|
# Check if udisks2-inhibit exists in a known location
|
|
# and if appropriate daemon is running.
|
|
#
|
|
HAVE_UDISKS2_INHIBIT=no
|
|
for k in /usr/libexec/udisks2/udisks2-inhibit \
|
|
/usr/lib/udisks2/udisks2-inhibit; do
|
|
if test -x $k; then
|
|
if pidof udisksd 1> /dev/null; then
|
|
HAVE_UDISKS2_INHIBIT=yes
|
|
UDISKS2_INHIBIT_BIN=$k
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
#
|
|
# 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 pidof udisks-daemon 1> /dev/null; then
|
|
HAVE_UDISKS=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 pidof hald 1> /dev/null; 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 show --all --property=Where,What,Id,LoadState '*.mount' | \
|
|
awk '
|
|
function clear_properties() {
|
|
where = ""; what = ""; id = ""; loadstate = ""
|
|
}
|
|
function process_unit() {
|
|
if (substr(what,1,5) == "/dev/" &&
|
|
loadstate != "masked" &&
|
|
what != "/dev/fuse" &&
|
|
! (substr(what,1,9) == "/dev/loop" && substr(where,1,6) == "/snap/"))
|
|
{
|
|
print id
|
|
}
|
|
clear_properties()
|
|
}
|
|
/^Where=/ { where = substr($0,7) }
|
|
/^What=/ { what = substr($0,6) }
|
|
/^Id=/ { id = substr($0,4) }
|
|
/^LoadState=/ { loadstate = substr($0,11) }
|
|
/^$/ { process_unit() }
|
|
END { process_unit() }
|
|
'`
|
|
systemctl --runtime mask --quiet -- $MOUNTLIST
|
|
fi
|
|
|
|
#
|
|
# Create temporary blank overrides for all udev rules which automatically
|
|
# start Linux Software RAID array members and Bcache devices.
|
|
#
|
|
# Udev stores volatile / temporary runtime rules in directory /run/udev/rules.d.
|
|
# Volatile / temporary rules are used 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 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_RULES='' # List of temporary override rules files.
|
|
if test -d /run/udev; then
|
|
test ! -d /run/udev/rules.d && mkdir /run/udev/rules.d
|
|
udev_mdadm_rules=`egrep -l '^[^#].*mdadm (-I|--incremental)' /lib/udev/rules.d/*.rules 2> /dev/null`
|
|
udev_bcache_rules=`ls /lib/udev/rules.d/*bcache*.rules 2> /dev/null`
|
|
UDEV_TEMP_RULES=`echo $udev_mdadm_rules $udev_bcache_rules | sed 's,/lib/udev,/run/udev,g'`
|
|
fi
|
|
for rule in $UDEV_TEMP_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.
|
|
# 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
|
|
$UDISKS2_INHIBIT_BIN $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_HAL_LOCK" = "xyes"; then
|
|
hal-lock --interface org.freedesktop.Hal.Device.Storage --exclusive \
|
|
--run "$BASE_CMD"
|
|
else
|
|
$BASE_CMD
|
|
fi
|
|
status=$?
|
|
|
|
#
|
|
# Clear any temporary override udev rules used to stop udev automatically
|
|
# starting Linux Software RAID array members and Bcache devices.
|
|
#
|
|
for rule in $UDEV_TEMP_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
|
|
|
|
exit $status
|