mirror of
https://github.com/winapps-org/winapps.git
synced 2025-06-02 05:07:19 +02:00
Added ability to auto-pause following period of inactivity.
This commit is contained in:
parent
2f8cf846ea
commit
3b8565fa46
@ -302,6 +302,8 @@ RDP_PASS="MyWindowsPassword"
|
|||||||
#RDP_FLAGS=""
|
#RDP_FLAGS=""
|
||||||
#MULTIMON="true"
|
#MULTIMON="true"
|
||||||
#DEBUG="true"
|
#DEBUG="true"
|
||||||
|
#AUTOPAUSE="on" # Acceptable values are 'on' and 'off'.
|
||||||
|
#AUTOPAUSE_TIME="300" # Seconds before pausing Windows due to inactivity. Ignored if AUTOPAUSE 'off'.
|
||||||
#FREERDP_COMMAND="xfreerdp"
|
#FREERDP_COMMAND="xfreerdp"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
91
bin/winapps
91
bin/winapps
@ -46,11 +46,33 @@ WAFLAVOR="docker"
|
|||||||
RDP_FLAGS=""
|
RDP_FLAGS=""
|
||||||
FREERDP_COMMAND=""
|
FREERDP_COMMAND=""
|
||||||
RDP_SCALE=100
|
RDP_SCALE=100
|
||||||
|
AUTOPAUSE="on"
|
||||||
|
AUTOPAUSE_TIME="300"
|
||||||
MULTIMON="false"
|
MULTIMON="false"
|
||||||
DEBUG="true"
|
DEBUG="true"
|
||||||
MULTI_FLAG=""
|
MULTI_FLAG=""
|
||||||
|
|
||||||
|
# OTHER
|
||||||
|
FREERDP_PID=-1
|
||||||
|
|
||||||
|
### TRAPS ###
|
||||||
|
# Catch SIGINT (CTRL+C) to call 'waCleanUp'.
|
||||||
|
trap waCleanUp SIGINT
|
||||||
|
|
||||||
### FUNCTIONS ###
|
### FUNCTIONS ###
|
||||||
|
# Name: 'waCleanUp'
|
||||||
|
# Role: Clean up remains prior to exit.
|
||||||
|
waCleanUp() {
|
||||||
|
# Kill FreeRDP.
|
||||||
|
[ "$FREERDP_PID" -gt 0 ] && kill -9 "$FREERDP_PID" &>/dev/null
|
||||||
|
|
||||||
|
# Remove '.cproc' file.
|
||||||
|
[ -f "${APPDATA_PATH}/FreeRDP_Process_${FREERDP_PID}.cproc" ] && rm "${APPDATA_PATH}/FreeRDP_Process_${FREERDP_PID}.cproc" &>/dev/null
|
||||||
|
|
||||||
|
# Terminate script.
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
# Name: 'waThrowExit'
|
# Name: 'waThrowExit'
|
||||||
# Role: Throw an error message and exit the script.
|
# Role: Throw an error message and exit the script.
|
||||||
function waThrowExit() {
|
function waThrowExit() {
|
||||||
@ -285,6 +307,11 @@ function waCheckVMRunning() {
|
|||||||
dprint "WINDOWS SHUT OFF. BOOTING WINDOWS."
|
dprint "WINDOWS SHUT OFF. BOOTING WINDOWS."
|
||||||
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Booting Windows."
|
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Booting Windows."
|
||||||
virsh start "$VM_NAME" &>/dev/null || EXIT_STATUS=$EC_FAIL_START
|
virsh start "$VM_NAME" &>/dev/null || EXIT_STATUS=$EC_FAIL_START
|
||||||
|
if (virsh list --state-paused --name | xargs | grep -wq "$VM_NAME"); then
|
||||||
|
dprint "WINDOWS PAUSED. RESUMING WINDOWS."
|
||||||
|
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Resuming Windows."
|
||||||
|
virsh resume "$VM_NAME" &>/dev/null || EXIT_STATUS=$EC_FAIL_RESUME
|
||||||
|
fi
|
||||||
elif (virsh list --state-paused --name | xargs | grep -wq "$VM_NAME"); then
|
elif (virsh list --state-paused --name | xargs | grep -wq "$VM_NAME"); then
|
||||||
dprint "WINDOWS PAUSED. RESUMING WINDOWS."
|
dprint "WINDOWS PAUSED. RESUMING WINDOWS."
|
||||||
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Resuming Windows."
|
notify-send --expire-time=4000 --icon="dialog-info" --app-name="WinApps" --urgency="low" "WinApps" "Resuming Windows."
|
||||||
@ -476,6 +503,9 @@ function waRunCommand() {
|
|||||||
/wm-class:"Microsoft Windows" \
|
/wm-class:"Microsoft Windows" \
|
||||||
/t:"Windows RDP Session [$RDP_IP]" \
|
/t:"Windows RDP Session [$RDP_IP]" \
|
||||||
/v:"$RDP_IP" &>/dev/null &
|
/v:"$RDP_IP" &>/dev/null &
|
||||||
|
|
||||||
|
# Capture the process ID.
|
||||||
|
FREERDP_PID=$!
|
||||||
elif [ "$1" = "manual" ]; then
|
elif [ "$1" = "manual" ]; then
|
||||||
# Open specified application.
|
# Open specified application.
|
||||||
dprint "MANUAL: ${2}"
|
dprint "MANUAL: ${2}"
|
||||||
@ -494,6 +524,9 @@ function waRunCommand() {
|
|||||||
"$MULTI_FLAG" \
|
"$MULTI_FLAG" \
|
||||||
/app:program:"$2" \
|
/app:program:"$2" \
|
||||||
/v:"$RDP_IP" &>/dev/null &
|
/v:"$RDP_IP" &>/dev/null &
|
||||||
|
|
||||||
|
# Capture the process ID.
|
||||||
|
FREERDP_PID=$!
|
||||||
else
|
else
|
||||||
# Script summoned from right-click menu with officially supported application name plus/minus a file path.
|
# Script summoned from right-click menu with officially supported application name plus/minus a file path.
|
||||||
if [ -e "${SCRIPT_DIR_PATH}/../apps/${1}/info" ]; then
|
if [ -e "${SCRIPT_DIR_PATH}/../apps/${1}/info" ]; then
|
||||||
@ -530,6 +563,9 @@ function waRunCommand() {
|
|||||||
/wm-class:"$FULL_NAME" \
|
/wm-class:"$FULL_NAME" \
|
||||||
/app:program:"$WIN_EXECUTABLE",icon:"$ICON",name:"$FULL_NAME" \
|
/app:program:"$WIN_EXECUTABLE",icon:"$ICON",name:"$FULL_NAME" \
|
||||||
/v:"$RDP_IP" &>/dev/null &
|
/v:"$RDP_IP" &>/dev/null &
|
||||||
|
|
||||||
|
# Capture the process ID.
|
||||||
|
FREERDP_PID=$!
|
||||||
else
|
else
|
||||||
# Convert path from UNIX to Windows style.
|
# Convert path from UNIX to Windows style.
|
||||||
FILE_PATH=$(echo "$2" | sed \
|
FILE_PATH=$(echo "$2" | sed \
|
||||||
@ -554,6 +590,57 @@ function waRunCommand() {
|
|||||||
/wm-class:"$FULL_NAME" \
|
/wm-class:"$FULL_NAME" \
|
||||||
/app:program:"$WIN_EXECUTABLE",icon:"$ICON",name:$"FULL_NAME",cmd:\""$FILE_PATH"\" \
|
/app:program:"$WIN_EXECUTABLE",icon:"$ICON",name:$"FULL_NAME",cmd:\""$FILE_PATH"\" \
|
||||||
/v:"$RDP_IP" &>/dev/null &
|
/v:"$RDP_IP" &>/dev/null &
|
||||||
|
|
||||||
|
# Capture the process ID.
|
||||||
|
FREERDP_PID=$!
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$FREERDP_PID" -ne -1 ]; then
|
||||||
|
# Create a file with the process ID.
|
||||||
|
touch "${APPDATA_PATH}/FreeRDP_Process_${FREERDP_PID}.cproc"
|
||||||
|
|
||||||
|
# Wait for the process to terminate.
|
||||||
|
# Note: RemoteApp sessions take, at minimum, 20 seconds to be terminated by the Windows server.
|
||||||
|
# Source: https://techcommunity.microsoft.com/t5/security-compliance-and-identity/terminal-services-remoteapp-8482-session-termination-logic/ba-p/246566
|
||||||
|
wait $FREERDP_PID
|
||||||
|
|
||||||
|
# Remove the file with the process ID.
|
||||||
|
rm "${APPDATA_PATH}/FreeRDP_Process_${FREERDP_PID}.cproc" &>/dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Name: 'waCheckIdle'
|
||||||
|
# Role: Suspend Windows if idle.
|
||||||
|
function waCheckIdle() {
|
||||||
|
# Declare variables
|
||||||
|
local TIME_INTERVAL=10
|
||||||
|
local TIME_ELAPSED=0
|
||||||
|
local SUSPEND_WINDOWS=0
|
||||||
|
|
||||||
|
# Check if there are no WinApps-related FreeRDP processes running.
|
||||||
|
if ! ls "$APPDATA_PATH"/FreeRDP_Process_*.cproc &>/dev/null; then
|
||||||
|
SUSPEND_WINDOWS=1
|
||||||
|
while (( TIME_ELAPSED < AUTOPAUSE_TIME )); do
|
||||||
|
if ls "$APPDATA_PATH"/FreeRDP_Process_*.cproc &>/dev/null; then
|
||||||
|
SUSPEND_WINDOWS=0
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep $TIME_INTERVAL
|
||||||
|
TIME_ELAPSED=$((TIME_ELAPSED + TIME_INTERVAL))
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Hibernate/Pause Windows.
|
||||||
|
if [ "$SUSPEND_WINDOWS" -eq 1 ]; then
|
||||||
|
dprint "IDLE FOR ${AUTOPAUSE_TIME} SECONDS. SUSPENDING WINDOWS."
|
||||||
|
notify-send --expire-time=8000 --icon="info" --app-name="WinApps" --urgency="low" "WinApps" "Pausing Windows due to inactivity."
|
||||||
|
if [ "$WAFLAVOR" = "docker" ]; then
|
||||||
|
docker compose --file "$COMPOSE_PATH" pause &>/dev/null
|
||||||
|
elif [ "$WAFLAVOR" = "podman" ]; then
|
||||||
|
podman-compose --file "$COMPOSE_PATH" pause &>/dev/null
|
||||||
|
elif [ "$WAFLAVOR" = "libvirt" ]; then
|
||||||
|
virsh suspend "$VM_NAME" &>/dev/null
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -587,4 +674,8 @@ fi
|
|||||||
waCheckPortOpen
|
waCheckPortOpen
|
||||||
waRunCommand "$@"
|
waRunCommand "$@"
|
||||||
|
|
||||||
|
if [[ "$AUTOPAUSE" == "on" ]]; then
|
||||||
|
waCheckIdle
|
||||||
|
fi
|
||||||
|
|
||||||
dprint "END"
|
dprint "END"
|
||||||
|
@ -82,6 +82,8 @@ RDP_PASS=\"MyWindowsPassword\"
|
|||||||
#RDP_FLAGS=\"\"
|
#RDP_FLAGS=\"\"
|
||||||
#MULTIMON=\"true\"
|
#MULTIMON=\"true\"
|
||||||
#DEBUG=\"true\"
|
#DEBUG=\"true\"
|
||||||
|
#AUTOPAUSE=\"on\" # Acceptable values are 'on' and 'off'.
|
||||||
|
#AUTOPAUSE_TIME=\"300\" # Seconds before pausing Windows due to inactivity. Ignored if AUTOPAUSE 'off'.
|
||||||
#FREERDP_COMMAND=\"xfreerdp\""
|
#FREERDP_COMMAND=\"xfreerdp\""
|
||||||
|
|
||||||
### GLOBAL VARIABLES ###
|
### GLOBAL VARIABLES ###
|
||||||
|
Loading…
x
Reference in New Issue
Block a user