#!/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 . #
# #
###############################################################################
#
# Notes:
# - All functions in this scope must start with an underline (_) to not
# conflict with any functions that were defined somewhere else.
#
# _notimplemented
# Returns a soft error if a function was not implemented, yet.
#
function _notimplemented() {
warning "'$@' was not implemented."
exit ${EXIT_CONF_ERROR}
}
function _info() {
echo "HOOK=\"${HOOK}\""
}
function _create() {
local zone=${1}
shift
config_read $(zone_dir ${zone})/settings
_parse_cmdline $@
config_write $(zone_dir ${zone})/settings ${HOOK_SETTINGS}
exit ${EXIT_OK}
}
function _edit() {
_create $@
}
function _rem() {
_notimplemented _rem
}
function _status() {
local zone=${1}
if device_is_up ${zone}; then
exit ${STATUS_UP}
fi
exit ${STATUS_DOWN}
}
function _up() {
_notimplemented _up
}
function _down() {
_notimplemented _down
}
function _discover() {
# This hook does not support a discovery
exit ${DISCOVER_NOT_SUPPORTED}
}
# The default help function.
function _help() {
# If no man page has been configured, we print an error message.
if [ -z "${HOOK_MANPAGE}" ]; then
error "There is no help available for hook '${HOOK}'. Exiting."
exit ${EXIT_ERROR}
fi
cli_show_man ${HOOK_MANPAGE}
}
# Do nothing
function _parse_cmdline() {
return ${EXIT_OK}
}
function _port() {
local zone=${1}
local action=${2}
shift 2
local ret
case "${action}" in
add|create|edit|rem|show)
_port_${action} ${zone} $@
ret=$?
;;
*)
error "Unrecognized argument: '${action}'"
exit ${EXIT_ERROR}
;;
esac
exit ${ret}
}
function _port_add() {
_port_cmd add $@
}
function _port_edit() {
_port_cmd edit $@
}
function _port_rem() {
_port_cmd rem $@
}
function _port_show() {
_notimplemented _port_show
}
function _port_status() {
_port_cmd status $@
}
function _port_cmd() {
local cmd=${1}
local zone=${2}
local port=${3}
shift 3
assert isset cmd
assert isset zone
assert isset port
local hook_zone=$(zone_get_hook ${zone})
local hook_port=$(port_get_hook ${port})
assert isset hook_zone
assert isset hook_port
if ! listmatch ${hook_port} $(zone_get_supported_port_hooks ${zone}); then
error_log "Zone '${zone}' does not support port of type '${hook_port}'."
exit ${EXIT_ERROR}
fi
hook_zone_port_exec ${hook_zone} ${hook_port} ${cmd} ${zone} ${port} $@
exit $?
}
function _port_up() {
_port_cmd up $@
}
function _port_down() {
_port_cmd down $@
}
function _config() {
local zone=${1}
local action=${2}
shift 2
local ret
case "${action}" in
create|edit|rem|show)
_config_${action} ${zone} $@
ret=$?
;;
*)
error "Unrecognized argument: '${action}'"
exit ${EXIT_ERROR}
;;
esac
exit ${ret}
}
# This function is not a public one
function __configcmd() {
local cmd=${1}
local zone=${2}
local hook_config=${3}
shift 3
local hook_zone=$(zone_get_hook ${zone})
if ! hook_zone_exists ${hook_zone}; then
error "Hook '${hook}' does not exist."
exit ${EXIT_ERROR}
fi
if ! hook_config_exists ${hook_zone} ${hook_config}; then
error "Hook '${hook_config}' is not supported for zone '${zone}'."
exit ${EXIT_ERROR}
fi
hook_zone_config_exec ${hook_zone} ${hook_config} ${cmd} ${zone} $@
}
function _config_create() {
local zone=${1}
local hook_config=${2}
shift 2
assert isset zone
assert isset hook_config
assert zone_exists ${zone}
if ! listmatch ${hook_config} $(zone_get_supported_config_hooks ${zone}); then
error_log "Zone '${zone}' does not support configuration of type '${hook_config}'."
exit ${EXIT_ERROR}
fi
local hook_zone=$(zone_get_hook ${zone})
assert isset hook_zone
hook_zone_config_exec ${hook_zone} ${hook_config} create ${zone} $@
exit $?
}
function _config_edit() {
__configcmd edit $@
}
function _config_rem() {
_notimplemented _config_rem
}
function _config_show() {
_notimplemented _config_show
}
function _ppp-write-config() {
_notimplemented _ppp_write_config
# Arguments:
}
function _ppp-ip-pre-up() {
local zone=${1}
shift
if ! zone_exists ${zone}; then
error "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ip_pre_up ${zone} $@
exit $?
}
function _ppp-ip-up() {
local zone=${1}
shift
if ! zone_exists ${zone}; then
error "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ip_up ${zone} $@
exit $?
}
function _ppp-ip-down() {
local zone=${1}
shift
if ! zone_exists ${zone}; then
error "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ip_down ${zone} $@
exit $?
}
function _ppp-ipv6-up() {
local zone=${1}
shift
if ! zone_exists ${zone}; then
error "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ipv6_up ${zone} $@
exit $?
}
function _ppp-ipv6-down() {
local zone=${1}
shift
if ! zone_exists ${zone}; then
error "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ipv6_down ${zone} $@
exit $?
}