1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
#compdef ipset
local offset=0
local -a args from_to hash cmds listopts addopts
_set_types () {
_values -S \ "set type" \
'bitmap\:ip[uses a memory range to store IPv4 host (default) or IPv4 subnet addresses up to 65536 elements]'\
'bitmap\:ip,mac[uses a memory range to store an IPv4 host/subnet and mac address pair up to 65536 elements]'\
'bitmap\:port[uses a memory range to store port numbers independent of L4 protocol at up to 65536 elements]'\
'hash\:ip[stores IPv4/IPv6 host/subnet addresses. 0.0.0.0 and :: cannot be stored]'\
'hash\:net[stores varying sizes of IPv4/IPv6 addresses. 0.0.0.0 and :: cannot be stored]'\
'hash\:ip,port[stores IPv4/IPv6 addresses and port numbers, including L4 proto - port 0 cannot be stored]'\
'hash\:net,port[stores varying sizes of IPv4/IPv6 addresses and port numbers, including L4 proto]'\
'hash\:ip,port,ip[stores IPv4/IPv6 addresses, a port with L4 proto and another IPv4/IPv6 address]'\
'hash\:ip,port,net[stores an IPv4/IPv6 address, port with L4 proto and an arbitrary size IPv4/IPv6 subnet]'\
'hash\:net,iface[stores an IPv4/IPv6 address and an interface name]'\
'list\:set[a simple list which stores names of other sets]'
}
#if [[ $words[2] = (-q|--quiet) ]]; then
# offset=1
#fi
_ipsets () {
local -a vals
vals=( ${${(M)${(f)"$(_call_program ipsets ipset -L)"}%Name: *}#Name: } )
_describe -t ipsets "IP set" vals
}
_sets () {
_ipsets
local -a vals
}
from_to=('(--network)--from[from IP or network (with --netmask)]:IP'
'(--network)--to[to IP or network (with --netmask)]:IP'
'(--from --to)--network[network]:IP/mask'
)
hash=( '--hashsize[the initial hash size aligned to a power of 2]:hashsize [1024]'
'--maxelem[the maximum number of elements in the set]:max elements [65536]'
'--family[the protocol family of addresses to be stored in the set]:address family [inet]:(inet inet6)'
'--timeout[adds timeout support to the set with your specified value as default, (0 = forever)]:entrytimeout'
'--probes[max number of tries to resolve clashing, altering this is discouraged]:tries [8]'
'--resize[ratio of increasing hash size after unsuccessful <probes> of double-hashing, altering discouraged]:percent'
)
case $words[offset+2]; in
-N|--create)
case $words[offset+4]; in
bitmap\:ip)
args=( $from_to
'--netmask[store network addresses instead of IP addresses]:CIDR'
)
;;
bitmap\:ip,mac)
args=( $from_to
'--netmask[store network addresses instead of IP addresses]:CIDR'
)
;;
bitmap\:port)
args=( '--from[from port]:port:_ports'
'--to[to port]:port:_ports'
)
;;
hash\:ip)
args=( $hash
'--netmask[store network addresses instead of IP addresses]:CIDR'
)
;;
hash\:net)
args=( $hash )
;;
hash\:ip,port)
args=( $hash
'--netmask[store network addresses instead of IP addresses]:CIDR'
)
;;
hash\:net,port)
args=( $hash )
;;
hash\:ip,port,ip)
args=( $hash
'--netmask[store network addresses instead of IP addresses]:CIDR'
)
;;
hash\:ip,port,net)
args=( $hash
'--netmask[store network addresses instead of IP addresses]:CIDR'
)
;;
hash\:net,iface)
args=( $hash )
;;
list\:set)
args=( '--size[size of the new setlist]:size [8]' )
;;
esac
;;
esac
_ips () {
if [[ $CURRENT -eq ((offset+4)) ]]; then
local ips=1 default
local -a vals vals1 vals2 bindings
vals=( ${${${(f)"$(_call_program ipsets ipset -L $words[offset+3])"}[4,-1]}//\:/\\:} )
for i in $vals; do
if [[ $i = Default\ binding\\:* ]]; then default=${i#Default binding\\: }; continue; fi
if [[ $i = (Header\\:*|Members\\:*|Size in memory\\:*|References\\:*) ]]; then continue; fi
if [[ $i = 'Bindings\:' ]]; then ips=0; continue; fi
if (( $ips )); then vals1+=$i; else bindings+=${i/ ->/:}; fi
done
_describe -t ips "IPs from $words[offset+3] set" vals1
_describe -t special_values "special value" vals2
fi
}
cmds=(-N -X -F -E -W -S -R -A -D -T -B -U -H --create --destroy --flush --rename --swap --save --restore --add --del --test --help)
listopts=(-n --name -s --sorted -t --terse -r --resolve -L --list)
addopts=(--timeout --timeout -! --exist -A --add)
_arguments \
"($cmds $listopts $addopts)"{-N,--create}'[create a set]:set name::::_set_types' \
"($cmds $listopts)"{-X,--destroy}'[destroy specified set (or all if none specified)]:set name:_sets' \
"($cmds $listopts)"{-F,--flush}'[flush specified set (or all if none specified)]:set name:_sets' \
"($cmds $listopts)"{-E,--rename}'[rename set]:current set name:_ipsets:new set name:' \
"($cmds $listopts)"{-W,--swap}'[swap two sets]:::_ipsets:::_ipsets' \
"($cmds -L --list -q --quiet )"{-L,--list}'[list the entries and bindings for the specified set (or all if none specified)]:::_sets' \
"($cmds $listopts)"{-S,--save}'[save the given set (or all if none specified)]:::_sets' \
"($cmds $listopts)"{-R,--restore}'[restore a saved session generated by --save from stdin]' \
"($cmds $listopts)"{-A,--add}'[add an IP to a set]:::_ipsets:IP' \
"($cmds $listopts)"{-D,--del}'[delete an IP from a set]:::_ipsets:::_ips' \
"($cmds $listopts)"{-T,--test}'[test whether an IP is in a set]:::_ipsets:::_ips' \
"($cmds $listopts)"{-H,--help}'[print help and settype specific help if settype specified]:::_set_types' \
"(-q --quiet $listopts)"{-q,--quiet}'[suppress any output to stdout and stderr]' \
"(-t --terse $listopts)"{-t,--terse}'[list set names and headers without entries]' \
"(-r --resolve $listopts)"{-r,--resolve}'[enforce DNS name lookup of addresses, slow!]' \
"(-! --exist $addopts)"{-!,--exist}'[ignore errors when creating an identical set, adding existing entry or deleting a non-existent one]'\
"(--timeout --timeout $addopts)"{--timeout,--timeout}'[set the timeout for this entry. set must have been created with timeout support]:timeout'\
"($cmds -s --sorted -q --quiet)"{-s,--sorted}'[sorted output]' \
"($cmds -n --name -q --quiet)"{-n,--name}"[name output only; suppresses showing of set information]" \
"$args[@]"
|