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 color description 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_color ${args}
433 _network_description ${args}
436 _network_vpn_ipsec_connection_subcommands_local_remote ${connection} "local" ${args}
439 _network_vpn_ipsec_connection_subcommands_mode ${args}
442 _network_vpn_ipsec_connection_subcommands_local_remote ${connection} "remote
" ${args}
445 _network_vpn_ipsec_connection_subcommands_security_policy ${args}
450 _network_vpn_ipsec_connection_subcommands_authentication() {
451 local connection=${1}
455 local commands="mode pre-shared-key
"
456 local cmd="$
(_network_find_on_cmdline
"${commands}")"
457 if [[ -z "${cmd}" ]]; then
458 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
463 local args="${words[@]:1}"
466 _network_vpn_ipsec_connection_subcommands_authentication_mode ${connection} ${args}
471 _network_vpn_ipsec_connection_subcommands_local_remote() {
472 local connection=${1}
477 local commands="id prefix
"
478 local cmd="$
(_network_find_on_cmdline
"${commands}")"
479 if [[ -z "${cmd}" ]]; then
480 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
485 local args="${words[@]:1}"
488 _network_vpn_ipsec_connection_subcommands_prefix "${connection}" "${type}" ${args}
493 _network_vpn_ipsec_connection_subcommands_prefix
() {
497 _network_vpn_ipsec_connection_subcommands_authentication_mode
() {
498 local connection
=${1}
503 local cmd
="$(_network_find_on_cmdline "${commands}")"
504 if [[ -z "${cmd}" ]]; then
505 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
510 _network_vpn_ipsec_connection_subcommands_mode
() {
513 local commands
="gre-transport tunnel vti"
514 local cmd
="$(_network_find_on_cmdline "${commands}")"
515 if [[ -z "${cmd}" ]]; then
516 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
521 _network_vpn_ipsec_connection_subcommands_security_policy
() {
524 local commands
="$(network raw list-vpn-security-policies-all)"
525 local cmd
="$(_network_find_on_cmdline "${commands}")"
526 if [[ -z "${cmd}" ]]; then
527 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
532 _network_vpn_security_policies
() {
535 local commands
="destroy new $(network raw list-vpn-security-policies-all)"
536 local cmd
="$(_network_find_on_cmdline "${commands}")"
537 if [[ -z "${cmd}" ]]; then
538 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
543 local args
="${words[@]:1}"
552 if network raw vpn-security-policy-exists
${cmd}; then
553 _network_vpn_security_policies_subcommands
${cmd} ${args}
559 _network_vpn_security_policies_subcommands
() {
564 local commands
="cipher compression group-type integrity key-exchange lifetime pfs show"
565 local cmd
="$(_network_find_on_cmdline "${commands}")"
566 if [[ -z "${cmd}" ]]; then
567 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
572 local args
="${words[@]:1}"
575 _network_vpn_security_policies_subcommands_cipher
${policy} ${args}
578 _network_vpn_security_policies_subcommands_compression
${policy} ${args}
581 _network_vpn_security_policies_subcommands_group_type
${policy} ${args}
584 _network_vpn_security_policies_subcommands_integrity
${policy} ${args}
587 _network_vpn_security_policies_subcommands_key_exchange
${policy} ${args}
590 _network_vpn_security_policies_subcommands_pfs
${policy} ${args}
595 _network_vpn_security_policies_subcommands_cipher
() {
599 _network_vpn_security_policies_subcommands_compression
() {
603 _network_vpn_security_policies_subcommands_group_type
() {
607 _network_vpn_security_policies_subcommands_integrity
() {
611 _network_vpn_security_policies_subcommands_key_exchange
() {
615 _network_vpn_security_policies_subcommands_pfs
() {
622 local commands
="new destroy $(network raw list-zones)"
623 local cmd
="$(_network_find_on_cmdline "${commands}")"
624 if [[ -z "${cmd}" ]]; then
625 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
630 local args
="${words[@]:1}"
633 _network_zone_new
${args}
636 _network_complete_zones
640 local args
="${words[@]:1}"
641 _network_zone_subcommand
"${zone}" ${args}
646 _network_zone_new
() {
648 local cmd
=${words[@]:0:1}
650 # Suggest useful zone names
651 if [[ -z "${cmd}" ]]; then
652 local commands
="$(network raw list-next-free-zones)"
653 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
655 # If a valid zone name was entered, we can move on
656 elif network raw zone-name-is-valid
${cmd}; then
657 local args
="${words[@]:1}"
658 _network_complete_hooks zone
${args}
664 _network_zone_subcommand
() {
670 local commands
="color config description disable down edit enable identify port rename status up"
671 local cmd
="$(_network_find_on_cmdline "${commands}")"
672 if [[ -z "${cmd}" ]]; then
673 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
677 local args
="${words[@]:1}"
680 _network_zone_subcommand_config
"${zone}" ${args}
683 _network_zone_subcommand_port
"${zone}" ${args}
686 _network_color
${args}
689 _network_description
${args}
694 _network_zone_subcommand_config
() {
700 local commands
="destroy list new $(network raw list-zone-config-hids ${zone})"
702 local cmd
="$(_network_find_on_cmdline "${commands}")"
703 if [[ -z "${cmd}" ]]; then
704 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
708 local args
="${words[@]:1}"
711 _network_complete_hooks
"config"
714 _network_zone_subcommand_config_destroy
${zone} ${args}
717 if network raw zone-config-id-is-valid
${zone} ${cmd} || network raw zone-config-hid-is-valid ${zone} ${cmd}; then
718 _network_zone_subcommand_config_subcommand
${zone} ${args}
724 _network_zone_subcommand_config_subcommand
() {
730 local commands
="edit"
732 local cmd
="$(_network_find_on_cmdline "${commands}")"
733 if [[ -z "${cmd}" ]]; then
734 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
739 _network_zone_subcommand_config_destroy
() {
745 local commands
="$(network raw list-zone-config-ids ${zone})"
747 local cmd
="$(_network_find_on_cmdline "${commands}")"
748 if [[ -z "${cmd}" ]]; then
749 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
754 _network_zone_subcommand_port
() {
760 local commands
="attach detach $(network raw list-ports-of-zone "${zone}")"
761 local cmd
="$(_network_find_on_cmdline "${commands}")"
762 if [[ -z "${cmd}" ]]; then
763 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
769 COMPREPLY
=( $
(compgen
-W "$(network raw list-free-ports "${zone}")" \
773 COMPREPLY
=( $
(compgen
-W "$(network raw list-ports-of-zone "${zone}")" \
778 local args
="${words[@]:1}"
779 _network_zone_subcommand_port_subcommand
"${zone}" "${port}" ${args}
784 _network_zone_subcommand_port_subcommand() {
791 local commands="edit
"
792 local cmd="$
(_network_find_on_cmdline
"${commands}")"
793 if [[ -z "${cmd}" ]]; then
794 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
800 # TODO auto-complete the zone-port hook
806 local cur prev words cword
807 _init_completion || return
810 for (( i=1; i < ${#words[@]} - 1; i++ )); do
811 [[ "${words[i]}" = -* ]] && continue
812 cmd="${words[i]}" && break
815 if [[ -z "${cmd}" ]]; then
818 COMPREPLY=( $(compgen -W "--debug" -- "${cur}") )
821 COMPREPLY=( $(compgen -W "device dhcpv4 dhcpv6 dns-server \
822 help hostname port
reset route settings status vpn zone
" \
830 local args="${words[@]:i+1}"
833 _network_device ${args}
836 _network_dhcpd "${cmd/dhcpv/ipv}" ${args}
839 _network_dns_server ${args}
842 _network_port ${args}
845 _network_route ${args}
848 _network_settings ${args}
851 # start, stop and status optionally take a zone
852 _network_complete_zones
858 _network_zone ${args}
861 } && complete -F _network network