From 782c364f4dd6af7bfc6501caed18a378f6fe9410 Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Mon, 1 Jul 2024 16:38:31 +1000 Subject: [PATCH 1/4] Improved detection of running VMs. --- bin/winapps | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/winapps b/bin/winapps index fdfc653..2cfe6c4 100755 --- a/bin/winapps +++ b/bin/winapps @@ -65,8 +65,8 @@ if [ -z "$RDP_IP" ]; then echo " sudo usermod -a -G kvm $(whoami)" exit fi - if virsh list | grep -vq RDPWindows; then - echo "RDPWindows is not running, run:" + if ! virsh list --state-running --name | grep -q '^RDPWindows$'; then + echo "RDPWindows is not running. Please run:" echo " virsh start RDPWindows" exit fi From 07d726f964449f80c8aeaaa4889b11d8df67e236 Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Mon, 1 Jul 2024 21:36:02 +1000 Subject: [PATCH 2/4] Convert FreeRDP command to array format. --- bin/winapps | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/bin/winapps b/bin/winapps index 2cfe6c4..f47a887 100755 --- a/bin/winapps +++ b/bin/winapps @@ -4,6 +4,7 @@ if [ ! -f "$HOME/.config/winapps/winapps.conf" ] && [ ! -f "$HOME/.winapps" ]; t echo "You need to create a ~/.config/winapps/winapps.conf configuration. Exiting..." exit fi + DIR="$(dirname "$(readlink -f "$0")")" RUN="$(date)-$RANDOM" @@ -72,7 +73,6 @@ if [ -z "$RDP_IP" ]; then fi RDP_IP=$(virsh net-dhcp-leases default | grep RDPWindows | awk '{print $5}') RDP_IP=${RDP_IP%%\/*} - fi dprint "1:$1" @@ -86,18 +86,23 @@ if [ "$MULTIMON" = "true" ]; then MULTI_FLAG="/multimon" fi +# Append additional flags or parameters to FreeRDP if [[ -n "$RDP_FLAGS" ]]; then FREERDP_COMMAND="$FREERDP_COMMAND $RDP_FLAGS" fi if [ "$1" = "windows" ]; then - $FREERDP_COMMAND /d:"$RDP_DOMAIN" /u:"$RDP_USER" /p:"$RDP_PASS" /scale:$RDP_SCALE +dynamic-resolution +auto-reconnect +home-drive /wm-class:"Microsoft Windows" /v:"$RDP_IP" 1>/dev/null 2>&1 & + dprint "WINDOWS" + COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+dynamic-resolution" "+auto-reconnect" "+home-drive" "/wm-class:\"Microsoft Windows\"" "/v:${RDP_IP}") + "${COMMAND[@]}" 1>/dev/null 2>&1 & elif [ "$1" = "check" ]; then dprint "CHECK" - $FREERDP_COMMAND /d:"$RDP_DOMAIN" /u:"$RDP_USER" /p:"$RDP_PASS" /scale:$RDP_SCALE +auto-reconnect +home-drive -wallpaper +dynamic-resolution $MULTI_FLAG /app:program:"explorer.exe" /v:"$RDP_IP" + COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+auto-reconnect" "+home-drive" "-wallpaper" "+dynamic-resolution" "${MULTI_FLAG}" "/app:program:explorer.exe" "/v:${RDP_IP}") + "${COMMAND[@]}" elif [ "$1" = "manual" ]; then - dprint "MANUAL:$2" - $FREERDP_COMMAND /d:"$RDP_DOMAIN" /u:"$RDP_USER" /p:"$RDP_PASS" /scale:$RDP_SCALE +auto-reconnect +home-drive +dynamic-resolution $MULTI_FLAG /app:program:"$2" /v:"$RDP_IP" 1>/dev/null 2>&1 & + dprint "MANUAL:${2}" + COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+auto-reconnect" "+home-drive" "+dynamic-resolution" "${MULTI_FLAG}" "/app:program:${2}" "/v:${RDP_IP}") + "${COMMAND[@]}" 1>/dev/null 2>&1 & elif [ "$1" != "install" ]; then dprint "DIR:${DIR}" if [ -e "${DIR}/../apps/$1/info" ]; then @@ -121,9 +126,11 @@ elif [ "$1" != "install" ]; then FILE=$(echo "$2" | sed 's|'"$HOME"'|\\\\tsclient\\home|;s|/|\\|g;s|\\|\\\\|g') dprint "FILE:${FILE}" # shellcheck disable=SC2140 - $FREERDP_COMMAND /d:"$RDP_DOMAIN" /u:"$RDP_USER" /p:"$RDP_PASS" /scale:$RDP_SCALE +auto-reconnect +clipboard +home-drive -wallpaper +dynamic-resolution $MULTI_FLAG /wm-class:"$FULL_NAME" /app:program:"$WIN_EXECUTABLE",icon:"$ICON",name:"$FULL_NAME",cmd:"\"$FILE\"" /v:"$RDP_IP" 1>/dev/null 2>&1 & + COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+auto-reconnect" "+clipboard" "+home-drive" "-wallpaper" "+dynamic-resolution" "${MULTI_FLAG}" "/wm-class:${FULL_NAME}" "/app:program:${WIN_EXECUTABLE},icon:${ICON},name:${FULL_NAME},cmd:\"${FILE}\"" "/v:${RDP_IP}") + "${COMMAND[@]}" 1>/dev/null 2>&1 & else - $FREERDP_COMMAND /d:"$RDP_DOMAIN" /u:"$RDP_USER" /p:"$RDP_PASS" /scale:$RDP_SCALE +auto-reconnect +clipboard +home-drive -wallpaper +dynamic-resolution $MULTI_FLAG /wm-class:"$FULL_NAME" /app:program:"$WIN_EXECUTABLE",icon:"$ICON",name:"$FULL_NAME" /v:"$RDP_IP" 1>/dev/null 2>&1 & + COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+auto-reconnect" "+clipboard" "+home-drive" "-wallpaper" "+dynamic-resolution" "${MULTI_FLAG}" "/wm-class:${FULL_NAME}" "/app:program:${WIN_EXECUTABLE},icon:${ICON},name:${FULL_NAME}" "/v:${RDP_IP}") + "${COMMAND[@]}" 1>/dev/null 2>&1 & fi fi From 5342eb75cb12671eff01cb9334db09733cb2d69b Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Mon, 1 Jul 2024 21:42:39 +1000 Subject: [PATCH 3/4] Extract VM IPv4 address using regular expression. --- bin/winapps | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/winapps b/bin/winapps index f47a887..6eedc66 100755 --- a/bin/winapps +++ b/bin/winapps @@ -71,8 +71,7 @@ if [ -z "$RDP_IP" ]; then echo " virsh start RDPWindows" exit fi - RDP_IP=$(virsh net-dhcp-leases default | grep RDPWindows | awk '{print $5}') - RDP_IP=${RDP_IP%%\/*} + RDP_IP=$(virsh net-dhcp-leases default | grep "RDPWindows" | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}') fi dprint "1:$1" From 68a7e4f7c546fa654c39835e02a5a166f3240118 Mon Sep 17 00:00:00 2001 From: Rohan Barar Date: Tue, 2 Jul 2024 08:24:22 +1000 Subject: [PATCH 4/4] Break array declarations across multiple lines to enhance readability. --- bin/winapps | 93 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 83 insertions(+), 10 deletions(-) diff --git a/bin/winapps b/bin/winapps index 6eedc66..228f397 100755 --- a/bin/winapps +++ b/bin/winapps @@ -90,17 +90,58 @@ if [[ -n "$RDP_FLAGS" ]]; then FREERDP_COMMAND="$FREERDP_COMMAND $RDP_FLAGS" fi -if [ "$1" = "windows" ]; then - dprint "WINDOWS" - COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+dynamic-resolution" "+auto-reconnect" "+home-drive" "/wm-class:\"Microsoft Windows\"" "/v:${RDP_IP}") - "${COMMAND[@]}" 1>/dev/null 2>&1 & -elif [ "$1" = "check" ]; then +if [ "$1" = "check" ]; then + # Open File Explorer dprint "CHECK" - COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+auto-reconnect" "+home-drive" "-wallpaper" "+dynamic-resolution" "${MULTI_FLAG}" "/app:program:explorer.exe" "/v:${RDP_IP}") + COMMAND=( + "${FREERDP_COMMAND}" + "/d:${RDP_DOMAIN}" + "/u:${RDP_USER}" + "/p:${RDP_PASS}" + "/scale:${RDP_SCALE}" + "+auto-reconnect" + "+home-drive" + "-wallpaper" + "+dynamic-resolution" + "${MULTI_FLAG}" + "/app:program:explorer.exe" + "/v:${RDP_IP}" + ) "${COMMAND[@]}" +elif [ "$1" = "windows" ]; then + # Open Virtual Machine + dprint "WINDOWS" + COMMAND=( + "${FREERDP_COMMAND}" + "/d:${RDP_DOMAIN}" + "/u:${RDP_USER}" + "/p:${RDP_PASS}" + "/scale:${RDP_SCALE}" + "+dynamic-resolution" + "+auto-reconnect" + "+home-drive" + "/wm-class:\"Microsoft Windows\"" + "/v:${RDP_IP}" + ) + # Run the command in the background, redirecting both stdout and stderr to /dev/null + "${COMMAND[@]}" 1>/dev/null 2>&1 & elif [ "$1" = "manual" ]; then + # Open Specified Application dprint "MANUAL:${2}" - COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+auto-reconnect" "+home-drive" "+dynamic-resolution" "${MULTI_FLAG}" "/app:program:${2}" "/v:${RDP_IP}") + COMMAND=( + "${FREERDP_COMMAND}" + "/d:${RDP_DOMAIN}" + "/u:${RDP_USER}" + "/p:${RDP_PASS}" + "/scale:${RDP_SCALE}" + "+auto-reconnect" + "+home-drive" + "+dynamic-resolution" + "${MULTI_FLAG}" + "/app:program:${2}" + "/v:${RDP_IP}" + ) + # Run the command in the background, redirecting both stdout and stderr to /dev/null "${COMMAND[@]}" 1>/dev/null 2>&1 & elif [ "$1" != "install" ]; then dprint "DIR:${DIR}" @@ -125,10 +166,42 @@ elif [ "$1" != "install" ]; then FILE=$(echo "$2" | sed 's|'"$HOME"'|\\\\tsclient\\home|;s|/|\\|g;s|\\|\\\\|g') dprint "FILE:${FILE}" # shellcheck disable=SC2140 - COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+auto-reconnect" "+clipboard" "+home-drive" "-wallpaper" "+dynamic-resolution" "${MULTI_FLAG}" "/wm-class:${FULL_NAME}" "/app:program:${WIN_EXECUTABLE},icon:${ICON},name:${FULL_NAME},cmd:\"${FILE}\"" "/v:${RDP_IP}") - "${COMMAND[@]}" 1>/dev/null 2>&1 & + COMMAND=( + "${FREERDP_COMMAND}" + "/d:${RDP_DOMAIN}" + "/u:${RDP_USER}" + "/p:${RDP_PASS}" + "/scale:${RDP_SCALE}" + "+auto-reconnect" + "+clipboard" + "+home-drive" + "-wallpaper" + "+dynamic-resolution" + "${MULTI_FLAG}" + "/wm-class:${FULL_NAME}" + "/app:program:${WIN_EXECUTABLE},icon:${ICON},name:${FULL_NAME},cmd:\"${FILE}\"" + "/v:${RDP_IP}" + ) + # Run the command in the background, redirecting both stdout and stderr to /dev/null + echo "${COMMAND[@]}" #1>/dev/null 2>&1 & else - COMMAND=("${FREERDP_COMMAND}" "/d:${RDP_DOMAIN}" "/u:${RDP_USER}" "/p:${RDP_PASS}" "/scale:${RDP_SCALE}" "+auto-reconnect" "+clipboard" "+home-drive" "-wallpaper" "+dynamic-resolution" "${MULTI_FLAG}" "/wm-class:${FULL_NAME}" "/app:program:${WIN_EXECUTABLE},icon:${ICON},name:${FULL_NAME}" "/v:${RDP_IP}") + COMMAND=( + "${FREERDP_COMMAND}" + "/d:${RDP_DOMAIN}" + "/u:${RDP_USER}" + "/p:${RDP_PASS}" + "/scale:${RDP_SCALE}" + "+auto-reconnect" + "+clipboard" + "+home-drive" + "-wallpaper" + "+dynamic-resolution" + "${MULTI_FLAG}" + "/wm-class:${FULL_NAME}" + "/app:program:${WIN_EXECUTABLE},icon:${ICON},name:${FULL_NAME}" + "/v:${RDP_IP}" + ) + # Run the command in the background, redirecting both stdout and stderr to /dev/null "${COMMAND[@]}" 1>/dev/null 2>&1 & fi fi