2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2010 Michael Tremer & Christian Schmidt #
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 ###############################################################################
25 echo "${NETWORK_ZONE_DIR}/zones/${zone}"
28 function zone_exists
() {
32 [ -d "$(zone_dir ${zone})" ]
35 function zone_match
() {
39 for i
in ${VALID_ZONES}; do
40 match
="${match}|${i}[0-9]{1,5}"
43 echo "${match:1:${#match}}"
46 function zone_name_is_valid
() {
49 # Don't accept empty strings.
50 [ -z "${zone}" ] && return ${EXIT_FALSE}
52 [[ ${zone} =~ $
(zone_match
) ]]
55 function zone_is_local
() {
58 [[ "${zone:0:${#ZONE_LOCAL}}" = "${ZONE_LOCAL}" ]]
61 function zone_is_nonlocal
() {
64 [[ "${zone:0:${#ZONE_NONLOCAL}}" = "${ZONE_NONLOCAL}" ]]
67 function zone_get_hook
() {
71 config_get_hook $
(zone_dir
${zone})/settings
74 function zone_start
() {
75 # This function will bring up the zone
76 # 'asynchronously' with help of systemd.
79 assert zone_exists
${zone}
81 service_start
"network@${zone}.service"
84 function zone_stop
() {
85 # This function will bring down the zone
86 # 'asynchronously' with help of systemd.
89 assert zone_exists
${zone}
91 service_stop
"network@${zone}.service"
94 function zone_reload
() {
96 assert zone_exists
"${zone}"
98 service_reload
"network@${zone}.service"
101 function zone_hotplug_event
() {
103 assert zone_exists
"${zone}"
105 # If the zone has already been started, we
106 # will reload it so the current configuration
108 if zone_is_active
"${zone}"; then
109 zone_reload
"${zone}"
112 # If the zone is still down, but in auto-start mode,
114 elif zone_is_enabled
"${zone}"; then
119 # Otherwise, nothing will be done.
123 function zone_enable
() {
124 # This function will enable the zone
125 # with help of systemd.
128 assert zone_exists
"${zone}"
130 # Enable service for the zone
131 service_enable
"network@${zone}.service"
134 if [ ${ret} -eq ${EXIT_OK} ]; then
135 log INFO
"Auto-start enabled for zone ${zone}"
139 log ERROR
"Could not enable zone ${zone}: ${ret}"
143 function zone_disable
() {
144 # This function will disable the zone
145 # with help of systemd.
148 assert zone_exists
"${zone}"
150 # Disable service for the zone
151 service_disable
"network@${zone}.service"
154 if [ ${ret} -eq ${EXIT_OK} ]; then
155 log INFO
"Auto-start disabled for zone ${zone}"
159 log ERROR
"Could not disable zone ${zone}: ${ret}"
163 function zone_is_enabled
() {
167 # Ask systemd if the zone is enabled.
168 if service_is_enabled
"network@${zone}.service"; then
175 function zone_is_active
() {
179 if service_is_active
"network@${zone}.service"; then
186 function zone_create
() {
191 if ! zone_name_is_valid
${zone}; then
192 error
"Zone name '${zone}' is not valid."
196 if zone_exists
${zone}; then
197 error
"Zone '${zone}' does already exist."
201 if ! hook_zone_exists
${hook}; then
202 error
"Hook '${hook}' does not exist."
206 mkdir
-p $
(zone_dir
${zone})
208 # Create directories for configs and ports
209 mkdir
-p $
(zone_dir
${zone})/{configs
,ports
}
211 hook_zone_exec
${hook} create
${zone} $@
214 # Maybe the zone create hook did not exit correctly.
215 # If this is the case we remove the created zone immediately.
216 if [ "${ret}" = "${EXIT_ERROR}" ]; then
217 zone_remove_now
${zone}
221 # Automatically enable zone.
222 zone_enable
"${zone}"
225 function zone_edit
() {
229 if ! zone_exists
${zone}; then
230 error
"Zone '${zone}' does not exist."
234 # Check if the zone is tagged for removal.
235 if zone_has_remove_tag
${zone}; then
236 error
"You cannot edit a zone that is tagged for removal."
240 local hook
=$
(config_get_hook $
(zone_dir
${zone})/settings
)
242 if [ -z "${hook}" ]; then
243 error
"Config file did not provide any hook."
247 if ! hook_zone_exists
${hook}; then
248 error
"Hook '${hook}' does not exist."
252 hook_zone_exec
${hook} edit
${zone} $@
256 function zone_remove
() {
258 assert zone_exists
${zone}
260 # Make the zone for removal.
261 touch $
(zone_dir
${zone})/.remove
263 log INFO
"Zone '${zone}' has been tagged for removal."
266 function zone_has_remove_tag
() {
268 assert zone_exists
${zone}
270 [ -e "$(zone_dir ${zone})/.remove" ]
273 # This function will remove the given zone
274 # RIGHT NOW. Use zone_remove to remove it
275 # at the next status change.
276 function zone_remove_now
() {
278 assert zone_exists
${zone}
280 log INFO
"Removing zone '${zone}' right now."
282 # Force the zone down.
283 zone_is_up
${zone} && zone_set_down
${zone}
286 zone_disable
"${zone}"
288 rm -rf $
(zone_dir
${zone})
295 if ! zone_exists
${zone}; then
296 error
"Zone '${zone}' does not exist."
300 # Check if a zone has got the remove tag.
301 if zone_has_remove_tag
${zone}; then
302 error
"Cannot bring up any zone which is to be removed."
306 local hook
=$
(config_get_hook $
(zone_dir
${zone})/settings
)
308 if [ -z "${hook}" ]; then
309 error
"Config file did not provide any hook."
313 if ! hook_zone_exists
${hook}; then
314 error
"Hook '${hook}' does not exist."
318 zone_db
${zone} starting
320 hook_zone_exec
${hook} up
${zone} $@
322 zone_db
${zone} started
325 function zone_down
() {
329 if ! zone_exists
${zone}; then
330 error
"Zone '${zone}' does not exist."
334 local hook
=$
(config_get_hook $
(zone_dir
${zone})/settings
)
336 if [ -z "${hook}" ]; then
337 error
"Config file did not provide any hook."
341 if ! hook_zone_exists
${hook}; then
342 error
"Hook '${hook}' does not exist."
346 zone_db
${zone} stopping
348 hook_zone_exec
${hook} down
${zone} $@
350 zone_db
${zone} stopped
352 # Remove the zone, if it has got a remove tag.
353 if zone_has_remove_tag
${zone}; then
354 zone_remove_now
${zone}
358 function zone_status
() {
362 if ! zone_exists
${zone}; then
363 error
"Zone '${zone}' does not exist."
367 local hook
=$
(config_get_hook $
(zone_dir
${zone})/settings
)
369 if [ -z "${hook}" ]; then
370 error
"Config file did not provide any hook."
374 if ! hook_zone_exists
${hook}; then
375 error
"Hook '${hook}' does not exist."
379 hook_zone_exec
${hook} status
${zone} $@
381 # Show that the zone it to be removed soon.
382 if zone_has_remove_tag
${zone}; then
383 warning
"This zone is tagged for removal."
387 function zone_port
() {
394 assert zone_exists
${zone}
398 zone_port_
${action} ${zone} $@
401 error
"Unrecognized argument: ${action}"
402 cli_usage root-zone-port-subcommands
408 function zone_port_add
() {
417 # Check if the port actually exists.
418 if ! port_exists
"${port}"; then
419 error
"Cannot add port '${port}' which does not exist"
423 # Check if the port is already connected to this or any other zone.
425 for z
in $
(zones_get_all
); do
426 if zone_has_port
"${z}" "${port}"; then
427 error
"Port '${port}' is already assigned to zone '${z}'"
432 local hook
=$
(zone_get_hook
"${zone}")
435 hook_zone_exec
"${hook}" "port_add" "${zone}" "${port}" "$@"
438 function zone_port_edit
() {
447 # Check if the port actually exists.
448 if ! port_exists
"${port}"; then
449 error
"Port '${port}' does not exist"
453 # Check if the zone actually has this port.
454 if ! zone_has_port
"${zone}" "${port}"; then
455 error
"Port '${port}' is not attached to zone '${zone}'"
459 local hook
=$
(zone_get_hook
"${zone}")
462 hook_zone_exec
"${hook}" "port_edit" "${zone}" "${port}" "$@"
465 function zone_port_remove
() {
474 # Check if the zone actually has this port.
475 if ! zone_has_port
"${zone}" "${port}"; then
476 error
"Port '${port}' is not attached to zone '${zone}'"
480 local hook
=$
(zone_get_hook
"${zone}")
483 hook_zone_exec
"${hook}" "port_remove" "${zone}" "${port}" "$@"
486 function zone_get_ports
() {
492 for port
in $
(zone_dir
${zone})/ports
/*; do
493 port
=$
(basename ${port})
495 if port_exists
${port}; then
501 function zone_get_ports_num
() {
507 for port
in $
(zone_dir
"${zone}")/ports
/*; do
508 port
="$(basename "${port}")"
510 if port_exists
"${port}"; then
511 counter
=$
(( ${counter} + 1 ))
519 function zone_has_port
() {
520 # Check, if the given port is configured
530 [ -e "$(zone_dir ${zone})/ports/${port}" ]
533 function zone_config
() {
540 assert zone_exists
"${zone}"
544 zone_config_create
"${zone}" "$@"
547 zone_config_edit
"${zone}" "$@"
550 zone_config_remove
"${zone}" "$@"
553 error
"Unrecognized argument: ${cmd}"
554 cli_usage root-zone-config-subcommands
560 function zone_config_cmd
() {
567 local hook
="$(zone_get_hook "${zone}")"
570 hook_zone_exec
"${hook}" "config_${cmd}" "${zone}" "$@"
573 function zone_config_create
() {
574 zone_config_cmd
"create" "$@"
577 function zone_config_edit
() {
578 zone_config_cmd
"edit" "$@"
581 function zone_config_remove
() {
582 zone_config_cmd
"remove" "$@"
585 function zone_config_show
() {
586 zone_config_cmd
"show" "$@"
589 function zone_show
() {
593 echo " Type: $(zone_get_hook ${zone})"
597 function zones_show
() {
600 for zone
in $
(zones_get $@
); do
605 function zones_get_all
() {
607 for zone
in $
(zone_dir
)/*; do
608 zone
=$
(basename ${zone})
609 zone_exists
${zone} ||
continue
615 function zones_get_local
() {
617 for zone
in $
(zones_get_all
); do
618 zone_is_local
${zone} && echo "${zone}"
622 function zones_get_nonlocal
() {
624 for zone
in $
(zones_get_all
); do
625 zone_is_nonlocal
${zone} && echo "${zone}"
629 function zones_get
() {
635 while [ $# -gt 0 ]; do
650 if zone_name_is_valid
${1}; then
651 zones
="${zones} ${1}"
653 warning
"Unrecognized argument '${1}'"
660 if [ -n "${zones}" ]; then
662 for zone
in ${zones}; do
663 zone_exists
${zone} && echo "${zone}"
668 if [ ${local} -eq 1 ] && [ ${remote} -eq 1 ]; then
670 elif [ ${local} -eq 1 ]; then
672 elif [ ${remote} -eq 1 ]; then
677 function zone_ports_list
() {
681 for port
in $
(zone_dir
${zone})/ports
/*; do
682 [ -e "${port}" ] ||
continue
684 echo $
(basename ${port})
688 function zone_ports_cmd
() {
696 assert zone_exists
${zone}
698 local hook
=$
(zone_get_hook
${zone})
701 for port
in $
(zone_get_ports
${zone}); do
702 hook_zone_exec
${hook} ${cmd} ${zone} ${port} $@
706 function zone_ports_up
() {
707 zone_ports_cmd port_up $@
710 function zone_ports_down
() {
711 zone_ports_cmd port_down $@
714 function zone_ports_status
() {
715 zone_ports_cmd port_status $@
718 function zone_configs_cmd
() {
725 assert zone_exists
"${zone}"
728 for config
in $
(zone_get_configs
"${zone}"); do
729 hook_config_exec
"${config}" "${cmd}" "${zone}" $@
733 function zone_configs_up
() {
734 zone_configs_cmd
"up" $@
737 function zone_configs_down
() {
738 zone_configs_cmd
"down" $@
741 function zone_configs_status
() {
742 zone_configs_cmd
"status" $@
745 function zone_configs_list
() {
749 for config
in $
(zone_dir
${zone})/configs
/*; do
750 [ -e "${config}" ] ||
continue
756 function zone_has_ip
() {
766 starting|started|stopping|stopped
)
767 db_connection_update
${zone} ${action}
772 function zone_is_up
() {
778 function zone_is_down
() {
782 function zone_get_supported_port_hooks
() {
785 local hook
=$
(zone_get_hook
${zone})
787 hook_zone_ports_get_all
${hook}
790 function zone_get_supported_config_hooks
() {
794 function zone_file
() {
799 echo "$(zone_dir ${zone})/settings"
802 function zone_settings_read
() {
807 # Save the HOOK variable.
810 settings_read $
(zone_file
${zone})
816 function zone_settings_write
() {
821 settings_write $
(zone_file
${zone}) ${HOOK_SETTINGS}
824 function zone_settings_set
() {
832 zone_settings_read
${zone}
834 for arg
in ${args}; do
838 zone_settings_write
${zone}
842 function zone_settings_get
() {
850 zone_settings_read
${zone}
856 function zone_config_settings_read
() {
863 local path
="$(zone_dir "${zone}")/configs/${config}"
864 settings_read
"${path}" "$@"
867 function zone_config_settings_write
() {
874 local path
="$(zone_dir "${zone}")/configs/${config}"
875 settings_write
"${path}" "$@"
878 function zone_port_settings_read
() {
885 local path
="$(zone_dir "${zone}")/ports/${port}"
886 settings_read
"${path}" "$@"
889 function zone_port_settings_write
() {
896 local path
="$(zone_dir "${zone}")/ports/${port}"
897 settings_write
"${path}" "$@"
900 function zone_port_settings_remove
() {
906 local path
="$(zone_dir "${zone}")/ports/${port}"
907 settings_remove
"${path}"