Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 60 additions & 2 deletions flexqos.asp
Original file line number Diff line number Diff line change
Expand Up @@ -1185,6 +1185,7 @@ function get_data() {
success: function(response) {
redraw();
draw_conntrack_table();
check_bandwidth_flow();
timedEvent = setTimeout("get_data();", refreshRate * 1000);
}
});
Expand Down Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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
{
Expand Down Expand Up @@ -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 = "";
Expand Down Expand Up @@ -2741,7 +2794,7 @@ function DelCookie(cookiename){
<iframe name="hidden_frame" id="hidden_frame" width="0" height="0" frameborder="0"></iframe>
<form method="post" name="form" action="/start_apply.htm" target="hidden_frame">
<input type="hidden" name="preferred_lang" id="preferred_lang" value="<% nvram_get(" preferred_lang "); %>">
<input type="hidden" name="firmver" value="<% nvram_get(" firmver "); %>">
<input type="hidden" name="firmver" id="firmver" value="<% nvram_get(" firmver "); %>">
<input type="hidden" name="current_page" value="">
<input type="hidden" name="next_page" value="">
<input type="hidden" name="action_mode" value="apply">
Expand Down Expand Up @@ -2923,6 +2976,11 @@ function DelCookie(cookiename){
</table>
<br>
<div id="no_aqos_notice" style="display:none;font-size:125%;color:#FFCC00;">Note: Adaptive QoS is not enabled.</div>
<div id="noflow_notice"
style="display:none;font-size:125%;color:#FFCC00;">
No bandwidth flow detected.
<span id="noflow_msg"></span>
</div>
<table>
<tr id="dl_tr">
<td style="padding-right:10px;font-size:125%;color:#FFCC00;">
Expand Down
66 changes: 58 additions & 8 deletions flexqos.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand All @@ -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
Expand Down Expand Up @@ -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

Expand All @@ -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
Expand Down Expand Up @@ -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}"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
;;
Expand Down