#!/bin/bash ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2010 Michael Tremer & Christian Schmidt # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # # # ############################################################################### function port_dir() { echo "${CONFIG_DIR}/ports" } function port_file() { local port=${1} assert isset port echo "$(port_dir)/${port}" } function port_exists() { local port=${1} [ -f "${CONFIG_DIR}/ports/${port}" ] } function port_get_hook() { local port=${1} assert isset port config_get_hook $(port_file ${port}) } function port_is_attached() { local port=${1} shift assert isset port local zone for zone in $(zones_get_all); do assert isset zone assert zone_exists ${zone} if listmatch ${port} $(zone_get_ports ${zone}); then echo "${zone}" return ${EXIT_OK} fi done return ${EXIT_ERROR} } function port_create() { #local port=${1} #shift # #if port_exists ${port}; then # error "Port '${port}' does already exist." # return ${EXIT_ERROR} #fi local hook=${1} shift if ! hook_exists port ${hook}; then error "Port hook '${hook}' does not exist." return ${EXIT_ERROR} fi #port_edit ${port} ${hook} $@ # #if [ $? -ne ${EXIT_OK} ]; then # port_destroy ${port} #fi hook_exec port ${hook} create $@ } function port_destroy() { local port=${1} assert isset port port_exists ${port} || return ${EXIT_OK} # 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_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 port_down ${port} rm -f $(port_file ${port}) } function port_remove() { port_destroy $@ } function port_edit() { port_cmd edit $@ } # XXX? Compatibility function function port_show() { port_status $@ } function port_up() { port_cmd up $@ } function port_down() { port_cmd down $@ } function port_status() { port_cmd status $@ } function port_info() { port_cmd info $@ } function port_cmd() { local cmd=${1} local port=${2} shift 2 assert isset cmd assert isset port local hook=$(port_get_hook ${port}) assert isset hook hook_exec port ${hook} ${cmd} ${port} $@ } function ports_get() { local port for port in $(port_dir)/*; do port=$(basename ${port}) if port_exists ${port}; then echo "${port}" fi done } # This function automatically creates the real ethernet devices # that do not exists in the configuration. # Saves some work for the administrator. function ports_init() { local device for device in $(devices_get_all); do if device_is_real ${device}; then if ! port_exists ${device}; then port_create ethernet ${device} fi fi done } init_register ports_init function port_find_free() { local pattern=${1} assert isset pattern local port local i=0 while [ ${i} -lt 99 ]; do port=${pattern//N/${i}} if ! port_exists ${port} && ! device_exists ${port}; then echo "${port}" break fi 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 }