core-agent-linux/qubes-rpc/prepare-suspend

89 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
# Source Qubes library.
# shellcheck source=init/functions
. /usr/lib/qubes/init/functions
action=$1
[ -z "$action" ] && action=suspend
MODULES_BLACKLIST=""
if [ -r /etc/qubes-suspend-module-blacklist ]; then
MODULES_BLACKLIST="$MODULES_BLACKLIST $(grep -v '^#' /etc/qubes-suspend-module-blacklist)"
fi
if [ -r /rw/config/suspend-module-blacklist ]; then
MODULES_BLACKLIST="$MODULES_BLACKLIST $(grep -v '^#' /rw/config/suspend-module-blacklist)"
fi
if [ x"$action" = x"suspend" ]; then
if qsvc network-manager ; then
dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.NetworkManager.Sleep boolean:true || \
service NetworkManager stop
fi
# Force interfaces down, just in case when NM didn't done it
for intf in /sys/class/net/*; do
intf=$(basename "$intf")
if [ "$intf" = "lo" ] || [[ "$intf" = "vif"* ]]; then
continue
fi
if [ "$(cat "/sys/class/net/$intf/device/devtype" 2>/dev/null$)" = "vif" ]; then
continue
fi
ip l s "$intf" down
done
# detach all drivers from PCI devices (the real ones, not emulated by qemu)
echo -n > /var/run/qubes-suspend-pci-devs-detached
for dev_path in /sys/bus/pci/devices/*; do
subsystem_vendor=$(cat "$dev_path/subsystem_vendor")
vendor=$(cat "$dev_path/vendor")
class=$(cat "$dev_path/class")
# skip qemu emulated devs
if [ "$subsystem_vendor" = "0x1af4" ] || [ "$subsystem_vendor" = "0x5853" ]; then
continue
fi
# skip Intel Graphics Device
if [ "$vendor" = "0x8086" ] && [ "$class" = "0x030000" ]; then
continue
fi
if ! [ -e "$dev_path/driver" ]; then
continue
fi
bdf=$(basename "$dev_path")
driver_path=$(readlink -f "$dev_path/driver")
echo "$bdf" > "$driver_path/unbind"
echo "$bdf $driver_path" >> /var/run/qubes-suspend-pci-devs-detached
done
LOADED_MODULES=""
for mod in $MODULES_BLACKLIST; do
if lsmod |grep -q "$mod"; then
LOADED_MODULES="$LOADED_MODULES $mod"
modprobe -r "$mod"
fi
done
echo "$LOADED_MODULES" > /var/run/qubes-suspend-modules-loaded
else
# shellcheck disable=SC2013
for mod in $(cat /var/run/qubes-suspend-modules-loaded); do
modprobe "$mod"
done
rm -f /var/run/qubes-suspend-modules-loaded
while read -r dev driver_path; do
echo "$dev" > "$driver_path/bind"
done < /var/run/qubes-suspend-pci-devs-detached
rm -f /var/run/qubes-suspend-pci-devs-detached
if qsvc network-manager ; then
dbus-send --system --print-reply \
--dest=org.freedesktop.NetworkManager \
/org/freedesktop/NetworkManager \
org.freedesktop.NetworkManager.Sleep boolean:false || \
{ under_systemd && systemctl start NetworkManager.service; } || service qubes-core-netvm start
fi
fi