#!/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 . #
# #
###############################################################################
hook_info() {
echo "HOOK=\"${HOOK}\""
}
hook_hotplug() {
# If the hook does not handle the hotplug event, it
# must return EXIT_NOT_HANDLED.
exit ${EXIT_NOT_HANDLED}
}
hook_new() {
local zone="${1}"
assert isset zone
shift
if ! hook_parse_cmdline "$@"; then
return ${EXIT_ERROR}
fi
if ! zone_settings_write "${zone}"; then
log ERROR "Could not write settings for zone ${zone}"
return ${EXIT_ERROR}
fi
exit ${EXIT_OK}
}
hook_edit() {
local zone="${1}"
assert isset zone
shift
if ! zone_settings_read "${zone}"; then
log ERROR "Could not read settings for zone ${zone}"
return ${EXIT_ERROR}
fi
if ! hook_parse_cmdline "$@"; then
return ${EXIT_ERROR}
fi
if ! zone_settings_write "${zone}"; then
log ERROR "Could not write settings for zone ${zone}"
return ${EXIT_ERROR}
fi
exit ${EXIT_OK}
}
hook_remove() {
cmd_not_implemented
}
hook_status() {
local zone="${1}"
assert isset zone
if device_is_up ${zone}; then
exit ${STATUS_UP}
fi
exit ${STATUS_DOWN}
}
hook_up() {
cmd_not_implemented
}
hook_down() {
cmd_not_implemented
}
hook_discover() {
# This hook does not support a discovery
exit ${DISCOVER_NOT_SUPPORTED}
}
# Do nothing
hook_parse_cmdline() {
return ${EXIT_OK}
}
hook_port() {
local zone="${1}"
assert isset zone
local action="${2}"
shift 2
local ret
case "${action}" in
add|create|edit|rem|show)
hook_port_${action} "${zone}" "$@"
ret=$?
;;
*)
error "Unrecognized argument: '${action}'"
exit ${EXIT_ERROR}
;;
esac
exit ${ret}
}
hook_port_attach() {
return ${EXIT_NOT_SUPPORTED}
}
hook_port_detach() {
return ${EXIT_NOT_SUPPORTED}
}
hook_port_edit() {
return ${EXIT_NOT_SUPPORTED}
}
hook_port_status() {
return ${EXIT_NOT_SUPPORTED}
}
hook_default_port_create() {
assert [ $# -ge 2 ]
local zone="${1}"
local port="${2}"
port_create "${port}"
}
hook_port_create() {
hook_default_port_create "$@"
}
hook_default_port_remove() {
assert [ $# -ge 2 ]
local zone="${1}"
local port="${2}"
port_remove "${port}"
}
hook_port_remove() {
hook_default_port_remove "$@"
}
hook_port_up() {
cmd_not_implemented
}
hook_port_down() {
cmd_not_implemented
}
hook_config() {
local zone="${1}"
assert isset zone
local action="${2}"
assert isset action
shift 2
local ret
case "${action}" in
new|destroy|edit|show)
hook_config_${action} "${zone}" "$@"
exit $?
;;
*)
error "Unrecognized argument: '${action}'"
exit ${EXIT_ERROR}
;;
esac
}
hook_config_cmd() {
local cmd="${1}"
assert isset cmd
local zone="${2}"
assert isset zone
local hook_config="${3}"
assert isset hook_config
shift 3
local hook_zone="$(zone_get_hook "${zone}")"
if ! hook_zone_exists "${hook_zone}"; then
log ERROR "Hook '${hook}' does not exist."
exit ${EXIT_ERROR}
fi
#if ! hook_config_exists "${hook_zone}" "${hook_config}"; then
# log ERROR "Hook '${hook_config}' is not supported for zone '${zone}'."
# exit ${EXIT_ERROR}
#fi
hook_config_exec "${hook_config}" "${cmd}" "${zone}" "$@"
}
hook_config_new() {
assert [ $# -ge 2 ]
hook_config_cmd "new" "$@"
}
hook_config_destroy() {
assert [ $# -eq 2 ]
local zone=${1}
# The id must be the id and not the hid.
local id=${2}
shift 2
# Check if we get a valid id
if ! zone_config_id_is_valid ${zone} ${id}; then
log ERROR "ID: ${id} is not a valid id for zone ${zone}"
fi
local hook=$(zone_config_get_hook_from_id ${zone} ${id})
assert isset hook
# First we bring the hook down
hook_config_cmd "down" "${zone}" "${hook}" "${hook}.${id}"
# If a hook_destroy function is implemented in the hook this function will be executed.
# If not a empty defined in header-config is executed.
if ! hook_config_cmd "destroy" "${zone}" "${hook}" "${hook}.${id}" "$@"; then
# A better error message should printed inside the hook.
# We will not bring the config up because we do not know if it is safe or if some parts are already destroyed.
log ERROR "Could not destroy config with the follwoing id: ${id}"
return ${EXIT_ERROR}
fi
# Now we delete the config of the zone
zone_config_settings_destroy "${zone}" "${hook}.${id}"
}
hook_config_edit() {
assert [ $# -ge 2 ]
local zone=${1}
# The id must be the id and not the hid.
local id=${2}
shift 2
# Check if we get a valid id
if ! zone_config_id_is_valid ${zone} ${id}; then
log ERROR "ID: ${id} is not a valid id for zone ${zone}"
fi
local hook=$(zone_config_get_hook_from_id ${zone} ${id})
assert isset hook
hook_config_cmd "edit" "${zone}" "${hook}" "${hook}.${id}" "$@"
}
hook_config_show() {
cmd_not_implemented
}
hook_ppp_write_config() {
cmd_not_implemented
# Arguments:
}
hook_ppp_ip_pre_up() {
local zone="${1}"
assert isset zone
shift
if ! zone_exists "${zone}"; then
log ERROR "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ip_pre_up "${zone}" "$@"
exit $?
}
hook_ppp_ipv4_up() {
local zone="${1}"
assert isset zone
shift
if ! zone_exists "${zone}"; then
log ERROR "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ipv4_up "${zone}" "$@"
exit $?
}
hook_ppp_ipv4_down() {
local zone="${1}"
assert isset zone
shift
if ! zone_exists "${zone}"; then
log ERROR "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ipv4_down "${zone}" "$@"
exit $?
}
hook_ppp_ipv6_up() {
local zone="${1}"
assert isset zone
shift
if ! zone_exists "${zone}"; then
error "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ipv6_up "${zone}" "$@"
exit $?
}
hook_ppp_ipv6_down() {
local zone="${1}"
assert isset zone
shift
if ! zone_exists "${zone}"; then
error "Zone '${zone}' does not exist."
exit ${EXIT_ERROR}
fi
ppp_common_ipv6_down "${zone}" "$@"
exit $?
}