#!/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 . # # # ############################################################################### INFO_SETTINGS="HOOK PORT_PARENTS PORT_CHILDREN" HOOK_PORT_PATTERN="${PORT_PATTERN}" # This function is called after a device has been plugged # into the system and got its correct name. # The function is intended to create child ports and things # like that. hook_hotplug() { # If the hook does not handle the hotplug event, it # must return EXIT_NOT_HANDLED. exit ${EXIT_NOT_HANDLED} } # This function gets called when a device is plugged in # to determine the right name. # The first argument is the port which should be tested # against the second argument which is the device that # has been plugged in. hook_hotplug_rename() { exit ${EXIT_FALSE} } hook_hotplug_rename_by_address() { local port="${1}" assert isset port local device="${2}" assert isset device # Read in the conifguration file. if ! port_settings_read "${port}"; then return ${EXIT_ERROR} fi # Get the current MAC address of the device. local address="$(device_get_address "${device}")" assert isset address # Check if the address matches with the configuration. if list_match "${address}" "${ADDRESS}" "${DEVICE}"; then log DEBUG "Device '${device}' is port '${port}'" return ${EXIT_OK} fi log DEBUG "Device '${device}' is not port '${port}'" return ${EXIT_ERROR} } # Returns the suggested name of the port hook_find_port_name() { assert isset HOOK_PORT_PATTERN port_find_free "${HOOK_PORT_PATTERN}" } hook_default_new() { local ${HOOK_SETTINGS[*]} # Import all default variables hook_set_defaults if ! hook_parse_cmdline "$@"; then return ${EXIT_ERROR} fi # Determine a name for this port local port="$(hook_find_port_name)" assert isset port # Save settings if ! port_settings_write "${port}" ${HOOK_SETTINGS[*]}; then return ${EXIT_ERROR} fi return ${EXIT_OK} } hook_new() { hook_default_new "$@" } hook_default_edit() { local port=${1} assert isset port shift # Read settings if ! port_settings_read "${port}" ${HOOK_SETTINGS[*]}; then error "Could not read settings for port ${port}" return ${EXIT_ERROR} fi # Parse command line arguments if ! hook_parse_cmdline "$@"; then return ${EXIT_ERROR} fi # Save settings if ! port_settings_write "${port}" ${HOOK_SETTINGS[*]}; then error "Could not write settings for port ${port}" return ${EXIT_ERROR} fi # Apply settings port_restart "${port}" return ${EXIT_OK} } hook_edit() { hook_default_edit "$@" } # Returns a list of all children of this port hook_children() { local port="${1}" if ! port_settings_read "${port}" ${HOOK_SETTINGS[*]}; then log ERROR "Could not read port settings: ${port}" return ${EXIT_OK} fi print "${SLAVES}" } hook_status() { local port="${1}" assert isset port cli_device_headline "${port}" --long exit ${EXIT_OK} } # Create any virtual devices, but don't bring them up # Must tolerate that the device may already exist hook_create() { cmd_not_implemented } # Must tolerate that the device may not exist hook_remove() { cmd_not_implemented } # Just bring up the device hook_default_up() { local port="${1}" assert isset port if ! device_exists "${port}"; then log ERROR "Port '${port}' does not exist and cannot be brought up" exit ${EXIT_ERROR} fi # Bring up the port device_set_up "${port}" # Bring up all slaves if the port has any local slave for slave in $(port_get_slaves "${port}"); do port_up "${slave}" done } # Depends on the port existing hook_up() { hook_default_up "$@" } hook_default_down() { local port="${1}" assert isset port if device_exists "${port}"; then device_set_down "${port}" fi # Bring down all slaves if the port has any local slave for slave in $(port_get_slaves "${port}"); do port_down "${slave}" done } hook_down() { hook_default_down "$@" }