239 lines
6.4 KiB
Bash
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 &
|