bashrc: Support filtering tailscale nodes
parent
400650504b
commit
293826355f
33
bash/.bashrc
33
bash/.bashrc
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue