forked from freifunk-franken/firmware
Fabian Bläse
ffd00a93a7
The SIGHUP signal is sent to a process if a hangup is detected on the controlling terminal. This might happen if the ssh session, from which the test mode was started, is disconnected. Because ssh session disconnects might happen due to network reconfiguration, aborting the test mode without restoring the old settings might make the device unreachable. Instead, disable the SIGHUP signal when test mode is activated, so the script is either killed by the user (after successful configuration) or the timer expires and the old settings are restored. Fixes: #141 Signed-off-by: Fabian Bläse <fabian@blaese.de> Reviewed-by: Christian Dresel <freifunk@dresel.systems> Reviewed-by: Johannes Kimmel <fff@bareminimum.eu>
119 lines
2.1 KiB
Bash
Executable File
119 lines
2.1 KiB
Bash
Executable File
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
# IMPORTANT!!
|
|
# DO NOT RUN THIS IN CRONJOB!
|
|
|
|
execute_subshell() {
|
|
if [ $# -ne 1 ]; then
|
|
echo "Usage:" "$0" "<function>"
|
|
fi
|
|
|
|
for script in /etc/layer3.d/*; do
|
|
(
|
|
# unset function to prevent executing parents shell function
|
|
unset -f "$1"
|
|
. "$script"
|
|
|
|
if type "$1" | grep -q "function" ; then
|
|
"$1"
|
|
fi
|
|
)
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo
|
|
echo "Error when executing" "$1" "from" "$(basename "$script")"
|
|
exit 1
|
|
fi
|
|
done
|
|
}
|
|
|
|
configure() {
|
|
echo "This script might remove existing vlans, interfaces, addresses, etc."
|
|
read -r -p "Do you really want to continue? (y/n) " response
|
|
if ! ( [ "$response" == "y" ] || [ "$response" == "Y" ] ); then
|
|
exit 1
|
|
fi
|
|
|
|
echo
|
|
execute_subshell configure
|
|
|
|
exit 0
|
|
}
|
|
|
|
reload_services() {
|
|
execute_subshell reload
|
|
reload_config
|
|
}
|
|
|
|
apply_changes() {
|
|
execute_subshell apply
|
|
reload_services
|
|
exit 0
|
|
}
|
|
|
|
revert_changes() {
|
|
execute_subshell revert
|
|
exit 0
|
|
}
|
|
|
|
keep_changes() {
|
|
if [ -f "/tmp/configure-layer3-pid" ]; then
|
|
echo "Keep changes"
|
|
kill -9 $(cat /tmp/configure-layer3-pid)
|
|
rm /tmp/configure-layer3-pid
|
|
# We need exit because trap in test_changes() will not stop
|
|
# the script here and revert settings otherwise
|
|
exit
|
|
else
|
|
echo "configure-layer3 -t is not running"
|
|
fi
|
|
}
|
|
|
|
test_changes() {
|
|
echo $$ > /tmp/configure-layer3-pid
|
|
trap keep_changes SIGINT SIGTERM
|
|
trap : SIGHUP
|
|
|
|
reload_services
|
|
|
|
sleep 5
|
|
|
|
echo "Configuration reloaded. Changes will be reverted in 200s."
|
|
echo "Kill this script or use configure-layer3 -k to keep changes."
|
|
|
|
sleep 200
|
|
|
|
echo "Reverting changes.."
|
|
# on revert we must delete the pid-file
|
|
rm /tmp/configure-layer3-pid
|
|
revert_changes
|
|
reload_services
|
|
}
|
|
|
|
|
|
usage() {
|
|
echo "Usage: $0 [OPTION]"
|
|
echo
|
|
echo "Options:"
|
|
echo " -c: configure. No commit, no restart!"
|
|
echo " -t: test changes. Restarts services, waits up to 200s for SIGINT"
|
|
echo " -k: keep changes from test mode"
|
|
echo " -a: apply changes"
|
|
echo " -r: revert changes"
|
|
}
|
|
|
|
|
|
if [ $# != 1 ]; then
|
|
usage; exit 1
|
|
fi
|
|
|
|
case "$1" in
|
|
-c) configure ;;
|
|
-t) test_changes ;;
|
|
-k) keep_changes ;;
|
|
-a) apply_changes ;;
|
|
-r) revert_changes ;;
|
|
*) usage; exit 1 ;;
|
|
esac
|