Project: IPFire
Code Location: git://git.ipfire.org/network.gitmaster
Browse
/
Download File
functions.ports
#!/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 <http://www.gnu.org/licenses/>.       #
#                                                                             #
###############################################################################

function port_dir() {
	echo "${NETWORK_CONFIG_DIR}/ports"
}

function port_get_hook() {
	local port=${1}
	assert isset port

	config_get_hook $(port_file ${port})
}

function port_config_dir() {
	local port=${1}

	print "${RUN_DIR}/ports/${port}"
	return ${EXIT_OK}
}

function port_config_read() {
	local port=${1}
	assert isset port

	# Save the HOOK variable.
	local hook="${HOOK}"

	config_read $(port_file ${port})

	# Restore hook.
	HOOK="${hook}"
}

function port_config_write() {
	local port=${1}
	assert isset port

	config_write $(port_file ${port})
}

function ports_get_all() {
	local port

	for port in $(port_dir)/*; do
		[ -f "${port}" ] || continue

		basename ${port}
	done
}

function port_file() {
	local port=${1}
	assert isset port

	echo "$(port_dir)/${port}"
}

function port_exists() {
	local port=${1}

	[ -f "${NETWORK_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
}

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}"
			return ${EXIT_OK}
		fi
		i=$(( ${i} + 1 ))
	done

	return ${EXIT_ERROR}
}

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
}

function port_zone() {
	# Get name of the zones, this port is configured in.
	local port=${1}
	shift

	assert isset port

	local zone
	for zone in $(zones_get_all); do
		if zone_has_port ${zone} ${port}; then
			echo "${zone}"
			return ${EXIT_OK}
		fi
	done

	return ${EXIT_OK}
}