# Maybe the zone new hook did not exit correctly.
# If this is the case we remove the created zone immediately.
- if [ "${ret}" = "${EXIT_ERROR}" ]; then
- zone_destroy_now "${zone}"
+ if [ "${ret}" != "${EXIT_OK}" ]; then
+ zone_destroy "${zone}"
return ${EXIT_ERROR}
fi
return ${EXIT_ERROR}
fi
- # Check if the zone is tagged for removal.
- if zone_has_destroy_tag ${zone}; then
- error "You cannot edit a zone that is tagged for removal."
- return ${EXIT_ERROR}
- fi
-
local hook="$(zone_get_hook "${zone}")"
if [ -z "${hook}" ]; then
error "Config file did not provide any hook."
hook_zone_exec ${hook} edit ${zone} $@
}
+zone_rename() {
+ assert [ $# -eq 2 ]
-zone_destroy() {
local zone="${1}"
+ local name="${2}"
+
assert zone_exists "${zone}"
+ assert not zone_exists "${name}"
- # Make the zone for removal.
- touch "$(zone_dir "${zone}")/.destroy"
+ # The zone must be shut down before, is then renamed and
+ # potentially brought up again
- log INFO "Zone '${zone}' has been tagged for removal."
-}
+ # Save if the zone is running right now
+ zone_is_active "${zone}"
+ local zone_was_active="${?}"
-zone_has_destroy_tag() {
- local zone="${1}"
- assert zone_exists "${zone}"
+ # Save if the zone is enabled (i.e. auto-start)
+ zone_is_enabled "${zone}"
+ local zone_was_enabled="${?}"
+
+ # Stop the zone
+ zone_stop "${zone}"
+
+ # Disable the zone
+ zone_disable "${zone}"
+
+ # Rename the configuration files
+ mv -f "$(zone_dir "${zone}")" "$(zone_dir "${name}")"
- [ -e "$(zone_dir "${zone}")/.destroy" ]
+ # Enable the zone if it was enabled before
+ [ ${zone_was_enabled} -eq ${EXIT_TRUE} ] && zone_enable "${name}"
+
+ # Start the zone if it was up before
+ [ ${zone_was_active} -eq ${EXIT_TRUE} ] && zone_start "${name}"
+
+ log INFO "Zone ${zone} was renamed to ${name}"
+ return ${EXIT_OK}
}
-# This function will remove the given zone
-# RIGHT NOW. Use zone_destroy to remove it
-# at the next status change.
-zone_destroy_now() {
+
+zone_destroy() {
local zone="${1}"
- assert zone_exists "${zone}"
- log INFO "Removing zone '${zone}' right now."
+ # Cannot delete a zone that does not exist
+ if ! zone_exists "${zone}"; then
+ log ERROR "Zone ${zone} does not exist"
+ return ${EXIT_ERROR}
+ fi
+
+ log INFO "Destroying zone ${zone}"
# Force the zone down.
zone_is_active "${zone}" && zone_stop "${zone}"
- # Disable zone.
+ # Disable zone auto-start
zone_disable "${zone}"
rm -rf "$(zone_dir "${zone}")"
return ${EXIT_ERROR}
fi
- # Check if a zone has got the remove tag.
- if zone_has_destroy_tag ${zone}; then
- error "Cannot bring up any zone which is to be removed."
- return ${EXIT_ERROR}
- fi
-
local hook="$(zone_get_hook "${zone}")"
if [ -z "${hook}" ]; then
error "Config file did not provide any hook."
# Execute all triggers after the zone went down
triggers_execute_all "down" ZONE="${zone}"
-
- # Remove the zone, if it has got a remove tag.
- if zone_has_destroy_tag "${zone}"; then
- zone_destroy_now "${zone}"
- fi
}
zone_status() {
fi
hook_zone_exec "${hook}" "status" "${zone}" "$@"
+}
- # Show that the zone it to be removed soon.
- if zone_has_destroy_tag ${zone}; then
- warning "This zone is tagged for removal."
- fi
+zone_identify() {
+ assert [ $# -ge 1 ]
+
+ local zone="${1}"
+ shift
+
+ assert zone_exists "${zone}"
+
+ log INFO "Identifying zone ${zone}"
+ local pids
+
+ local pid
+ local port
+ for port in $(zone_get_ports "${zone}"); do
+ # Identify all the ports
+ port_identify "${port}" --background $@
+
+ # Save the PIDs of the subprocesses
+ list_append pids "$(cmd_background_get_pid)"
+ done
+
+ # Wait until all port_identfy processes have finished
+ for pid in ${pids}; do
+ cmd_background_result "${pid}"
+ done
+
+ return ${EXIT_OK}
}
zone_get_ports() {
zone_config_new "${zone}" "$@"
;;
destroy)
- zone_config_destroy "${zone}" "$@"
+ # usually ${1} is a valid hid
+ local hid=${1}
+ shift 1
+
+ # We convert the hid into an id
+ local id=$(zone_config_convert_hid_to_id ${zone} ${hid})
+
+ # If id isset the hid is valid and we can go on with the id
+ if isset id; then
+ zone_config_destroy "${zone}" "${id}" "$@"
+
+ # If we can't get a valid hid we check if we got a valid id
+ else
+ if zone_config_id_is_valid ${zone} ${hid}; then
+ zone_config_destroy "${zone}" ${hid} "$@"
+ else
+ log ERROR "${id} is not a valid id or hid"
+ fi
+ fi
;;
- edit)
- zone_config_edit "${zone}" "$@"
+ list)
+ zone_config_list "${zone}" "$@"
;;
*)
- error "Unrecognized argument: ${cmd}"
- cli_usage root-zone-config-subcommands
- exit ${EXIT_ERROR}
+ # usually ${1} is a valid hid
+ local hid=${cmd}
+ local cmd=${1}
+ shift 1
+
+ local id=$(zone_config_convert_hid_to_id ${zone} ${hid})
+
+ # If id isset the hid is valid and we can go on with the id
+ if isset id && [[ ${cmd} == "edit" ]]; then
+ zone_config_edit "${zone}" "${id}" "$@"
+
+ # If we didn't get a valid hid we check if we got a valid id
+ else
+ if zone_config_id_is_valid ${zone} ${id} && [[ ${cmd} == "edit" ]]; then
+ shift 1
+ zone_config_edit "${zone}" "${id}" "$@"
+ else
+ # in ${hid} is saved the command after network zone ${zone} config
+ error "Unrecognized argument: ${hid}"
+ cli_usage root-zone-config-subcommands
+ exit ${EXIT_ERROR}
+ fi
+ fi
;;
esac
}
}
zone_config_new() {
- zone_config_cmd "new" "$@"
+ local zone="${1}"
+ shift
+
+ # Create a new configuration, but exit when that was
+ # not successful.
+ zone_config_cmd "new" "${zone}" "$@" || return ${?}
+
+ # If the config could be created, we will try to bring
+ # it up if the zone is up, too.
+ if zone_is_up "${zone}"; then
+ zone_configs_up "${zone}"
+ fi
}
zone_config_destroy() {
zone_config_cmd "edit" "$@"
}
+zone_config_list() {
+ # This function list in an nice way all configs of a zone
+ local zone=${1}
+ assert isset zone
+
+ # Print a nice header
+ local format="%-3s %-20s %-20s"
+ print "${format}" "ID" "HOOK" "HID"
+
+ local config
+ local hook
+ local id
+ local hid
+
+ # Print for all config:
+ # id and hook
+ for config in $(zone_configs_list "${zone}"); do
+ id=${config##*.}
+ hook=$(zone_config_get_hook "${zone}" "${config}")
+ hid=$(zone_config_get_hid "${zone}" "${config}")
+ assert isset hook
+ print "${format}" "${id}" "${hook}" "${hid}"
+ done
+}
+
zone_config_show() {
zone_config_cmd "show" "$@"
}
+# Returns a list of all used ids for a zone
+zone_config_list_ids() {
+ assert [ $# -eq 1 ]
+
+ local zone=${1}
+ local config
+ local ids
+
+ for config in $(zone_configs_list ${zone}); do
+ list_append ids "$(config_get_id_from_config ${config})"
+ done
+
+ echo ${ids}
+}
+
+# List all hids of a zone
+zone_config_list_hids() {
+ assert [ $# -eq 1 ]
+
+ local zone=${1}
+
+ local config
+ for config in $(zone_configs_list ${zone}); do
+ zone_config_get_hid "${zone}" "${config}"
+ done
+}
+
+# get the hid from a given config
+zone_config_get_hid() {
+ assert [ $# -eq 2 ]
+
+ local zone=${1}
+ local config=${2}
+
+ local hook="$(zone_config_get_hook "${zone}" "${config}")"
+
+ hook_exec "config" "${hook}" "hid" "${zone}" "${config}"
+}
+
+# Checks if a hid is valid for a given zone
+zone_config_hid_is_valid() {
+ assert [ $# -eq 2]
+
+ local zone=${1}
+ local hid=${2}
+
+ local _hid
+ for _hid in $(zone_config_list_hids "${zone}"); do
+ if [[ ${_hid} = ${hid} ]]; then
+ return ${EXIT_TRUE}
+ fi
+ done
+
+ return ${EXIT_FALSE}
+}
+
+# This function converts a hid to a id
+zone_config_convert_hid_to_id() {
+ assert [ $# -eq 2 ]
+
+ local zone=${1}
+ local hid=${2}
+
+ local config
+ for config in $(zone_configs_list ${zone}); do
+ # Get hook from config
+ local hook="$(zone_config_get_hook "${zone}" "${config}")"
+
+ if [[ "$(hook_exec "config" "${hook}" "hid" "${zone}" "${config}")" == "${hid}" ]]; then
+ config_get_id_from_config "${config}"
+ return ${EXIT_TRUE}
+ fi
+ done
+
+ return ${EXIT_FALSE}
+}
+
zone_show() {
local zone=${1}
done
}
+zones_get_next_free() {
+ # This function return the next free zones.
+ # Example net0 upl0 upl1 are configured so the next free zones are:
+ # net1 upl2
+ local i
+ local zone_name
+ for zone_name in ${VALID_ZONES}; do
+ i=0
+
+ while true; do
+ local zone="${zone_name}${i}"
+ if ! zone_exists ${zone}; then
+ echo "${zone}"
+ break
+ fi
+ i=$(( i + 1 ))
+ done
+ done
+}
+
zones_get_local() {
local zone
for zone in $(zones_get_all); do
local hook="$(zone_get_hook "${zone}")"
assert isset hook
+ # Make the port briefly flash if supported
+ if device_exists ${port}; then
+ port_identify "${port}" --background
+ fi
+
hook_zone_exec "${hook}" "port_attach" "${zone}" "${port}" "$@"
local ret="${?}"
local hook=$(zone_get_hook "${zone}")
assert isset hook
+ # Make the port briefly flash if supported
+ port_identify "${port}" --background
+
hook_zone_exec "${hook}" "port_detach" "${zone}" "${port}" "$@"
local ret="${?}"
done
}
+zone_config_get_new_id() {
+ # This functions returns the next free id for a zone
+
+ assert [ $# -eq 1 ]
+ local zone=${1}
+
+ local zone_path=$(zone_dir ${zone})
+ local i=0
+
+ while true; do
+ if [ ! -f ${zone_path}/configs/*.${i} ]; then
+ echo "${i}"
+ return ${EXIT_OK}
+ fi
+ (( i++ ))
+ done
+}
+
+zone_config_check_same_setting() {
+ # This functions checks if a config hook
+ # with the same setting is already configured for this zone.
+ # Returns True when yes and False when no.
+
+ assert [ $# -eq 4 ]
+
+ local zone=${1}
+ local hook=${2}
+ local key=${3}
+ local value=${4}
+
+ # The key should be local for this function
+ local ${key}
+ local config
+
+ for config in $(zone_configs_list ${zone}); do
+ # Check if the config is from the given hook, when not continue
+ if [[ $(zone_config_get_hook "${zone}" "${config}") != ${hook} ]]; then
+ continue
+ fi
+ # Get the value of the key for a given function
+ zone_config_settings_read "${zone}" "${config}" \
+ --ignore-superfluous-settings "${key}"
+ # Check if the value of the config and the passed value are eqal
+ if [[ "${value}" == "${!key}" ]]; then
+ return ${EXIT_TRUE}
+ fi
+ done
+
+ return ${EXIT_FALSE}
+}
+
zone_config_get_hook() {
assert [ $# -eq 2 ]
print "${HOOK}"
}
+zone_config_hook_is_configured() {
+ # Checks if a zone has already at least one config with the given hook.
+ # Returns True when yes and False when no
+
+ assert [ $# -eq 2 ]
+ local zone=${1}
+ local hook=${2}
+
+ local config
+ for config in $(zone_configs_list "${zone}"); do
+ local config_hook="$(zone_config_get_hook "${zone}" "${config}")"
+ assert isset config_hook
+ if [[ ${hook} == ${config_hook} ]]; then
+ return ${EXIT_TRUE}
+ fi
+
+ done
+
+ # If we get here the zone has no config with the given hook
+ return ${EXIT_FALSE}
+}
+
+zone_config_id_is_valid() {
+ # This function checks if a given id is valid for a zone
+ # Return True when yes and false when no
+
+ assert [ $# -eq 2 ]
+ local zone=${1}
+ local id=${2}
+
+ local zone_path=$(zone_dir ${zone})
+
+ [ -f ${zone_path}/configs/*.${id} ];
+}
+
+# This function checks if a given hid is valid for a zone
+# Return True when yes and false when no
+zone_config_hid_is_valid() {
+ assert [ $# -eq 2 ]
+ local zone=${1}
+ local hid=${2}
+
+ local _hid
+ for _hid in $(zone_config_list_hids ${zone}); do
+ if [[ ${_hid} == ${hid} ]]; then
+ return ${EXIT_TRUE}
+ fi
+ done
+
+ return ${EXIT_FALSE}
+}
+
+zone_config_get_hook_from_id() {
+ # Returns the hook for a given id
+ assert [ $# -eq 2 ]
+ local zone=${1}
+ local id=${2}
+
+ local config
+ for config in $(zone_configs_list "${zone}"); do
+ if [[ ${config} == *.${id} ]]; then
+ local config_hook="$(zone_config_get_hook "${zone}" "${config}")"
+ assert isset config_hook
+ print "${config_hook}"
+ return "${EXIT_OK}"
+ fi
+ done
+
+ # If we get here the zone has no config with the given id
+ return ${EXIT_ERROR}
+}
+
zone_has_ip() {
device_has_ip $@
}
assert [ $# -ge 2 ]
local zone="${1}"
- local config="${2}"
- shift 2
+ local hook="${2}"
+ local id=${3}
+
+ if ! isset id; then
+ id=$(zone_config_get_new_id ${zone})
+ log DEBUG "ID for the config is: ${id}"
+ fi
local args
if function_exists "hook_check_config_settings"; then
fi
list_append args ${HOOK_CONFIG_SETTINGS}
- local path="$(zone_dir "${zone}")/configs/${config}"
+ local path="$(zone_dir "${zone}")/configs/${hook}.${id}"
settings_write "${path}" ${args}
}
+zone_config_settings_destroy() {
+ # This function deletes the config file for a given zone and config
+ assert [ $# -ge 2 ]
+ local zone="${1}"
+ local config="${2}"
+
+ local path="$(zone_dir "${zone}")/configs/${config}"
+
+ # Check if path is valid
+ if [ ! -f ${path} ]; then
+ log ERROR "Path: '${path}' is not valid"
+ return ${EXIT_ERROR}
+ fi
+
+ log DEBUG "Deleting config file ${path}"
+ rm -f "${path}"
+
+}
zone_port_settings_read() {
assert [ $# -ge 2 ]
local path="$(zone_dir "${zone}")/ports/${port}"
settings_remove "${path}"
}
+
+zone_get_color() {
+ # This function return the color of a zone
+ assert [ $# -eq 1 ]
+
+ local name=${1}
+ color_read "zone" ${name}
+}
+
+zone_get_description_title() {
+ assert [ $# -eq 1 ]
+
+ local name=${1}
+ description_title_read $(description_format_filename "zone" "${name}")
+}