Files
BackTunnel/scripts/backtunnel-access-gui

95 lines
3.6 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (c) 2025 LUXIM d.o.o., Slovenia
# Author: Matjaž Mozetič
#
# Name: backtunnel-access-gui
# Summary: KDE/GUI wrapper to mount a BackTunnel share with dialogs and logging.
# Description:
# GUI front-end that prompts for remote, tunnel port, and mount point using kdialog,
# then launches backtunnel-access in a terminal (Konsole/xterm) to perform the mount.
# Prefills fields from BackTunnel profiles.ini when available (read-only, best-effort).
# All output is logged to /tmp/backtunnel-access-gui.<uid>.log for troubleshooting.
#
# Usage:
# backtunnel-access-gui <selected-folder>
#
# Examples:
# backtunnel-access-gui ~/Downloads
#
# Dependencies:
# - bash
# - kdialog (for GUI prompts)
# - konsole or xterm (preferred terminals; falls back to background run if missing)
# - awk (for simple INI parsing), tee
# - backtunnel-access (invoked to perform the actual mount)
#
# Exit codes:
# 0 command launched (terminal or background)
# 1 invalid usage or no folder selected
#
# Notes:
# - Profiles are used only to prefill fields (access side does not support @profile directly).
# - If no terminal emulator is available, runs in background and shows a message with the log path.
set -euo pipefail
LOG="/tmp/backtunnel-access-gui.$UID.log"
exec > >(tee -a "$LOG") 2>&1
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PATH:-}"
FOLDER="${1:-}"
if [[ -z "$FOLDER" ]]; then
kdialog --error "No folder selected." || true
exit 1
fi
# Defaults
REMOTE_DEFAULT="user@vps.example.com"
PORT_DEFAULT="2222"
MOUNT_DEFAULT="/mnt/remote-rssh"
# Profiles (read-only prefill; access side does not use @profile)
PROFILES_USER="${XDG_CONFIG_HOME:-$HOME/.config}/backtunnel/profiles.ini"
PROFILES_SYS="/etc/backtunnel/profiles.ini"
PROFILES_PKG="/usr/share/backtunnel/profiles.ini"
if [[ -f "$PROFILES_USER" ]]; then PROFILES_FILE="$PROFILES_USER"
elif [[ -f "$PROFILES_SYS" ]]; then PROFILES_FILE="$PROFILES_SYS"
else PROFILES_FILE="$PROFILES_PKG"
fi
if [[ -f "$PROFILES_FILE" ]]; then
# pick one to prefill user@host (optional)
mapfile -t profs < <(awk '/^\[/{gsub(/^\[|\]$/,"",$1); if ($1!="default") print $1}' "$PROFILES_FILE")
if (( ${#profs[@]} )); then
choice="$(kdialog --combobox "Prefill from profile (optional)" "${profs[@]}")" || choice=""
if [[ -n "$choice" ]]; then
getval() { awk -v s="[""$choice""]" -v k="$1" '
$0==s{ok=1; next} /^\[/{ok=0}
ok && $0 ~ /^[[:alnum:]_.-]+[[:space:]]*=/ {
line=$0; sub(/[[:space:]]*=[[:space:]]*/, "=", line)
split(line,a,"="); if(a[1]==k){val=substr(line,index(line,"=")+1); gsub(/^[[:space:]]+|[[:space:]]+$/,"",val); print val; exit}
}' "$PROFILES_FILE" 2>/dev/null; }
u="$(getval user)"; h="$(getval host)"; p="$(getval tunnel_port)"; m="$(getval invite_mount)"
[[ -n "$u" && -n "$h" ]] && REMOTE_DEFAULT="$u@$h"
[[ -n "$p" ]] && PORT_DEFAULT="$p"
[[ -n "$m" ]] && MOUNT_DEFAULT="$m"
fi
fi
fi
REMOTE="$(kdialog --inputbox "Remote (user@host or user:host):" "$REMOTE_DEFAULT")" || exit 0
PORT="$(kdialog --inputbox "Tunnel port on remote:" "$PORT_DEFAULT")" || exit 0
MP="$(kdialog --getexistingdirectory --title "Choose mount point" "$MOUNT_DEFAULT")" || exit 0
cmd=( backtunnel-access "$FOLDER" from "$REMOTE" -p "$PORT" -m "$MP" )
if command -v konsole >/dev/null 2>&1; then
exec konsole --noclose -e "${cmd[@]}"
elif command -v xterm >/dev/null 2>&1; then
exec xterm -hold -e "${cmd[@]}"
else
nohup "${cmd[@]}" >>"$LOG" 2>&1 &
kdialog --msgbox "Mount started in background.\nSee log: $LOG"
fi