123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #!/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_warning "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
|