2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2014 Michael Tremer #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
21 # network(8) completion
23 _network_find_on_cmdline
() {
24 local word subcommand c
=0
25 while [ ${c} -lt ${cword} ]; do
27 for subcommand
in ${1}; do
28 if [ "${subcommand}" = "${word}" ]; then
37 _network_complete_hooks
() {
40 COMPREPLY
=( $
(compgen
-W "$(network raw list-hooks "${type}")" -- "${cur}") )
43 _network_complete_ports
() {
44 COMPREPLY
=( $
(compgen
-W "$(network raw list-ports)" -- "${cur}") )
47 _network_complete_zones
() {
48 COMPREPLY
=( $
(compgen
-W "$(network raw list-zones)" -- "${cur}") )
54 local commands
="set reset"
55 local cmd
="$(_network_find_on_cmdline "${commands}")"
56 if [[ -z "${cmd}" ]]; then
57 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
62 _network_description
() {
65 local commands
="edit show"
66 local cmd
="$(_network_find_on_cmdline "${commands}")"
67 if [[ -z "${cmd}" ]]; then
68 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
75 local commands
="list $(network raw list-devices)"
76 local cmd
="$(_network_find_on_cmdline "${commands}")"
77 if [[ -z "${cmd}" ]]; then
78 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
82 local args
="${words[@]:1}"
88 _network_device_subcommand
${args}
93 _network_device_subcommand
() {
96 local commands
="discover identify monitor status unlock ussd"
97 local cmd
="$(_network_find_on_cmdline "${commands}")"
98 if [[ -z "${cmd}" ]]; then
99 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
116 local commands
="edit reload restart show start stop subnet"
117 local cmd
="$(_network_find_on_cmdline "${commands}")"
118 if [[ -z "${cmd}" ]]; then
119 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
123 local args
="${words[@]:1}"
126 _network_dhcpd_subnet
"${proto}" ${args}
131 _network_dhcpd_subnet
() {
137 local commands
="new remove show $(network raw list-dhcpd-subnets "${proto}")"
138 local cmd
="$(_network_find_on_cmdline "${commands}")"
139 if [[ -z "${cmd}" ]]; then
140 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
144 local subnet
="${words[0]}"
145 local args
="${words[@]:1}"
154 _network_dhcpd_subnet_subcommand
"${proto}" "${subnet}" ${args}
159 _network_dhcpd_subnet_subcommand() {
166 local commands="edit options range show
"
167 local cmd="$
(_network_find_on_cmdline
"${commands}")"
168 if [[ -z "${cmd}" ]]; then
169 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
173 local args="${words[@]:1}"
179 _network_dhcpd_subnet_subcommand_options "${proto}" "${subnet}" ${args}
182 _network_dhcpd_subnet_subcommand_range
"${proto}" "${subnet}" ${args}
187 _network_dhcpd_subnet_subcommand_options() {
193 for option in $(network raw list-dhcpd-subnet-options "${proto}"); do
194 options="${options} ${option}="
197 COMPREPLY=( $(compgen -W "${options}" -- "${cur}") )
200 _network_dhcpd_subnet_subcommand_range() {
207 local commands="new remove
"
208 local cmd="$
(_network_find_on_cmdline
"${commands}")"
209 if [[ -z "${cmd}" ]]; then
210 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
216 COMPREPLY=( $(compgen -W "--end= --start=" -- "${cur}") )
219 COMPREPLY=( $(compgen -W "$
(network raw list-dhcpd-ranges-of-subnet
"${proto}" "${subnet}")" \
225 _network_dns_server() {
228 local commands="add list remove update
"
229 local cmd="$
(_network_find_on_cmdline
"${commands}")"
230 if [[ -z "${cmd}" ]]; then
231 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
237 COMPREPLY=( $(compgen -W "$
(network raw list-dns-servers
)" \
246 local commands="new destroy $
(network raw list-ports
)"
247 local cmd="$
(_network_find_on_cmdline
"${commands}")"
248 if [[ -z "${cmd}" ]]; then
249 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
253 local args="${words[@]:1}"
256 _network_complete_hooks "port
"
259 _network_complete_ports
262 local args="${words[@]:1}"
263 _network_port_subcommand ${args}
268 _network_port_subcommand() {
271 local commands="color create description down edit identify remove status up
"
272 local cmd="$
(_network_find_on_cmdline
"${commands}")"
273 if [[ -z "${cmd}" ]]; then
274 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
278 local args="${words[@]:1}"
281 _network_color ${args}
284 _network_description ${args}
293 local commands="static
"
294 local cmd="$
(_network_find_on_cmdline
"${commands}")"
295 if [[ -z "${cmd}" ]]; then
296 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
302 local args="${words[@]}"
303 _network_route_static ${args}
309 _network_route_static() {
312 local commands="add list remove reload
"
313 local cmd="$
(_network_find_on_cmdline
"${commands}")"
314 if [[ -z "${cmd}" ]]; then
315 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
321 if [[ "${cur}" = -* ]]; then
322 COMPREPLY=( $(compgen -W "--blackhole --gateway= --mtu= \
323 --prohibit --unreachable" -- "${cur}") )
327 # TODO auto-complete options like --protocol here
328 COMPREPLY=( $(compgen -W "--protocol=" -- "${cur}") )
333 _network_settings() {
337 for key in $(network raw list-settings); do
338 keys="${keys} ${key}="
340 COMPREPLY=( $(compgen -W "${keys}" -- "${cur}") )
346 local commands="ipsec security-policies
"
347 local cmd="$
(_network_find_on_cmdline
"${commands}")"
348 if [[ -z "${cmd}" ]]; then
349 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
354 local args="${words[@]:1}"
357 _network_vpn_ipsec ${args}
360 _network_vpn_security_policies ${args}
365 _network_vpn_ipsec() {
368 local commands="connection
"
369 local cmd="$
(_network_find_on_cmdline
"${commands}")"
370 if [[ -z "${cmd}" ]]; then
371 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
376 local args="${words[@]:1}"
379 _network_vpn_ipsec_connection ${args}
384 _network_vpn_ipsec_connection() {
387 local commands="destroy new $
(network raw list-ipsec-connections
)"
388 local cmd="$
(_network_find_on_cmdline
"${commands}")"
389 if [[ -z "${cmd}" ]]; then
390 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
395 local args="${words[@]:1}"
404 if network raw ipsec-connection-exists ${cmd}; then
405 _network_vpn_ipsec_connection_subcommands ${cmd} ${args}
411 _network_vpn_ipsec_connection_subcommands() {
412 local connection=${1}
416 local commands="authentication down inactivity-timeout
local mode peer remote security-policy show up
"
417 local cmd="$
(_network_find_on_cmdline
"${commands}")"
418 if [[ -z "${cmd}" ]]; then
419 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
424 local args="${words[@]:1}"
427 _network_vpn_ipsec_connection_subcommands_authentication ${connection} ${args}
430 _network_vpn_ipsec_connection_subcommands_local_remote ${connection} "local" ${args}
433 _network_vpn_ipsec_connection_subcommands_mode ${args}
436 _network_vpn_ipsec_connection_subcommands_local_remote ${connection} "remote
" ${args}
439 _network_vpn_ipsec_connection_subcommands_security_policy ${args}
444 _network_vpn_ipsec_connection_subcommands_authentication() {
445 local connection=${1}
449 local commands="psk mode
"
450 local cmd="$
(_network_find_on_cmdline
"${commands}")"
451 if [[ -z "${cmd}" ]]; then
452 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
457 local args="${words[@]:1}"
460 _network_vpn_ipsec_connection_subcommands_authentication_mode ${connection} ${args}
465 _network_vpn_ipsec_connection_subcommands_local_remote() {
466 local connection=${1}
471 local commands="id prefix
"
472 local cmd="$
(_network_find_on_cmdline
"${commands}")"
473 if [[ -z "${cmd}" ]]; then
474 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
479 local args="${words[@]:1}"
482 _network_vpn_ipsec_connection_subcommands_prefix "${connection}" "${type}" ${args}
487 _network_vpn_ipsec_connection_subcommands_prefix
() {
491 _network_vpn_ipsec_connection_subcommands_authentication_mode
() {
492 local connection
=${1}
497 local cmd
="$(_network_find_on_cmdline "${commands}")"
498 if [[ -z "${cmd}" ]]; then
499 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
504 _network_vpn_ipsec_connection_subcommands_mode
() {
507 local commands
="gre-transport tunnel vti"
508 local cmd
="$(_network_find_on_cmdline "${commands}")"
509 if [[ -z "${cmd}" ]]; then
510 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
515 _network_vpn_ipsec_connection_subcommands_security_policy
() {
518 local commands
="$(network raw list-vpn-security-policies-all)"
519 local cmd
="$(_network_find_on_cmdline "${commands}")"
520 if [[ -z "${cmd}" ]]; then
521 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
526 _network_vpn_security_policies
() {
529 local commands
="destroy new $(network raw list-vpn-security-policies-all)"
530 local cmd
="$(_network_find_on_cmdline "${commands}")"
531 if [[ -z "${cmd}" ]]; then
532 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
537 local args
="${words[@]:1}"
546 if network raw vpn-security-policy-exists
${cmd}; then
547 _network_vpn_security_policies_subcommands
${cmd} ${args}
553 _network_vpn_security_policies_subcommands
() {
558 local commands
="cipher compression group-type integrity key-exchange lifetime pfs show"
559 local cmd
="$(_network_find_on_cmdline "${commands}")"
560 if [[ -z "${cmd}" ]]; then
561 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
566 local args
="${words[@]:1}"
569 _network_vpn_security_policies_subcommands_cipher
${policy} ${args}
572 _network_vpn_security_policies_subcommands_compression
${policy} ${args}
575 _network_vpn_security_policies_subcommands_group_type
${policy} ${args}
578 _network_vpn_security_policies_subcommands_integrity
${policy} ${args}
581 _network_vpn_security_policies_subcommands_key_exchange
${policy} ${args}
584 _network_vpn_security_policies_subcommands_pfs
${policy} ${args}
589 _network_vpn_security_policies_subcommands_cipher
() {
593 _network_vpn_security_policies_subcommands_compression
() {
597 _network_vpn_security_policies_subcommands_group_type
() {
601 _network_vpn_security_policies_subcommands_integrity
() {
605 _network_vpn_security_policies_subcommands_key_exchange
() {
609 _network_vpn_security_policies_subcommands_pfs
() {
616 local commands
="new destroy $(network raw list-zones)"
617 local cmd
="$(_network_find_on_cmdline "${commands}")"
618 if [[ -z "${cmd}" ]]; then
619 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
624 local args
="${words[@]:1}"
627 _network_zone_new
${args}
630 _network_complete_zones
634 local args
="${words[@]:1}"
635 _network_zone_subcommand
"${zone}" ${args}
640 _network_zone_new
() {
642 local cmd
=${words[@]:0:1}
644 # Suggest useful zone names
645 if [[ -z "${cmd}" ]]; then
646 local commands
="$(network raw list-next-free-zones)"
647 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
649 # If a valid zone name was entered, we can move on
650 elif network raw zone-name-is-valid
${cmd}; then
651 local args
="${words[@]:1}"
652 _network_complete_hooks zone
${args}
658 _network_zone_subcommand
() {
664 local commands
="color config description disable down edit enable identify port rename status up"
665 local cmd
="$(_network_find_on_cmdline "${commands}")"
666 if [[ -z "${cmd}" ]]; then
667 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
671 local args
="${words[@]:1}"
674 _network_zone_subcommand_config
"${zone}" ${args}
677 _network_zone_subcommand_port
"${zone}" ${args}
680 _network_color
${args}
683 _network_description
${args}
688 _network_zone_subcommand_config
() {
694 local commands
="destroy list new $(network raw list-zone-config-hids ${zone})"
696 local cmd
="$(_network_find_on_cmdline "${commands}")"
697 if [[ -z "${cmd}" ]]; then
698 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
702 local args
="${words[@]:1}"
705 _network_complete_hooks
"config"
708 _network_zone_subcommand_config_destroy
${zone} ${args}
711 if network raw zone-config-id-is-valid
${zone} ${cmd} || network raw zone-config-hid-is-valid ${zone} ${cmd}; then
712 _network_zone_subcommand_config_subcommand
${zone} ${args}
718 _network_zone_subcommand_config_subcommand
() {
724 local commands
="edit"
726 local cmd
="$(_network_find_on_cmdline "${commands}")"
727 if [[ -z "${cmd}" ]]; then
728 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
733 _network_zone_subcommand_config_destroy
() {
739 local commands
="$(network raw list-zone-config-ids ${zone})"
741 local cmd
="$(_network_find_on_cmdline "${commands}")"
742 if [[ -z "${cmd}" ]]; then
743 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
748 _network_zone_subcommand_port
() {
754 local commands
="attach detach $(network raw list-ports-of-zone "${zone}")"
755 local cmd
="$(_network_find_on_cmdline "${commands}")"
756 if [[ -z "${cmd}" ]]; then
757 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
763 COMPREPLY
=( $
(compgen
-W "$(network raw list-free-ports "${zone}")" \
767 COMPREPLY
=( $
(compgen
-W "$(network raw list-ports-of-zone "${zone}")" \
772 local args
="${words[@]:1}"
773 _network_zone_subcommand_port_subcommand
"${zone}" "${port}" ${args}
778 _network_zone_subcommand_port_subcommand() {
785 local commands="edit
"
786 local cmd="$
(_network_find_on_cmdline
"${commands}")"
787 if [[ -z "${cmd}" ]]; then
788 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
794 # TODO auto-complete the zone-port hook
800 local cur prev words cword
801 _init_completion || return
804 for (( i=1; i < ${#words[@]} - 1; i++ )); do
805 [[ "${words[i]}" = -* ]] && continue
806 cmd="${words[i]}" && break
809 if [[ -z "${cmd}" ]]; then
812 COMPREPLY=( $(compgen -W "--debug" -- "${cur}") )
815 COMPREPLY=( $(compgen -W "device dhcpv4 dhcpv6 dns-server \
816 help hostname port
reset route settings status vpn zone
" \
824 local args="${words[@]:i+1}"
827 _network_device ${args}
830 _network_dhcpd "${cmd/dhcpv/ipv}" ${args}
833 _network_dns_server ${args}
836 _network_port ${args}
839 _network_route ${args}
842 _network_settings ${args}
845 # start, stop and status optionally take a zone
846 _network_complete_zones
852 _network_zone ${args}
855 } && complete -F _network network