From: Michael Tremer Date: Sun, 25 Jul 2010 16:28:35 +0000 (+0200) Subject: network: Add some sanity checks when removing a port. X-Git-Tag: 001~36 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=98f4dae6942efb34c7b3183deefee1dd514ee72e;p=people%2Fms%2Fnetwork.git network: Add some sanity checks when removing a port. --- diff --git a/functions.ports b/functions.ports index feecaa24..9cda5641 100644 --- a/functions.ports +++ b/functions.ports @@ -99,10 +99,34 @@ function port_destroy() { port_exists ${port} || return ${EXIT_OK} - local attached_zone=$(port_is_attached ${port}) + # Check if the port is attached to any zone and don't delete it. + local ok=${EXIT_OK} + local attached_zone=$(port_is_attached ${port}) if [ -n "${attached_zone}" ]; then - error "Cannot destroy port '${port}' which is attached to zone '${attached_zone}'." + error_log "Cannot destroy port '${port}' which is attached to zone '${attached_zone}'." + ok=${EXIT_ERROR} + fi + + # Check if the port is linked to any other port and don't allow the user + # to delete it. + local other_port + for other_port in $(ports_get); do + [ "${other_port}" = "${port}" ] && continue + + if listmatch ${port} $(port_get_parents ${other_port}); then + error_log "Cannot destroy port '${port}' which is a parent port to '${other_port}'." + ok=${EXIT_ERROR} + fi + + if listmatch ${port} $(port_get_children ${other_port}); then + error_log "Cannot destroy port '${port}' which is child of port '${other_port}'." + ok=${EXIT_ERROR} + fi + done + + # If ok says we are not okay --> exit + if [ ${ok} -ne ${EXIT_OK} ]; then return ${EXIT_ERROR} fi @@ -136,6 +160,10 @@ function port_status() { port_cmd status $@ } +function port_info() { + port_cmd info $@ +} + function port_cmd() { local cmd=${1} local port=${2} @@ -194,3 +222,29 @@ function port_find_free() { i=$(( ${i} + 1 )) done } + +function port_get_info() { + local port=${1} + local key=${2} + + assert isset port + assert port_exists ${port} + assert isset key + + ( + eval $(port_info ${port}) + echo "${!key}" + ) +} + +function port_get_parents() { + local port=${1} + + port_get_info ${port} PORT_PARENTS +} + +function port_get_children() { + local port=${1} + + port_get_info ${port} PORT_CHILDREN +} diff --git a/header-port b/header-port index d06b2e11..95b39d0e 100644 --- a/header-port +++ b/header-port @@ -22,6 +22,7 @@ . /lib/network/functions HOOK=$(basename ${0}) +INFO_SETTINGS="HOOK PORT_PARENTS PORT_CHILDREN" while [ $# -gt 0 ]; do case "${1}" in @@ -39,7 +40,7 @@ done function run() { case "${action}" in - edit|add|create|rem|up|down|status) + edit|add|create|rem|up|down|status|info) _${action} $@ ;; esac @@ -47,3 +48,26 @@ function run() { error "Port hook '${HOOK}' didn't exit properly." exit ${EXIT_ERROR} } + +function _info() { + local port=${1} + shift + + assert isset port + + config_read $(port_file ${port}) + + local key + local val + for key in PORT_PARENTS PORT_CHILDREN; do + val="${key}_VAR" + val=${!val} + eval "${key}=\"${!val}\"" + done + + for key in ${INFO_SETTINGS}; do + echo "${key}=\"${!key}\"" + done + + exit ${ERROR_OK} +} diff --git a/hooks/ports/bonding b/hooks/ports/bonding index 9e044353..0a8535f6 100755 --- a/hooks/ports/bonding +++ b/hooks/ports/bonding @@ -23,6 +23,8 @@ HOOK_SETTINGS="HOOK DEVICE_MAC MIIMON MODE SLAVES" +PORT_CHILDREN_VAR="SLAVES" + DEVICE_MAC=$(mac_generate) MIIMON=100 diff --git a/hooks/ports/virtual b/hooks/ports/virtual index 10f0b80d..98786656 100755 --- a/hooks/ports/virtual +++ b/hooks/ports/virtual @@ -23,6 +23,8 @@ HOOK_SETTINGS="HOOK DEVICE DEVICE_MAC DEVICE_VID" +PORT_PARENTS_VAR="DEVICE" + DEVICE_MAC=$(mac_generate) function _check() {