about summary refs log tree commit diff
path: root/Completion/Solaris/Command/_fmadm
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Solaris/Command/_fmadm')
-rw-r--r--Completion/Solaris/Command/_fmadm187
1 files changed, 100 insertions, 87 deletions
diff --git a/Completion/Solaris/Command/_fmadm b/Completion/Solaris/Command/_fmadm
index 56dac4f96..2a28f7a5c 100644
--- a/Completion/Solaris/Command/_fmadm
+++ b/Completion/Solaris/Command/_fmadm
@@ -1,8 +1,7 @@
 #compdef fmadm
-# Synced with the Nevada build 168 man page
 
 _fm_modules() {
-	compadd "$@" - $(fmadm config 2> /dev/null | awk 'NR == 1 {continue} {print $1}')
+  compadd "$@" - ${${(f)"$(_call_program modules fmadm config)"}[2,-1]// */}
 }
 
 _fm_faulted_fmris() {
@@ -14,7 +13,7 @@ _fm_faulted_uuids() {
 }
 
 _fm_faulted_labels() {
-	local q='"'
+	local line q='"'
 	compadd "$@" - $(fmadm faulty -f 2> /dev/null | while read line; do
 		if [[ $line == "----"* ]]; then
 			read line
@@ -25,87 +24,101 @@ _fm_faulted_labels() {
 	done)
 }
 
-_fmadm() {
-	local context state line expl
-	local -A opt_args
-	local -a subcmds
-
-	# TODO: lookup-alias and remove-alias need completion based on the
-	# output of list-alias, but I have no examples of that output.
-
-	subcmds=(
-		"acquit" "config" "faulty" "flush" "load" "unload"
-		"repaired" "replaced" "reset" "rotate"
-		"add-alias" "remove-alias" "lookup-alias" "list-alias" "sync-alias"
-	)
-
-	if [[ $service == "fmadm" ]]; then
-		_arguments -C -A "-*" \
-			'-q[Quite mode]' \
-			'*::command:->subcmd' && return 0
-
-		if (( CURRENT == 1 )); then
-			_wanted commands expl "fmadm subcommand" compadd -a subcmds
-			return
-		fi
-		service="$words[1]"
-		curcontext="${curcontext%:*}=$service:"
-	fi
-
-	case $service in
-	("acquit")
-		_alternative \
-			"fmadm-acquit-label:label:_fm_faulted_labels" \
-			"fmadm-acquit-uuid:uuid:_fm_faulted_uuids" \
-			"fmadm-acquit-fmri:fmri:_fm_faulted_fmris"
-		;;
-
-	("config")
-		;;
-
-	("faulty")
-		_arguments -A "-*" \
-			'-a[Display all faults]' \
-			'-f[Display faulty FRUs]' \
-			'-g[Group faults]' \
-			'-i[Display persistent cache IDs]' \
-			'-n[Limit output to n entries]:number:' \
-			'-p[Page output]' \
-			'-r[Display resources]' \
-			'-s[Display one-line summaries]' \
-			'-u[Only display fault with given uuid]:uuid:_fm_faulted_uuids' \
-			'-v[Display full output]'
-		;;
-
-	("flush")
-		_fm_faulted_fmris
-		;;
-
-	("load")
-		_path_files -g "/*"
-		;;
-
-	("unload")
-		_fm_modules
-		;;
-
-	("repaired"|"replaced")
-		_alternative \
-			"fmadm-acquit-label:label:_fm_faulted_labels" \
-			"fmadm-acquit-fmri:fmri:_fm_faulted_fmris"
-		;;
-
-	("reset")
-		_arguments -A "-*" \
-			'-s[Reset named SERD]:serd:' \
-			':module:_fm_modules'
-		;;
-
-	("rotate")
-		_values "logfile" "errlog" "fltlog" "infolog" "infolog_hival"
-		;;
-
-	esac
-}
-
-_fmadm "$@"
+local curcontext="$curcontext" state line expl ret=1
+local -A opt_args
+local -a subcmds args
+
+# TODO: lookup-alias and remove-alias need completion based on the
+# output of list-alias, but I have no examples of that output.
+
+subcmds=(
+  faulty list acquit replaced repaired list-alert clear
+  list-defect list-fault
+  add-alias remove-alias lookup-alias list-alias sync-alias
+  config load unload reset rotate flush
+)
+
+_arguments -C -A "-*" \
+  '-q[quiet mode]' \
+  '1:fmadm subcommand:compadd -M "r:|-=* r:|=*" -a subcmds' \
+  '*::command:->subcmd' && ret=0
+
+service="$words[1]"
+curcontext="${curcontext%:*}-$service:"
+
+case $service in
+  (faulty|list|list-alert|list-defect|list-fault)
+    args+=(
+      '-f[display faulty FRUs]'
+      '-i[display persistent cache IDs]'
+      '-p[page output]'
+      '-r[display resources]'
+      '-s[display one-line summaries]'
+      '-u[only display fault with given uuid]:uuid:_fm_faulted_uuids'
+      '-v[display full output]'
+    )
+  ;|
+
+  (faulty)
+    _arguments -A "-*" $args \
+      '-a[display all faults]' \
+      '-g[group faults]' \
+      '-n[limit output to n entries]:number'
+  ;;
+
+  (list|list-alert|list-defect|list-fault)
+    _arguments -A "-*" $args \
+      '-a[display all resources]'
+  ;;
+
+  (acquit)
+    _alternative \
+      'fmadm-acquit-label:label:_fm_faulted_labels' \
+      'fmadm-acquit-uuid:uuid:_fm_faulted_uuids' \
+      'fmadm-acquit-fmri:fmri:_fm_faulted_fmris' && ret=0
+  ;;
+
+  (repaired|replaced)
+    _alternative \
+      'fmadm-acquit-label:label:_fm_faulted_labels' \
+      'fmadm-acquit-fmri:fmri:_fm_faulted_fmris' && ret=0
+  ;;
+
+  (add-alias)
+    _arguments :chassis :alias-id :comment && ret=0
+  ;;
+
+  (remove-alias|lookup-alias)
+    _message -e aliases 'chassis or alias-id'
+  ;;
+
+  (load)
+    _directories && ret=0
+  ;;
+
+  (unload)
+    _fm_modules && ret=0
+  ;;
+
+  (reset)
+    _arguments -A "-*" \
+      '-s[reset named SERD]:serd' \
+      ':module:_fm_modules' && ret=0
+  ;;
+
+  (rotate)
+    _values 'logfile' errlog fltlog infolog infolog_hival && ret=0
+  ;;
+
+  (flush)
+    _fm_faulted_fmris && ret=0
+  ;;
+
+  (list-alias|config|sync-aliases) _message 'no more arguments' ;;
+
+  (*) # fallback to defaults for any new or unhandled subcommand
+    _default && ret=0
+  ;;
+esac
+
+return ret