diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml deleted file mode 100644 index 4e951ea..0000000 --- a/.github/workflows/shellcheck.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: ShellCheck - -on: push - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - shellcheck: - name: Shellcheck - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Run ShellCheck - uses: ludeeus/action-shellcheck@master diff --git a/flexqos.asp b/flexqos.asp index 7d4998d..cf0d84e 100644 --- a/flexqos.asp +++ b/flexqos.asp @@ -1185,6 +1185,7 @@ function get_data() { success: function(response) { redraw(); draw_conntrack_table(); + check_bandwidth_flow(); timedEvent = setTimeout("get_data();", refreshRate * 1000); } }); @@ -1297,6 +1298,56 @@ function initialize_charts() { line_obj_ul=line_obj; // actually draws the chart on the page } // initialize_charts +function getFwBase () { + /* "3.0.0.6" → 3006 */ + const ver = document.getElementById('firmver')?.value || ''; + return parseInt(ver.replace(/\./g, ''), 10); // NaN if blank +} + +window.addEventListener('DOMContentLoaded', () => { + const fwBase = getFwBase(); + + const noflowMsg = (fwBase === 3006) + ? 'Adaptive QoS is not functioning correctly on ' + + 'BE-series routers due to a known ASUS / Trend Micro issue. ' + + 'Once ASUS resolves this, FlexQoS should work as expected.' + : 'Adaptive QoS appears to be malfunctioning. ' + + 'FlexQoS cannot apply its rules while the underlying QoS system is malfunctioning.'; + + const span = document.getElementById('noflow_msg'); + if (span) span.innerHTML = noflowMsg; +}); + +/* consider anything below this many *kilobits* per second “idle” */ +const NOFLOW_CUTOFF_KBPS = 1; // feel free to raise/lower +const NOFLOW_THRESHOLD = 5; // 5 × 3s refresh about 15 seconds + +let noFlowCounter = 0; + +function kbpsFromRateString(str) { + if (!str) return 0; + if (str.includes("Mbit")) return parseFloat(str) * 1000; + if (str.includes("Kbit")) return parseFloat(str); + return parseFloat(str) / 1000; +} + +function check_bandwidth_flow () { + let dlRate = 0, ulRate = 0; + + for (const e of tcdata_lan_array) dlRate += kbpsFromRateString(e[2]); + for (const e of tcdata_wan_array) ulRate += kbpsFromRateString(e[2]); + + if (dlRate < NOFLOW_CUTOFF_KBPS && ulRate < NOFLOW_CUTOFF_KBPS) { + noFlowCounter++; + } else { + noFlowCounter = 0; + } + + const warn = document.getElementById('noflow_notice'); + warn.style.display = (noFlowCounter >= NOFLOW_THRESHOLD) ? 'block' + : 'none'; +} + function change_chart_scale(input) { var chart_scale = cookie.get('flexqos_rate_graph_scale'); if ( input == null ) { @@ -2024,6 +2075,8 @@ function set_FlexQoS_mod_vars() { if ( custom_settings.flexqos_ver != undefined ) document.getElementById("flexqos_version").innerText = "v" + custom_settings.flexqos_ver; + if ( custom_settings.flexqos_branch != undefined ) + document.getElementById("flexqos_version").innerText += " Dev"; if ( custom_settings.flexqos_iptables == undefined ) // rules not yet converted to API format { @@ -2503,7 +2556,7 @@ function update_status(){ document.getElementById("versionStatus").style.display = ""; } else { - /* version update available */ + /* version update or hotfix available */ /* toggle update button */ document.getElementById("versionStatus").innerText = " " + verUpdateStatus + " available!"; document.getElementById("versionStatus").style.display = ""; @@ -2741,7 +2794,7 @@ function DelCookie(cookiename){
"> -"> +"> @@ -2923,6 +2976,11 @@ function DelCookie(cookiename){
+
diff --git a/flexqos.sh b/flexqos.sh index 7dadc59..d1b77a0 100644 --- a/flexqos.sh +++ b/flexqos.sh @@ -12,8 +12,8 @@ # Contributors: @maghuro # shellcheck disable=SC1090,SC1091,SC2039,SC2154,SC3043 # amtm NoMD5check -version=1.4.6 -release=2025-05-18 +version=1.4.7 +release=2025-06-05 # Forked from FreshJR_QOS v8.8, written by FreshJR07 https://github.com/FreshJR07/FreshJR_QOS # License # FlexQoS is free to use under the GNU General Public License, version 3 (GPL-3.0). @@ -31,12 +31,23 @@ fi # Global variables readonly SCRIPTNAME_DISPLAY="FlexQoS" readonly SCRIPTNAME="flexqos" -readonly GIT_URL="https://raw.githubusercontent.com/AMTM-OSR/${SCRIPTNAME_DISPLAY}/master" +readonly GIT_REPO="https://raw.githubusercontent.com/AMTM-OSR/${SCRIPTNAME_DISPLAY}" +GIT_BRANCH="$(am_settings_get "${SCRIPTNAME}_branch")" +if [ -z "${GIT_BRANCH}" ]; then + GIT_BRANCH="master" +fi +GIT_URL="${GIT_REPO}/${GIT_BRANCH}" readonly ADDON_DIR="/jffs/addons/${SCRIPTNAME}" readonly WEBUIPATH="${ADDON_DIR}/${SCRIPTNAME}.asp" readonly SCRIPTPATH="${ADDON_DIR}/${SCRIPTNAME}.sh" readonly LOCKFILE="/tmp/addonwebui.lock" +# shellcheck disable=SC2155 +readonly fwInstalledBaseVers="$(nvram get firmver | sed 's/\.//g')" +# shellcheck disable=SC2155 +readonly fwInstalledBuildVers="$(nvram get buildno)" +# shellcheck disable=SC2155 +readonly fwInstalledExtendNum="$(nvram get extendno)" IPv6_enabled="$(nvram get ipv6_service)" # Update version number in custom_settings.txt for reading in WebUI @@ -551,6 +562,9 @@ scriptinfo() { [ "${mode}" = "interactive" ] || return printf "\n" Green "${SCRIPTNAME_DISPLAY} v${version} released ${release}" + if [ "${GIT_BRANCH}" != "master" ]; then + Yellow " Development channel" + fi printf "\n" } # scriptinfo @@ -561,7 +575,7 @@ debug() { scriptinfo printf "Debug date : %s\n" "$(date +'%Y-%m-%d %H:%M:%S%z')" printf "Router Model : %s\n" "${RMODEL}" - printf "Firmware Ver : %s_%s\n" "$(nvram get buildno)" "$(nvram get extendno)" + printf "Firmware Ver : %s_%s\n" "$fwInstalledBuildVers" "$fwInstalledExtendNum" printf "DPI/Sig Ver : %s / %s\n" "$(nvram get bwdpi_dpi_ver)" "$(nvram get bwdpi_sig_ver)" get_config set_tc_variables @@ -1067,6 +1081,10 @@ update() { return 0 fi fi + if ! Firmware_Check; then + PressEnter + exit 5 + fi printf "Installing: %s...\n\n" "${SCRIPTNAME_DISPLAY}" download_file "$(basename "${SCRIPTPATH}")" "${SCRIPTPATH}" exec sh "${SCRIPTPATH}" -install "${1}" @@ -1104,6 +1122,20 @@ menu() { clear sed -n '2,10p' "${0}" # display banner scriptinfo + if [ -f "/tmp/${SCRIPTNAME}_qos_failed" ]; then + if [ "$fwInstalledBaseVers" -eq 3006 ] + then + Yellow "Adaptive QoS is not functioning correctly on BE series routers" + Yellow "due to a known Asus/Trend Micro issue. Once Asus resolves this," + Yellow "FlexQoS should work as expected." + printf "\n" + else + Yellow "Adaptive QoS appears to be malfunctioning." + Yellow "FlexQoS cannot apply its rules while the underlying QoS issue persists." + Yellow "Please investigate your router’s QoS settings before relying on FlexQoS." + printf "\n" + fi + fi printf " (1) about explain functionality\n" printf " (2) update check for updates\n" printf " (3) debug traffic control parameters\n" @@ -1472,10 +1504,6 @@ EOF if [ -z "${fccontrol}" ]; then fccontrol="0" # default to Off from GUI fi - # Delete obsolete setting - if [ -n "$(am_settings_get "${SCRIPTNAME}"_branch)" ]; then - sed -i "/^${SCRIPTNAME}_branch /d" /jffs/addons/custom_settings.txt - fi } # get_config validate_iptables_rules() { @@ -1709,11 +1737,13 @@ startup() { logmsg "TC Modification Delay reached maximum 180 seconds again. Canceling startup!" rm "/tmp/${SCRIPTNAME}_restartonce" 2>/dev/null fi + touch "/tmp/${SCRIPTNAME}_qos_failed" return 1 else sleepdelay=$((sleepdelay+10)) fi done + rm -f "/tmp/${SCRIPTNAME}_qos_failed" [ "${sleepdelay}" -gt "0" ] && logmsg "TC Modification delayed for ${sleepdelay} seconds" rm "/tmp/${SCRIPTNAME}_restartonce" 2>/dev/null @@ -1759,6 +1789,8 @@ Available commands: ${SCRIPTNAME} -disable disable script but do not delete from disk ${SCRIPTNAME} -backup backup user settings ${SCRIPTNAME} -debug print debug info + ${SCRIPTNAME} -develop switch to development channel + ${SCRIPTNAME} -stable switch to stable channel ${SCRIPTNAME} -menu interactive main menu EOF @@ -1901,6 +1933,24 @@ case "${arg1}" in update*) # updatecheck, updatesilent, or plain update update "${arg1#update}" # strip 'update' from arg1 to pass to update function ;; + 'develop') + if [ "$(am_settings_get "${SCRIPTNAME}_branch")" = "develop" ]; then + printf "Already set to development branch.\n" + else + am_settings_set "${SCRIPTNAME}_branch" "develop" + printf "Set to development branch. Triggering update...\n" + exec "${0}" updatesilent + fi + ;; + 'stable') + if [ -z "$(am_settings_get "${SCRIPTNAME}_branch")" ]; then + printf "Already set to stable branch.\n" + else + sed -i "/^${SCRIPTNAME}_branch /d" /jffs/addons/custom_settings.txt + printf "Set to stable branch. Triggering update...\n" + exec "${0}" updatesilent + fi + ;; 'menu'|'') menu ;;