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
="ciphers compression group-type integrity key-exchange lifetime pfs pseudo-random-functions 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_ciphers
${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}
586 pseudo-random-functions
)
587 _network_vpn_security_policies_subcommands_pseudo_random_functions
"${policy}" "${args}"
590 _network_vpn_security_policies_subcommands_key_exchange
${policy} ${args}
593 _network_vpn_security_policies_subcommands_pfs
${policy} ${args}
598 _network_vpn_security_policies_subcommands_ciphers
() {
602 _network_vpn_security_policies_subcommands_compression
() {
606 _network_vpn_security_policies_subcommands_group_type
() {
610 _network_vpn_security_policies_subcommands_integrity
() {
614 _network_vpn_security_policies_subcommands_pseudo_random_functions
() {
618 _network_vpn_security_policies_subcommands_key_exchange
() {
622 _network_vpn_security_policies_subcommands_pfs
() {
629 local commands
="new destroy $(network raw list-zones)"
630 local cmd
="$(_network_find_on_cmdline "${commands}")"
631 if [[ -z "${cmd}" ]]; then
632 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
637 local args
="${words[@]:1}"
640 _network_zone_new
${args}
643 _network_complete_zones
647 local args
="${words[@]:1}"
648 _network_zone_subcommand
"${zone}" ${args}
653 _network_zone_new
() {
655 local cmd
=${words[@]:0:1}
657 # Suggest useful zone names
658 if [[ -z "${cmd}" ]]; then
659 local commands
="$(network raw list-next-free-zones)"
660 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
662 # If a valid zone name was entered, we can move on
663 elif network raw zone-name-is-valid
${cmd}; then
664 local args
="${words[@]:1}"
665 _network_complete_hooks zone
${args}
671 _network_zone_subcommand
() {
677 local commands
="color config description disable down edit enable identify port rename status up"
678 local cmd
="$(_network_find_on_cmdline "${commands}")"
679 if [[ -z "${cmd}" ]]; then
680 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
684 local args
="${words[@]:1}"
687 _network_zone_subcommand_config
"${zone}" ${args}
690 _network_zone_subcommand_port
"${zone}" ${args}
693 _network_color
${args}
696 _network_description
${args}
701 _network_zone_subcommand_config
() {
707 local commands
="destroy list new $(network raw list-zone-config-hids ${zone})"
709 local cmd
="$(_network_find_on_cmdline "${commands}")"
710 if [[ -z "${cmd}" ]]; then
711 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
715 local args
="${words[@]:1}"
718 _network_complete_hooks
"config"
721 _network_zone_subcommand_config_destroy
${zone} ${args}
724 if network raw zone-config-id-is-valid
${zone} ${cmd} || network raw zone-config-hid-is-valid ${zone} ${cmd}; then
725 _network_zone_subcommand_config_subcommand
${zone} ${args}
731 _network_zone_subcommand_config_subcommand
() {
737 local commands
="edit"
739 local cmd
="$(_network_find_on_cmdline "${commands}")"
740 if [[ -z "${cmd}" ]]; then
741 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
746 _network_zone_subcommand_config_destroy
() {
752 local commands
="$(network raw list-zone-config-ids ${zone})"
754 local cmd
="$(_network_find_on_cmdline "${commands}")"
755 if [[ -z "${cmd}" ]]; then
756 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
761 _network_zone_subcommand_port
() {
767 local commands
="attach detach $(network raw list-ports-of-zone "${zone}")"
768 local cmd
="$(_network_find_on_cmdline "${commands}")"
769 if [[ -z "${cmd}" ]]; then
770 COMPREPLY
=( $
(compgen
-W "${commands}" -- "${cur}") )
776 COMPREPLY
=( $
(compgen
-W "$(network raw list-free-ports "${zone}")" \
780 COMPREPLY
=( $
(compgen
-W "$(network raw list-ports-of-zone "${zone}")" \
785 local args
="${words[@]:1}"
786 _network_zone_subcommand_port_subcommand
"${zone}" "${port}" ${args}
791 _network_zone_subcommand_port_subcommand() {
798 local commands="edit
"
799 local cmd="$
(_network_find_on_cmdline
"${commands}")"
800 if [[ -z "${cmd}" ]]; then
801 COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
807 # TODO auto-complete the zone-port hook
813 local cur prev words cword
814 _init_completion || return
817 for (( i=1; i < ${#words[@]} - 1; i++ )); do
818 [[ "${words[i]}" = -* ]] && continue
819 cmd="${words[i]}" && break
822 if [[ -z "${cmd}" ]]; then
825 COMPREPLY=( $(compgen -W "--debug" -- "${cur}") )
828 COMPREPLY=( $(compgen -W "device dhcpv4 dhcpv6 dns-server \
829 help hostname port
reset route settings status vpn zone
" \
837 local args="${words[@]:i+1}"
840 _network_device ${args}
843 _network_dhcpd "${cmd/dhcpv/ipv}" ${args}
846 _network_dns_server ${args}
849 _network_port ${args}
852 _network_route ${args}
855 _network_settings ${args}
858 # start, stop and status optionally take a zone
859 _network_complete_zones
865 _network_zone ${args}
868 } && complete -F _network network