131 lines
4.3 KiB
Bash
131 lines
4.3 KiB
Bash
#!/bin/sh
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 2 as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# Copyright (C) 2012-4 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
|
|
|
|
|
|
. /lib/functions.sh
|
|
|
|
. /etc/sqm/sqm.conf
|
|
. ${SQM_LIB_DIR}/functions.sh
|
|
|
|
ACTION="${1:-start}"
|
|
RUN_IFACE="$2"
|
|
LOCKDIR="${SQM_STATE_DIR}/sqm-run.lock"
|
|
|
|
check_state_dir
|
|
[ -d "${SQM_QDISC_STATE_DIR}" ] || ${SQM_LIB_DIR}/update-available-qdiscs
|
|
|
|
stop_statefile() {
|
|
local f
|
|
f="$1"
|
|
# Source the state file prior to stopping; we need the variables saved in
|
|
# there.
|
|
[ -f "$f" ] && ( . "$f";
|
|
IFACE=$IFACE SCRIPT=$SCRIPT SQM_DEBUG=$SQM_DEBUG \
|
|
SQM_DEBUG_LOG=$SQM_DEBUG_LOG \
|
|
SQM_VERBOSITY_MAX=$SQM_VERBOSITY_MAX \
|
|
SQM_VERBOSITY_MIN=$SQM_VERBOSITY_MIN \
|
|
OUTPUT_TARGET=$OUTPUT_TARGET ${SQM_LIB_DIR}/stop-sqm )
|
|
}
|
|
|
|
start_sqm_section() {
|
|
local section
|
|
section="$1"
|
|
export IFACE=$(config_get "$section" interface)
|
|
|
|
[ -z "$RUN_IFACE" -o "$RUN_IFACE" = "$IFACE" ] || return
|
|
[ "$(config_get "$section" enabled)" -eq 1 ] || return 0
|
|
[ -f "${SQM_STATE_DIR}/${IFACE}.state" ] && return
|
|
|
|
export UPLINK=$(config_get "$section" upload)
|
|
export DOWNLINK=$(config_get "$section" download)
|
|
export LLAM=$(config_get "$section" linklayer_adaptation_mechanism)
|
|
export LINKLAYER=$(config_get "$section" linklayer)
|
|
export OVERHEAD=$(config_get "$section" overhead)
|
|
export STAB_MTU=$(config_get "$section" tcMTU)
|
|
export STAB_TSIZE=$(config_get "$section" tcTSIZE)
|
|
export STAB_MPU=$(config_get "$section" tcMPU)
|
|
export ILIMIT=$(config_get "$section" ilimit)
|
|
export ELIMIT=$(config_get "$section" elimit)
|
|
export ITARGET=$(config_get "$section" itarget)
|
|
export ETARGET=$(config_get "$section" etarget)
|
|
export IECN=$(config_get "$section" ingress_ecn)
|
|
export EECN=$(config_get "$section" egress_ecn)
|
|
export IQDISC_OPTS=$(config_get "$section" iqdisc_opts)
|
|
export EQDISC_OPTS=$(config_get "$section" eqdisc_opts)
|
|
export TARGET=$(config_get "$section" target)
|
|
export QDISC=$(config_get "$section" qdisc)
|
|
export SCRIPT=$(config_get "$section" script)
|
|
|
|
# The UCI names for these two variables are confusing and should have been
|
|
# changed ages ago. For now, keep the bad UCI names but use meaningful
|
|
# variable names in the scripts to not break user configs.
|
|
export ZERO_DSCP_INGRESS=$(config_get "$section" squash_dscp)
|
|
export IGNORE_DSCP_INGRESS=$(config_get "$section" squash_ingress)
|
|
|
|
# If SQM_DEBUG or SQM_VERBOSITY_* were passed in via the command line make
|
|
# them available to the other scripts this allows to override sqm's log
|
|
# level as set in the GUI for quick debugging without GUI accesss.
|
|
export SQM_DEBUG=${SQM_DEBUG:-$(config_get "$section" debug_logging)}
|
|
export SQM_VERBOSITY_MAX=${SQM_VERBOSITY_MAX:-$(config_get "$section" verbosity)}
|
|
export SQM_VERBOSITY_MIN
|
|
|
|
"${SQM_LIB_DIR}/start-sqm"
|
|
}
|
|
|
|
release_lock() {
|
|
PID=$(cat "$LOCKDIR/pid")
|
|
if [ "$PID" -ne "$$" ]; then
|
|
sqm_error "Trying to release lock with wrong PID $PID != $$"
|
|
return 1
|
|
fi
|
|
|
|
rm -rf "$LOCKDIR"
|
|
return 0
|
|
}
|
|
|
|
take_lock() {
|
|
|
|
if mkdir "$LOCKDIR" 2>/dev/null; then
|
|
sqm_trace "Acquired run lock"
|
|
echo $$ > "$LOCKDIR/pid"
|
|
|
|
trap release_lock 0
|
|
return 0
|
|
fi
|
|
PID=$(cat "$LOCKDIR/pid")
|
|
sqm_warn "Unable to get run lock - already held by $PID"
|
|
return 1
|
|
}
|
|
|
|
MAX_TRIES=10
|
|
tries=$MAX_TRIES
|
|
while ! take_lock; do
|
|
sleep 1
|
|
tries=$((tries - 1))
|
|
if [ "$tries" -eq 0 ]; then
|
|
sqm_error "Giving up on getting lock after $MAX_TRIES attempts"
|
|
sqm_error "This is a bug; please report it at https://github.com/tohojo/sqm-scripts/issues"
|
|
sqm_error "Then, to re-enable sqm-scripts, manually remove $LOCKDIR"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
if [ "$ACTION" = "stop" ]; then
|
|
if [ -z "$RUN_IFACE" ]; then
|
|
# Stopping all active interfaces
|
|
for f in ${SQM_STATE_DIR}/*.state; do
|
|
stop_statefile "$f"
|
|
done
|
|
else
|
|
stop_statefile "${SQM_STATE_DIR}/${RUN_IFACE}.state"
|
|
fi
|
|
else
|
|
config_load sqm
|
|
config_foreach start_sqm_section
|
|
fi
|