1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-07-10 04:21:37 +02:00
zsh/Completion/Unix/Command/_ipsec
dana 1f8bea2247 43959: Add completion for strongSwan, &al.
Also update _urls to complete unix:// URIs as for file://
2019-01-01 06:49:08 -06:00

179 lines
6.5 KiB
Text

#compdef ipsec strongswan
# Completion for the ipsec script (aka strongswan on some systems) provided by
# FreeS/WAN, Openswan, Libreswan, and strongSwan. See also strongSwan's swanctl.
#
# As with swanctl, elevated privileges are usually required to complete SA names
# and the like; consider setting the gain-privileges style as follows:
# zstyle ':completion:*:(ipsec|strongswan)/*' gain-privileges yes
#
# @todo We don't complete pool names or virtual IPs
# Complete connection (IKE SA) names and optionally SA/instance names
# --instances => also complete SA/instance names
(( $+functions[_ipsec_connections] )) ||
_ipsec_connections() {
local -a instances tmp ipsec_conns ipsec_insts
zparseopts -D -E -a instances - -instances
tmp=( ${(f)${"$(
_call_program -p ipsec-status ${_ipsec_cmd:-$words[1]} statusall
)"#*$'\n'[[:space:]]#[Cc]onnections:[[:space:]]#$'\n'}} )
tmp=( ${(@M)tmp:#[[:space:]]#[^[:space:]]##:[[:space:]]##?*} )
tmp=( ${(@)${(@)tmp##[[:space:]]##}%%:*} )
ipsec_conns=( ${(@)tmp%%['[{']<->['}]']} )
ipsec_insts=( ${(@M)tmp:#*['[{']<->['}]']} )
(( $#ipsec_conns )) || {
_message -e connections 'connection name'
return
}
tmp=( 'connections:connection name:compadd -a - ipsec_conns' )
(( $#instances && $#ipsec_insts )) &&
tmp+=( 'instances:connection SA/instance name:compadd -a - ipsec_insts' )
_alternative $tmp
}
# Complete arguments to /usr/lib/ipsec/starter. This is rarely invoked directly,
# and there is almost no documentation on it, but the start/restart commands
# pass options to it
(( $+functions[_ipsec_starter] )) ||
_ipsec_starter() {
_arguments : \
'(--nofork)--attach-gdb[start daemon under gdb (implies --nofork)]' \
'--auto-update[specify select time-out]:select time-out (seconds)' \
'--conf[specify path to ipsec.conf]:ipsec.conf file:_files' \
'--daemon[specify daemon name]:daemon name' \
'--nofork[do not fork daemon]' \
+ '(d)' \
'--debug[set log level 2]' \
'--debug-more[set log level 3]' \
'--debug-all[set log level 4]' \
'--nolog[set log level 0]'
}
_ipsec() {
local ret=1 variant _ipsec_cmd=$words[1]
local -a context line state state_descr tmp
local -A opt_args
_pick_variant -r variant \
freeswan='(#i)frees/#wan' \
libreswan='(#i)libreswan' \
openswan='(#i)openswan' \
strongswan='(#i)strongswan' \
unix \
--version
# Provide only basic completion for non-strongSwan implementations
if [[ $variant == unix ]]; then
_default
return
elif [[ $variant == (free|libre|open)* ]]; then
tmp=( ${(f)"$( _call_program ipsec-help $words[1] --help )"} )
tmp=( ${(@M)tmp:#($' '|$'\t')*} )
tmp=( ${(@)tmp:#*[':/<>()[]']*} )
tmp=( ${(f)${(F)tmp//[[:space:]]##/$'\n'}} )
_arguments -S -A '-*' : \
'(: * -)--help[display help information]' \
'(: * -)--version[display version information]' \
"(-)1:command:(${(j< >)${(@q-)tmp}})" \
'(-)2: :_default'
return
fi
_arguments -A '-*' \
'(: * -)--confdir[display path to configuration directory (IPSEC_CONFDIR)]' \
'(: * -)--copyright[display copyright information]' \
'(: * -)--directory[display path to libexec/utility directory (IPSEC_DIR)]' \
'(: * -)--help[display help information]' \
'(: * -)--piddir[display path to PID directory (IPSEC_PIDDIR)]' \
'(: * -)--version[display version information]' \
'(: * -)--versioncode[display brief version information]' \
'1:command:((
down\:"terminate IPsec connection/SA"
down-srcip\:"terminate IKE SAs by client virtual IP"
leases\:"display IP address/pool status"
listaacerts\:"display X.509 authorization authority certificates"
listacerts\:"display X.509 attribute certificates"
listalgs\:"display loaded algorithms"
listall\:"execute all list commands"
listcacerts\:"display X.509 certificate authority certificates"
listcainfos\:"display certificate authority information"
listcerts\:"display X.509/OpenPGP certificates"
listcounters\:"display IKE counter information"
listcrls\:"display certificate revocation lists"
listgroups\:"display groups for user authorization profiles"
listocsp\:"display OCSP revocation information"
listocspcerts\:"display X.509 OCSP signer certificates"
listplugins\:"display loaded plug-in features"
listpubkeys\:"display RSA public keys"
purgecerts\:"purge cached certificates"
purgecrl\:"purge cached certificate revocation lists"
purgeike\:"purge IKE SAs without a quick mode or CHILD_SA"
purgeocsp\:"purge cached OCSP information"
reload\:"reload entire configuration (send SIGUSR1)"
rereadacerts\:"re-read attribute certificates"
rereadaacerts\:"flush and re-read authorization authority certificates"
rereadall\:"execute all re-read commands"
rereadcacerts\:"flush and re-read certificate authority certificates"
rereadcrls\:"re-read certificate revocation lists"
rereadocspcerts\:"re-read OCSP certificates"
rereadsecrets\:"flush and re-read secrets"
resetcounters\:"reset IKE counter information"
restart\:"equivalent to stop + start"
route\:"insert kernel IPsec policy for connection"
start\:"start IKE daemon"
status\:"display concise connection status"
statusall\:"display detailed connection status"
stop\:"terminate all IPsec connections and stop IKE daemon"
stroke\:"issue stroke command"
unroute\:"remove kernel IPsec policy for connection"
up\:"bring up IPsec connection"
update\:"reload changes in configuration (send SIGHUP)"
))' \
'*:: :->next' \
&& ret=0
[[ $state == next ]] &&
case $words[1] in
down)
_arguments : '1: :_ipsec_connections --instances' && ret=0
;;
listcounters|resetcounters|route|status|statusall|unroute|up)
_arguments : '1: :_ipsec_connections' && ret=0
;;
down-srcip)
_arguments : \
'1:virtual IP address (start)' \
'2::virtual IP address (end)' \
&& ret=0
;;
leases)
_arguments : '1:pool name' '2::virtual IP address' && ret=0
;;
list*~list(counters|plugins))
_arguments : '--utc[use UTC for time fields]' && ret=0
;;
start|restart)
_ipsec_starter && ret=0
;;
stroke)
_arguments -s -S -A '-*' \
'(: * -)'{-h,--help}'[display help information]' \
'(-d --daemon)'{-d+,--daemon=}'[specify daemon name]:daemon name' \
'1: :_guard "^-*" "stroke command"' \
'*:stroke command argument:_default' \
&& ret=0
;;
esac
return ret
}
_ipsec "$@"