about summary refs log tree commit diff
path: root/Completion/Unix/Command/_postfix
blob: 006c950e3f13a70b27646db01310a143e9694f2f (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#compdef postconf postqueue postsuper

# Last updated from postfix 3.1.0.

local context state state_descr line
typeset -A opt_args
integer NORMARG

_postfix_queue_id() {
  local -a lines=( ${(f)"$(_call_program mailq 'mailq')"} )

  # $enable_long_queue_ids = no
  compadd "$@" -- ${${(M)lines:#(#s)([0-9A-F]##([*!]|) )*}/(#s)(#b)([0-9A-F]##)*/$match[1]}

  # $enable_long_queue_ids = yes
  compadd "$@" -- ${${${(M)lines:#(#s)[0-9bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ](#c10)z*}%% *}%[*!]}
}

# The first argument must be either 'd' or 'n', to complete parameters in
# `postconf -d -H` or `postconf -n -H` output, respectively.
_postfix_main_cf_parameter() {
  local -a expl
  local kind

  kind=$1; shift
  case $kind in
    (d)
      # Note for the future: if $mail_version >= 3.1, we can pass -H instead of
      # stripping the = signs by hand.
      #
      # don't bother to add -c in this case: the defaults don't depend on the config dir.
      _wanted parameters expl 'main.cf parameter' compadd "$@" -- \
        ${${(f)"$(_call_program postconf_-d "${words[1]} -$kind")"}%% =*}
      ;;
    (n)
      # Show the values too.
      local -a kv=( ${${(f)"$(_call_program postconf_-n "${words[1]} ${opt_args[-c]+"-c ${opt_args[-c]}"} -$kind")"}/ = /:} )
      _describe -t parameters 'main.cf parameter' kv
      ;;
    (*)
      return 1 # can't happen due to the guard above
      ;;
  esac
}

_postfix_main_cf_parameter_and_value() {
  # Note: be careful not to accidentally run 'postconf foo=bar' here.
  #
  # The '-P 1' syntax chooses the shortest match.  If the '1' were removed,
  # completing «postconf foo=bar=<TAB>» would change main.cf.  So, don't remove
  # it.
  if compset -P 1 '*='; then
    local value="`_call_program postconf-get-value-at-dir "${words[1]} ${opt_args[-c]+"-c ${opt_args[-c]}"} -h -- ${(q)IPREFIX%=}"`"
    [[ -n $value ]] && compadd "$@" -- $value
  else
    _postfix_main_cf_parameter d -S=
  fi
}

case $service in
	(postsuper)
	_arguments -C -s : \
	'-p[purge old tempfiles]' \
	'-s[structure check and repair]' \
	'*-v[verbose]' \
	'-c[configdir]:config dir:_files -/' \
	'-d[delete]:queue id:_postfix_queue_id' \
	'-h[hold]:queue id:_postfix_queue_id' \
	'-H[release]:queue id:_postfix_queue_id' \
	'*-r[requeue]:queue id, or "ALL":_postfix_queue_id' \
	'1:queue:(hold incoming active deferred)'
	;;
        (postqueue)
        _arguments -C -s : \
          '*-v[enable verbose logging]' \
          '-c[configdir]:config dir:_files -/' \
          '(-f -i -j -p -s)-f[flush the queue]' \
          '(-f -i -j -p -s)-i[immediately deliver one message]:queue id:_postfix_queue_id' \
          '(-f -i -j -p -s)-j[print the queue in json]' \
          '(-f -i -j -p -s)-p[print the queue in traditional format]' \
          '(-f -i -j -p -s)-s[immediately deliver messages to specified site]:site:_hosts' 
        ;;
        (postconf)
          local -a file_ops=(-b -t -a -A -l -m -T)
          local -a modes=(-F -M -P $file_ops -p)
          local -a only_for_p=(-C -d -h -n)
          local -a only_for_asterisk_dot_cf=(-e -f -o -x)
          local -a args=(
              # global
              '-c[configdir]:config dir:_files -/' \
              '*-v[enable verbose logging]'

              # mode selection
              "($modes $only_for_p                              -X -#)"'-F[operate on master.cf entry fields]'
              "($modes $only_for_p                           -H      )"'-M[operate on master.cf services entries]'
              "($modes $only_for_p                                 -#)"'-P[operate on master.cf parameter settings]'
              "($modes $only_for_p $only_for_asterisk_dot_cf -H -X -#)"'-b[display DSN text, expanded]'
              "($modes $only_for_p $only_for_asterisk_dot_cf -H -X -#)"'-t[display DSN text, unexpanded]'
              "($modes $only_for_p $only_for_asterisk_dot_cf -H -X -#)"'-a[list available SASL server plug-ins]'
              "($modes $only_for_p $only_for_asterisk_dot_cf -H -X -#)"'-A[list available SASL client plug-ins]'
              "($modes $only_for_p $only_for_asterisk_dot_cf -H -X -#)"'-l[list supported mailbox locking methods]'
              "($modes $only_for_p $only_for_asterisk_dot_cf -H -X -#)"'-m[list supported lookup table types]'
              "($modes                                               )"'-p[(default) print main.cf settings]'
              "($modes $only_for_p $only_for_asterisk_dot_cf -H -X -#)"'-T[print TLS information]:mode:((
                           compile-version\:"OpenSSL compile-time version"
                           run-version\:"OpenSSL run-time version"
                           public-key-algorithms\:"supported public-key algorithms"
                           ))'

              # other options; comments indicate modes:
              # -p only
              '-C[display parameters from the specified class]:parameter class:(builtin service user all)'
              '-d[print default values]'
              '-h[print value only]'
              '-n[show parameters changed in main.cf]'

              # all except $file_ops:
              '-e[change parameter values]'
              '-f[fold long output lines]'
              '-o[set parameter value for this operation]: :_postfix_main_cf_parameter_and_value'
              '-x[expand '\''$name'\'' in parameter values]'

              # -p -F -P only
              '-H[show parameter name only]'
              # -p -M -P only
              '-X[remove parameters from main.cf/master.cf]'
              # -p -M only
              '-#[comment out parameters in main.cf/master.cf]'

              # $state
              '*: :->positional'
          )
          _arguments -C -s -S -n : "$args[@]"

          case $state in
            (positional)
              # Simulate the default
              if [[ -z $opt_args[(i)${(j.|.)modes}] ]]; then
                opt_args[-p]=""
              fi
              if [[ -n $opt_args[(i)(-b|-t)] ]]; then
                local expl
                if (( CURRENT == NORMARG )); then
                  _wanted files expl 'template file, or "" for default' _files
                else
                  _nothing
                fi
              elif [[ -n $opt_args[(i)${(j.|.)file_ops}] ]]; then
                _nothing
              elif (( $+opt_args[-p] )); then
                if (( $+opt_args[-e] )); then
                  _postfix_main_cf_parameter_and_value
                elif [[ -n $opt_args[(i)(-X|-[#])] ]]; then
                  _postfix_main_cf_parameter n
                else
                  _postfix_main_cf_parameter d
                fi
              else # one of the master.cf modes: -M -F -P
                _message "arguments for $opt_args[(i)${(j.|.)modes}] mode"
              fi
          esac
        ;;
esac