Skip to content

Instantly share code, notes, and snippets.

@cmtsij
Last active March 20, 2024 09:14
Show Gist options
  • Save cmtsij/f0d0be209224a7bdd67592695e1427de to your computer and use it in GitHub Desktop.
Save cmtsij/f0d0be209224a7bdd67592695e1427de to your computer and use it in GitHub Desktop.
tailscale completion
#!/bin/bash
# tailscale completion -*- shell-script -*-
_tailscale()
{
local cur prev words cword
_init_completion -n = || return
if [[ $cword -eq 1 ]]; then
SUBCOMMANDS=$(tailscale --help 2>&1 | awk '/SUBCOMMANDS/{ f = 1; next } /FLAGS/{ f = 0 } f{print $1}')
SUBCOMMANDS="$SUBCOMMANDS debug"
FLAGS="-h --help --socket"
COMPREPLY=( $(compgen -W "$SUBCOMMANDS $FLAGS" -- "$cur" ))
return
else
subcmd="${COMP_WORDS[1]}"
if [[ "$cur" = *=* ]]; then
COMPREPLY=( $(compgen -W 'false' -- "${cur#*=}") )
return
elif [[ "$cur" = -* ]]; then
FLAGS=$(tailscale "$subcmd" --help 2>&1 | awk '/FLAGS/{ f = 1; next } f' | grep -oE -- '--[^ ]+[=]?' | tr -d ',')
FLAGS="$FLAGS --help"
COMPREPLY=( $(compgen -W "$FLAGS" -- "$cur" ))
return
else
case "$subcmd" in
"ping"|"ssh")
IP_AND_HOSTNAME=$(tailscale status 2>&1 | awk '{print $1"\n"$2}')
COMPREPLY=( $(compgen -W "$IP_AND_HOSTNAME" -- "$cur" ))
;;
"debug")
SUBCOMMANDS=""
if [[ $cword -eq 2 ]]; then
SUBCOMMANDS=$(tailscale "$subcmd" --help 2>&1 | awk '/SUBCOMMANDS/{ f = 1; next } /FLAGS/{ f = 0 } f{print $1}')
fi
FLAGS=$(tailscale "$subcmd" --help 2>&1 | awk '/FLAGS/{ f = 1; next } f' | grep -oE -- '--[^ ]+[=]?' | tr -d ',')
COMPREPLY=( $(compgen -W "$SUBCOMMANDS $FLAGS" -- "$cur" ))
;;
esac
fi
fi
}
complete -F _tailscale tailscale
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment