_ufw
3861 bytes
1#compdef ufw
2#autoload
3
4typeset -A opt_args
5
6function _ufw_delete_rules {
7 if ufw status &> /dev/null ; then
8 ufw status numbered \
9 | perl -n -e'/\[ +(\d+)\] +([^ ].+)/ && print "\"$1\[$2\]\" "'
10 fi
11}
12
13function _ufw_app_profiles {
14 grep -rhoP "(?<=\[)[^\]]+" /etc/ufw/applications.d/ \
15 | awk '{ print "\""$0"\""}' \
16 | tr '\n' ' '
17}
18
19local -a _1st_arguments
20_1st_arguments=(
21 'allow:add allow rule'
22 'app:Application profile commands'
23 'default:set default policy'
24 'delete:delete RULE'
25 'deny:add deny rule'
26 'disable:disables the firewall'
27 'enable:enables the firewall'
28 'insert:insert RULE at NUM'
29 'limit:add limit rule'
30 'logging:set logging to LEVEL'
31 'reject:add reject rule'
32 'reload:reloads firewall'
33 'reset:reset firewall'
34 'route:add route rule'
35 'show:show firewall report'
36 'status:show firewall status'
37 'version:display version information'
38)
39
40local context state line curcontext="$curcontext"
41
42_arguments -C \
43 '(--dry-run)--dry-run[dry run]' \
44 '1:: :->cmds' \
45 '2:: :->subcmds' \
46 '3:: :->subsubcmds' \
47 '4:: :->subsubsubcmds' \
48&& return 0
49
50local rules
51
52case "$state" in
53 (cmds)
54 _describe -t commands "ufw commands" _1st_arguments
55 return 0
56 ;;
57 (subcmds)
58 case "$line[1]" in
59 (app)
60 _values 'app' \
61 'list[list application profiles]' \
62 'info[show information on PROFILE]' \
63 'update[update PROFILE]' \
64 'default[set default application policy]' \
65 && ret=0
66 ;;
67 (status)
68 _values 'status' \
69 'numbered[show firewall status as numbered list of RULES]' \
70 'verbose[show verbose firewall status]' \
71 && ret=0
72 ;;
73 (logging)
74 _values 'logging' \
75 'on' 'off' 'low' 'medium' 'high' 'full' \
76 && ret=0
77 ;;
78 (default)
79 _values 'default' \
80 'allow' 'deny' 'reject' \
81 && ret=0
82 ;;
83 (show)
84 _values 'show' \
85 'raw' 'builtins' 'before-rules' 'user-rules' 'after-rules' 'logging-rules' 'listening' 'added' \
86 && ret=0
87 ;;
88 (route)
89 _values 'route' \
90 'delete[delete route rule]' \
91 'insert[insert route rule at NUM]' \
92 'prepend[prepend route rule]' \
93 'allow[add allow route rule]' \
94 'deny[add deny route rule]' \
95 'reject[add reject route rule]' \
96 'limit[add limit route rule]' \
97 && ret=0
98 ;;
99 (delete)
100 rules="$(_ufw_delete_rules)"
101 if [[ -n "$rules" ]] ; then
102 _values 'delete' \
103 ${(Q)${(z)"$(_ufw_delete_rules)"}} \
104 && ret=0
105 fi
106 ;;
107 esac
108 ;;
109 (subsubcmds)
110 case "$line[1]" in
111 (app)
112 case "$line[2]" in
113 (info|update)
114 _values 'profiles' \
115 ${(Q)${(z)"$(_ufw_app_profiles)"}} \
116 && ret=0
117 ;;
118 esac
119 ;;
120 (default)
121 _values 'default-direction' \
122 'incoming' 'outgoing' \
123 && ret=0
124 ;;
125 (route)
126 case "$line[2]" in
127 (delete|prepend)
128 _values 'route-action' \
129 'allow[route allow rule]' \
130 'deny[route deny rule]' \
131 'reject[route reject rule]' \
132 'limit[route limit rule]' \
133 && ret=0
134 ;;
135 (insert)
136 _message 'route rule number'
137 ;;
138 esac
139 ;;
140 esac
141 ;;
142 (subsubsubcmds)
143 case "$line[1]" in
144 (route)
145 case "$line[2]" in
146 (insert)
147 _values 'route-action' \
148 'allow[route allow rule]' \
149 'deny[route deny rule]' \
150 'reject[route reject rule]' \
151 'limit[route limit rule]' \
152 && ret=0
153 ;;
154 esac
155 ;;
156 esac
157esac
158
159return