summary refs log tree commit diff
path: root/Completion/Solaris/Command/_fmadm
blob: 2a28f7a5c6e4441ac488440149b58891e06d55fa (plain) (blame)
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
#compdef fmadm

_fm_modules() {
  compadd "$@" - ${${(f)"$(_call_program modules fmadm config)"}[2,-1]// */}
}

_fm_faulted_fmris() {
	compadd "$@" - $(fmadm faulty -r 2> /dev/null | awk '{print $1}')
}

_fm_faulted_uuids() {
	compadd "$@" - $(fmadm faulty -s 2> /dev/null | tail +4 | awk '{print $4}')
}

_fm_faulted_labels() {
	local line q='"'
	compadd "$@" - $(fmadm faulty -f 2> /dev/null | while read line; do
		if [[ $line == "----"* ]]; then
			read line
			if [[ $line == '"'* ]]; then
				print ${${line[(r)$q,(rn:2:)$q]}[2,-2]}
			fi
		fi
	done)
}

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