2023-04-01 10:00:13 +08:00

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