s3h/s3h.sh
damage 0c1c0d4788 set custom text by using ~ (tilde) in filename
foo~bar@example.org will show "foo" in s3h and connect to
"bar@example.org"
2023-12-17 20:56:55 +01:00

116 lines
2.4 KiB
Bash
Executable File

#!/bin/bash
# config
DIALOG=dialog #gdialog kdialog
START_DIR="$HOME/.s3h"
VERSION="1.4"
# TODO: use opt parsing
if [[ $# -eq 1 && "$1" == "-v" ]]; then
echo "$VERSION"
exit 0
fi
if [[ $# -eq 1 && -d "$1" ]]; then
START_DIR="$1"
fi
START_DIR=`realpath "$START_DIR"`
if [[ ! -d "$START_DIR" ]]; then
echo "start directory '$START_DIR' does not exist" >&2
echo -e "either create or set 'start directory' parameter\n" >&2
echo "Usage: $0 [start directory]" >&2
exit 2
fi
# select config file
configFile=''
while [[ -z "$configFile" ]]; do
# init dir variable
if [[ -z "$dir" ]]; then
dir="$START_DIR"
fi
# add parent selector if not already in $START_DIR
if [[ "$START_DIR" == "$dir" ]]; then
para=()
else
para=(".." "<..>")
fi
# add directory selectors
dirs=`find $dir -mindepth 1 -maxdepth 1 ! -name '.*' -type d -printf "%f\n" |sort`
for d in $dirs; do
para+=("$d" "<$d>")
done
# add file selectors
files=`find $dir -mindepth 1 -maxdepth 1 ! -name '.*' -type f -printf "%f\n" |sort`
for d in $files; do
# text before ~ is tag
if [[ "$d" == *"~"* ]]; then
tag="${d%%~*}"
para+=("$d" "$tag")
else
para+=("$d" "$d")
fi
done
if [[ ${#para[@]} -eq 0 ]]; then
echo "no file or directory found in '$dir'" >&2
echo "either create a connection file like" >&2
echo -e "\ttouch '$dir/root@example.org'" >&2
echo "or create a group by adding a directory" >&2
exit 3
fi
# run dialog
ret=$("$DIALOG" --no-tags --stdout --menu "select connection" 0 0 0 ${para[@]} 2>&1)
if [[ $? -ne 0 ]]; then
exit 1
fi
# sepcial handling of parent selector
if [[ "$ret" != ".." ]]; then
ret="$dir/$ret"
if [[ -d "$ret" ]]; then
dir=$ret
else
configFile=$ret
fi
else
dir=`dirname "$dir"`
fi
done
# read config file and connect
if [[ -f "$configFile" ]]; then
clear
# each line equals one config option
para=()
while read -r configLine; do
para+=($configLine)
done < "$configFile"
# lookup group specific option file
if [[ -f "$dir/.options" ]]; then
while read -r configLine; do
para+=($configLine)
done < "$dir/.options"
echo "using group options file '$dir/.options'"
fi
# clear screen // remove dialog colors
echo "config file '$configFile' selected. connecting..."
# extract user@host if ~ in config file name
login=`basename "$configFile"`
if [[ "$login" == *"~"* ]]; then
login="${login#*~}"
fi
# execute ssh
echo "Running 'ssh ${para[@]} $login'"
ssh ${para[@]} "$login"
fi