about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Kiddle <okiddle@yahoo.co.uk>2014-07-17 17:02:39 +0200
committerOliver Kiddle <okiddle@yahoo.co.uk>2014-07-17 17:02:54 +0200
commitc9713464456b03709cc886621f39d47a118c925e (patch)
tree86ea7dfb664319a46601f60a56f4d673027e3331
parentfbcf719e28481142434822b1270c8bb9807fb6a0 (diff)
downloadzsh-c9713464456b03709cc886621f39d47a118c925e.tar.gz
zsh-c9713464456b03709cc886621f39d47a118c925e.tar.xz
zsh-c9713464456b03709cc886621f39d47a118c925e.zip
32849: new completion for Linux ss (netstat alternative)
-rw-r--r--ChangeLog2
-rw-r--r--Completion/Linux/Command/.distfiles1
-rw-r--r--Completion/Linux/Command/_ss98
3 files changed, 101 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 3ac7cced2..ecb34a78c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2014-07-17  Oliver Kiddle  <opk@zsh.org>
 
+	* 32849: Completion/Linux/Command/_ss: new completion function
+
 	* 32848: Completion/Unix/Command/_perl,
 	Completion/Unix/Command/_python, Completion/Unix/Command/_ruby:
 	fix words array before using _normal for script arguments
diff --git a/Completion/Linux/Command/.distfiles b/Completion/Linux/Command/.distfiles
index f6ee5b6c7..f7861b3a2 100644
--- a/Completion/Linux/Command/.distfiles
+++ b/Completion/Linux/Command/.distfiles
@@ -23,6 +23,7 @@ _nmcli
 _pkgtool
 _rpmbuild
 _schedtool
+_ss
 _sshfs
 _strace
 _tpb
diff --git a/Completion/Linux/Command/_ss b/Completion/Linux/Command/_ss
new file mode 100644
index 000000000..95aa798db
--- /dev/null
+++ b/Completion/Linux/Command/_ss
@@ -0,0 +1,98 @@
+#compdef ss
+
+local curcontext="$curcontext" suf ret=1
+local -a state line expl pref filt
+local -A opt_args
+local info="-h -V --help --version"
+local sx="state exclude"
+
+_arguments -C -s \
+  "(- *)"{-h,--help}'[show option summary]' \
+  "(- *)"{-V,--version}'[show version information]' \
+  "($info -n --numeric)"{-n,--numeric}"[don't resolve service names]" \
+  "($info -r --resolve)"{-r,--resolve}'[resolve host addresses]' \
+  "($info -a --all -l --listening)"{-a,--all}'[display all sockets]' \
+  "($info -l --listening -a --all)"{-l,--listening}'[display listening sockets]' \
+  "($info -o --options -e --extended)"{-o,--options}'[show timer information]' \
+  "($info -e --extended -o --options)"{-e,--extended}'[show detailed information]' \
+  "($info -m --memory)"{-m,--memory}'[show socket memory usage]' \
+  "($info -p --processes)"{-p,--processes}'[show process using each socket]' \
+  "($info -i --info)"{-i,--info}'[show internal TCP information]' \
+  "($info -s --summary)"{-s,--summary}'[print summary statistics]' \
+  "($info -4 --ipv4 -6 --ipv6)"{-4,--ipv4}'[display only IP version 4 sockets]' \
+  "($info -4 --ipv4 -6 --ipv6)"{-6,--ipv6}'[display only IP version 6 sockets]' \
+  "($info -0 --packet)"{-0,--packet}'[display PACKET sockets]' \
+  "($info -t --tcp)"{-t,--tcp}'[display TCP sockets]' \
+  "($info -u --udp)"{-u,--udp}'[display UDP sockets]' \
+  "($info -d --dccp)"{-d,--dccp}'[display DCCP sockets]' \
+  "($info -w --raw)"{-w,--raw}'[display RAW sockets]' \
+  "($info -x --unix)"{-x,--unix}'[display Unix domain sockets]' \
+  "($info -f --family)"{-f,--family}'[display sockets of specified type]:family:(unix inet inet6 link netlink)' \
+  "($info -A --query --socket)"{-A,--query,--socket}'[specify socket tables to show]: :_values -s , socket\ table all inet tcp udp raw unix packet netlink unix_dgram unix_stream packet_raw packet_dgram' \
+  "($info -D)"{-D,--diag=}'[dump raw info to file]:file:_files' \
+  "($info -F)"{-F,--filter=}'[read filter information from a file]:file:_files' \
+  "($info)*: :->filter" && ret=0
+
+if [[ -n $state ]]; then
+  case $words[CURRENT-1] in
+  (d|s)port)
+    _wanted operators expl operator \
+      compadd \< \> \= \>= \<= \== \!= eq ge gt lt le ne && ret=0
+  ;;
+  dst|src)
+    if compset -P unix: || (( $+opt_args[-x] + $+opt_args[--unix] )) || [[ $opt_args[-f] = unix ]]; then
+      _files -g '*(=)' && ret=0
+    elif compset -P nl:; then
+      if compset -P \*:; then
+        _pids && ret=0
+      else
+        _message channel
+      fi
+    elif compset -P link:; then
+      compset -P \*: && _message ifindex || _message protocol
+    else
+      compset -P 'inet(6|):'
+      pref=$?
+      compset -S ':*' || suf="-qS:"
+      if compset -P \*:; then
+        _ports && ret=0
+      elif compset -P \*/; then
+        _wanted netmasks expl netmask compadd $suf {1..31} && ret=0
+      elif (( pref )); then
+        _alternative \
+          "hosts:host:_hosts $suf" \
+          "prefixes:prefix:compadd $suf nl link unix" && ret=0
+      else
+        _hosts $suf && ret=0
+      fi
+    fi
+  ;;
+  state|exclude)
+    _wanted states expl state compadd -M 'm:{a-zA-Z_}={A-Za-z-}' \
+      ESTABLISHED SYN-SENT SYN-RECV FIN-WAIT-1 FIN-WAIT-2 TIME-WAIT \
+      CLOSED CLOSE-WAIT LAST-ACK LISTEN CLOSING \
+      all connected synchronized bucket big && ret=0
+  ;;
+  *)
+    if [[ $words[CURRENT-2] = (d|s)port ]]; then
+      compset -P '*:' || pref=(-P :)
+      _ports $pref
+      return
+    else
+      (( $#line > 1 )) && [[ ${words[CURRENT-1]:Q} != (and|or|\() ]] &&
+          filt=( "($sx)*"{and,or} )
+      _values -w -s ' ' -S ' ' filter $filt \
+        "*state[sockets in specified state]" \
+        "*exclude[sockets not in specified state]" \
+        "($sx)*src[local address/port of socket]" \
+        "($sx)*dst[peer address/port of socket]" \
+        "($sx)*dport[peer port]: :(lt gt ge)" \
+        "($sx)*sport[local port]" \
+        "($sx)*autobound[socket bound to ephemeral port]" \
+        "($sx)*"{not,\(,\)} && ret=0
+    fi
+  ;;
+  esac
+fi
+
+return ret