wg: add bash completion for wg(8)
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
fd9e737c72
commit
bf158a73fe
|
@ -3,8 +3,10 @@ DESTDIR ?=
|
||||||
BINDIR ?= $(PREFIX)/bin
|
BINDIR ?= $(PREFIX)/bin
|
||||||
LIBDIR ?= $(PREFIX)/lib
|
LIBDIR ?= $(PREFIX)/lib
|
||||||
MANDIR ?= $(PREFIX)/share/man
|
MANDIR ?= $(PREFIX)/share/man
|
||||||
|
BASHCOMPDIR ?= $(PREFIX)/share/bash-completion/completions
|
||||||
RUNSTATEDIR ?= /var/run
|
RUNSTATEDIR ?= /var/run
|
||||||
PKG_CONFIG ?= pkg-config
|
PKG_CONFIG ?= pkg-config
|
||||||
|
WITH_BASHCOMPLETION ?= yes
|
||||||
|
|
||||||
CFLAGS ?= -O3
|
CFLAGS ?= -O3
|
||||||
CFLAGS += -std=gnu11
|
CFLAGS += -std=gnu11
|
||||||
|
@ -25,8 +27,9 @@ clean:
|
||||||
rm -f wg *.o *.d
|
rm -f wg *.o *.d
|
||||||
|
|
||||||
install: wg
|
install: wg
|
||||||
install -v -d "$(DESTDIR)$(BINDIR)" && install -m 0755 -v wg "$(DESTDIR)$(BINDIR)/wg"
|
@install -v -d "$(DESTDIR)$(BINDIR)" && install -m 0755 -v wg "$(DESTDIR)$(BINDIR)/wg"
|
||||||
install -v -d "$(DESTDIR)$(MANDIR)/man8" && install -m 0644 -v wg.8 "$(DESTDIR)$(MANDIR)/man8/wg.8"
|
@install -v -d "$(DESTDIR)$(MANDIR)/man8" && install -m 0644 -v wg.8 "$(DESTDIR)$(MANDIR)/man8/wg.8"
|
||||||
|
@[ "$(WITH_BASHCOMPLETION)" = "yes" ] && install -v -d "$(BASHCOMPDIR)" && install -m 0644 -v completion/wg.bash-completion "$(DESTDIR)$(BASHCOMPDIR)/wg"
|
||||||
|
|
||||||
check: clean
|
check: clean
|
||||||
CFLAGS=-g scan-build --view --keep-going $(MAKE) wg
|
CFLAGS=-g scan-build --view --keep-going $(MAKE) wg
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
# Copyright (C) 2017 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
|
||||||
|
|
||||||
|
_wg_completion() {
|
||||||
|
if [[ $COMP_CWORD -eq 1 ]]; then
|
||||||
|
COMPREPLY+=( $(compgen -W "show showconf set setconf addconf genkey genpsk pubkey" -- "${COMP_WORDS[1]}") )
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
case "${COMP_WORDS[1]}" in
|
||||||
|
genkey|genpsk|pubkey|help) return; ;;
|
||||||
|
show|showconf|set|setconf|addconf) ;;
|
||||||
|
*) return;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ $COMP_CWORD -eq 2 ]]; then
|
||||||
|
local extra
|
||||||
|
[[ ${COMP_WORDS[1]} == show ]] && extra=" all interfaces"
|
||||||
|
COMPREPLY+=( $(compgen -W "$(wg show interfaces 2>/dev/null)$extra" -- "${COMP_WORDS[2]}") )
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $COMP_CWORD -eq 3 && ${COMP_WORDS[1]} == show && ${COMP_WORDS[2]} != interfaces ]]; then
|
||||||
|
COMPREPLY+=( $(compgen -W "public-key private-key preshared-key listen-port peers endpoints allowed-ips latest-handshakes persistent-keepalive transfer" -- "${COMP_WORDS[3]}") )
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $COMP_CWORD -eq 3 && ( ${COMP_WORDS[1]} == setconf || ${COMP_WORDS[1]} == addconf ) ]]; then
|
||||||
|
compopt -o filenames
|
||||||
|
COMPREPLY+=( $(compgen -f -- "${COMP_WORDS[3]}") )
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ ${COMP_WORDS[1]} == set ]] || return
|
||||||
|
|
||||||
|
local has_listen_port=0 has_private_key=0 has_preshared_key=0 has_peer=0 has_remove=0 has_endpoint=0 has_persistent_keepalive=0 has_allowed_ips=0 words=() i j
|
||||||
|
for ((i=3;i<COMP_CWORD;i+=2)); do
|
||||||
|
[[ ${COMP_WORDS[i]} == listen-port ]] && has_listen_port=1
|
||||||
|
[[ ${COMP_WORDS[i]} == private-key ]] && has_private_key=1
|
||||||
|
[[ ${COMP_WORDS[i]} == preshared-key ]] && has_preshared_key=1
|
||||||
|
[[ ${COMP_WORDS[i]} == peer ]] && { has_peer=$i; break; }
|
||||||
|
done
|
||||||
|
if [[ $has_peer -eq 0 ]]; then
|
||||||
|
if ((COMP_CWORD % 2 != 0)); then
|
||||||
|
[[ $has_listen_port -eq 1 ]] || words+=( listen-port )
|
||||||
|
[[ $has_private_key -eq 1 ]] || words+=( private-key )
|
||||||
|
[[ $has_preshared_key -eq 1 ]] || words+=( preshared-key )
|
||||||
|
words+=( peer )
|
||||||
|
COMPREPLY+=( $(compgen -W "${words[*]}" -- "${COMP_WORDS[COMP_CWORD]}") )
|
||||||
|
elif [[ ${COMP_WORDS[COMP_CWORD-1]} == *-key ]]; then
|
||||||
|
compopt -o filenames
|
||||||
|
COMPREPLY+=( $(compgen -f -- "${COMP_WORDS[COMP_CWORD]}") )
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${COMP_WORDS[COMP_CWORD-1]} == peer ]]; then
|
||||||
|
COMPREPLY+=( $(compgen -W "$(wg show "${COMP_WORDS[2]}" peers 2>/dev/null)" -- "${COMP_WORDS[COMP_CWORD]}") )
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
for ((i=has_peer;i<COMP_CWORD;i++)); do
|
||||||
|
j=i
|
||||||
|
if [[ ${COMP_WORDS[i]} == peer ]]; then
|
||||||
|
has_remove=0
|
||||||
|
has_endpoint=0
|
||||||
|
has_persistent_keepalive=0
|
||||||
|
has_allowed_ips=0
|
||||||
|
[[ ${COMP_WORDS[i+2]} == = ]] && ((i+=2)) || ((i++))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
[[ ${COMP_WORDS[i]} == remove ]] && has_remove=1
|
||||||
|
[[ ${COMP_WORDS[i]} == endpoint ]] && has_endpoint=1
|
||||||
|
[[ ${COMP_WORDS[i]} == persistent-keepalive ]] && has_persistent_keepalive=1
|
||||||
|
[[ ${COMP_WORDS[i]} == allowed-ips ]] && has_allowed_ips=1
|
||||||
|
|
||||||
|
[[ ${COMP_WORDS[i]} == remove ]] || ((i++))
|
||||||
|
done
|
||||||
|
|
||||||
|
((COMP_CWORD == j)) || return
|
||||||
|
|
||||||
|
if [[ $has_remove -ne 1 ]]; then
|
||||||
|
[[ $has_endpoint -eq 1 ]] || words+=( endpoint )
|
||||||
|
[[ $has_allowed_ips -eq 1 ]] || words+=( allowed-ips )
|
||||||
|
[[ $has_persistent_keepalive -eq 1 ]] || words+=( persistent-keepalive )
|
||||||
|
words+=( remove )
|
||||||
|
fi
|
||||||
|
words+=( peer )
|
||||||
|
|
||||||
|
COMPREPLY+=( $(compgen -W "${words[*]}" -- "${COMP_WORDS[COMP_CWORD]}") )
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -o nosort -F _wg_completion wg
|
Loading…
Reference in New Issue