rdp-client/files/rdp-launcher.sh

239 lines
6.4 KiB
Bash

#!/bin/bash
# RDP Launcher - Startet RDP-Verbindungen aus Profilen
# Speichere als: files/rdp-launcher.sh
CONFIG_FILE="$HOME/.config/rdp-profiles/profiles.ini"
PROFILE_NAME="$1"
# Funktion zum sicheren Starten des Profile Managers (ohne Doppelstart)
start_profile_manager() {
# Prüfe ob Manager bereits läuft
if pgrep -f "rdp-profile-manager.py" > /dev/null; then
echo "Profile Manager is already running"
return
fi
/usr/local/bin/rdp-profile-manager.py &
}
# Finde FreeRDP binary (Debian 12 = xfreerdp, Debian 13 = xfreerdp3)
# Prüfe ZUERST auf xfreerdp3, da es auch einen xfreerdp-Symlink geben könnte
if command -v xfreerdp3 &> /dev/null; then
FREERDP_CMD="xfreerdp3"
FREERDP_VERSION=3
elif command -v xfreerdp &> /dev/null; then
FREERDP_CMD="xfreerdp"
FREERDP_VERSION=2
else
zenity --error --text="FreeRDP nicht gefunden! Bitte installieren." 2>/dev/null
echo "ERROR: FreeRDP not found"
exit 1
fi
echo "Using $FREERDP_CMD (Version $FREERDP_VERSION)"
# Funktion zum Auslesen von INI-Werten
get_ini_value() {
local section="$1"
local key="$2"
local default="$3"
value=$(awk -F ' *= *' -v section="$section" -v key="$key" '
/^\[.*\]$/ {
gsub(/^\[|\]$/, "", $0)
current_section = $0
next
}
current_section == section && $1 == key {
# Remove leading/trailing whitespace from value
gsub(/^[ \t]+|[ \t]+$/, "", $2)
print $2
exit
}
' "$CONFIG_FILE")
echo "${value:-$default}"
}
# Wenn kein Profil angegeben, starte Profile Manager
if [ -z "$PROFILE_NAME" ]; then
# Check if profiles exist
if [ ! -s "$CONFIG_FILE" ] || ! grep -q '^\[' "$CONFIG_FILE"; then
# No profiles, start manager
start_profile_manager
exit 0
fi
# Suche nach Autostart-Profil
PROFILE_NAME=$(awk -F'[][]' '
/^\[/ { section=$2 }
/^autostart[[:space:]]*=[[:space:]]*[Tt]rue/ && section { print section; exit }
' "$CONFIG_FILE")
# Wenn kein Autostart-Profil gefunden, starte Manager
if [ -z "$PROFILE_NAME" ]; then
echo "No autostart profile found, starting Profile Manager..."
start_profile_manager
exit 0
fi
echo "Starting autostart profile: $PROFILE_NAME"
fi
# Funktion zum sicheren Starten des Profile Managers (ohne Doppelstart)
start_profile_manager() {
# Prüfe ob Manager bereits läuft
if pgrep -f "rdp-profile-manager.py" > /dev/null; then
echo "Profile Manager is already running"
return
fi
/usr/local/bin/rdp-profile-manager.py &
}
# Lese Profil-Konfiguration
SERVER=$(get_ini_value "$PROFILE_NAME" "server")
USERNAME=$(get_ini_value "$PROFILE_NAME" "username")
DOMAIN=$(get_ini_value "$PROFILE_NAME" "domain")
RESOLUTION=$(get_ini_value "$PROFILE_NAME" "resolution" "client")
MULTIMON=$(get_ini_value "$PROFILE_NAME" "multimon" "False")
REDIRECT_AUDIO=$(get_ini_value "$PROFILE_NAME" "redirect_audio" "True")
REDIRECT_MIC=$(get_ini_value "$PROFILE_NAME" "redirect_microphone" "True")
REDIRECT_USB=$(get_ini_value "$PROFILE_NAME" "redirect_usb" "True")
REDIRECT_SMARTCARD=$(get_ini_value "$PROFILE_NAME" "redirect_smartcard" "True")
REDIRECT_PRINTERS=$(get_ini_value "$PROFILE_NAME" "redirect_printers" "False")
if [ -z "$SERVER" ]; then
zenity --error --text="Profil '$PROFILE_NAME' nicht gefunden!" 2>/dev/null || \
echo "ERROR: Profile '$PROFILE_NAME' not found!"
exit 1
fi
# Wenn kein Username hinterlegt, frage danach
if [ -z "$USERNAME" ]; then
USERNAME=$(zenity --entry --title="Benutzername" --text="Benutzername für $SERVER:" 2>/dev/null)
if [ -z "$USERNAME" ]; then
echo "Aborted: No username provided"
start_profile_manager
exit 0
fi
fi
# Baue FreeRDP-Befehl
CMD="$FREERDP_CMD"
# Server und Benutzer
CMD="$CMD /v:$SERVER"
CMD="$CMD /u:$USERNAME"
if [ -n "$DOMAIN" ]; then
CMD="$CMD /d:$DOMAIN"
fi
# Auflösung
if [ "$RESOLUTION" = "client" ]; then
CMD="$CMD /dynamic-resolution"
# smart-sizing nur bei FreeRDP2
if [ "$FREERDP_VERSION" -eq 2 ]; then
CMD="$CMD /smart-sizing"
fi
else
CMD="$CMD /size:$RESOLUTION"
fi
# Multi-Monitor
if [ "$MULTIMON" = "True" ] || [ "$MULTIMON" = "true" ]; then
CMD="$CMD /multimon"
echo "Multi-Monitor mode enabled"
fi
# Audio
if [ "$REDIRECT_AUDIO" = "True" ]; then
CMD="$CMD /audio-mode:0"
CMD="$CMD /sound:sys:pulse"
else
CMD="$CMD /audio-mode:2"
fi
# Mikrofon
if [ "$REDIRECT_MIC" = "True" ]; then
CMD="$CMD /microphone:sys:pulse"
fi
# USB-Geräte
if [ "$REDIRECT_USB" = "True" ]; then
if [ "$FREERDP_VERSION" -eq 3 ]; then
# FreeRDP3 - USB-Geräte (Dongles, Smart Cards)
CMD="$CMD /usb:auto"
# USB-Sticks als Laufwerk durchreichen - FESTES Verzeichnis für Hotswap!
echo "Redirecting USB media directory for hotswap support..."
MEDIA_DIR="/media/rdpuser"
# Erstelle Verzeichnis falls nicht vorhanden
mkdir -p "$MEDIA_DIR"
# Reiche das komplette media-Verzeichnis durch
CMD="$CMD /drive:hotplug,*"
echo "USB Hotswap enabled: $MEDIA_DIR"
else
# FreeRDP2
CMD="$CMD /usb:id,dev:*"
MEDIA_DIR="/media/rdpuser"
mkdir -p "$MEDIA_DIR"
CMD="$CMD /drive:USB-Media,$MEDIA_DIR"
fi
fi
# Smart Cards
if [ "$REDIRECT_SMARTCARD" = "True" ]; then
CMD="$CMD /smartcard"
fi
# Drucker
if [ "$REDIRECT_PRINTERS" = "True" ]; then
CMD="$CMD /printer"
fi
# Zusätzliche Optionen
CMD="$CMD /cert:ignore"
CMD="$CMD /compression"
CMD="$CMD /clipboard"
CMD="$CMD /gfx:AVC444"
CMD="$CMD /network:auto"
# Zusätzliche Parameter nur für FreeRDP2
if [ "$FREERDP_VERSION" -eq 2 ]; then
CMD="$CMD +fonts"
CMD="$CMD +aero"
CMD="$CMD +glyph-cache"
fi
# Vollbild
CMD="$CMD /f"
# Log
echo "Connecting to: $SERVER as $USERNAME"
echo "Command: $CMD"
# Frage nach Passwort
PASSWORD=$(zenity --password --title="RDP Verbindung zu $SERVER" 2>/dev/null)
if [ -z "$PASSWORD" ]; then
echo "Aborted by user"
start_profile_manager
exit 0
fi
# Starte RDP-Verbindung
# FreeRDP3 hat Probleme mit /from-stdin, nutze /p: stattdessen
if [ "$FREERDP_VERSION" -eq 3 ]; then
$CMD /p:"$PASSWORD"
else
# FreeRDP2 mit stdin
echo "$PASSWORD" | $CMD /from-stdin
fi
# Nach Beenden der Verbindung - zeige Profile Manager wieder
/usr/local/bin/rdp-profile-manager.py &