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 | ||||||
|  | |||||||
							
								
								
									
										91
									
								
								src/completion/wg.bash-completion
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								src/completion/wg.bash-completion
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||||
		Reference in New Issue
	
	Block a user
	 Jason A. Donenfeld
						Jason A. Donenfeld