bashrc: Support filtering tailscale nodes

master
Peter Cai 2022-10-25 20:53:02 -04:00
parent 400650504b
commit 293826355f
1 changed files with 23 additions and 10 deletions

View File

@ -47,27 +47,40 @@ function sshunlock() {
# Show a menu of all known Tailscale nodes for the user to select from
function tsselect() {
local items=()
local hostnames=()
while read -r line; do
[ -z "$line" ] && continue
[[ "$line" =~ ^\# ]] && continue
local name=$(echo "$line" | awk '{ print $2 }')
local ip=$(echo "$line" | awk '{ print $1 }')
items+=("$name ($ip)")
hostnames+=("$name")
items+=("$name")
done <<< $(tailscale status --self=false | sort -k 2)
_COLUMNS=$COLUMNS
# Force options to display in one column
COLUMNS=80
select item in "${items[@]}" Cancel; do
if [ $REPLY -eq ${#items[@]} ]; then
echo ""
fi
echo ${hostnames[$((REPLY - 1))]}
break;
while [ "${#items[@]}" -gt 1 ]; do
select item in "${items[@]}" Cancel; do
if [[ "$REPLY" =~ ^[0-9]+$ ]]; then
# Number selections -- break immediately
if [ $REPLY -eq $((1 + ${#items[@]})) ]; then
items=("")
break
elif [ $REPLY -le ${#items[@]} ]; then
items=("${items[$((REPLY - 1))]}")
break
fi
fi
# Not a number selection -- filter the items
items=($(printf "%s\n" "${items[@]}" | grep -E "^$REPLY"))
break
done
done
COLUMNS=$_COLUMNS
if ! ([[ "$REPLY" =~ ^[0-9]+$ ]] || [ "$REPLY" == "${items[0]}" ]); then
echo -n "${items[0]}? (y/n) " >&2
read yn
[ "$yn" == "y" ] || return 1
fi
echo "${items[0]}"
}
# SSH shorthands, same as before but for tailscale nodes