#!/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
    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
    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