diff --git a/.github/workflows/Create-NewReleases.yml b/.github/workflows/Create-NewReleases.yml index 0dea05d..4e8842a 100644 --- a/.github/workflows/Create-NewReleases.yml +++ b/.github/workflows/Create-NewReleases.yml @@ -19,7 +19,7 @@ jobs: steps: # 1--- Check out master so we tag the exact merge commit - name: Checkout source code - uses: actions/checkout@v5.0.0 + uses: actions/checkout@v6.0.2 with: fetch-depth: 0 ref: 'master' @@ -97,7 +97,7 @@ jobs: # 7--- Publish a GitHub Release with auto-generated notes - name: Create Release with Automated Release Notes - uses: softprops/action-gh-release@v2.4.2 + uses: softprops/action-gh-release@v2.6.1 with: token: ${{ secrets.GITHUB_TOKEN }} tag_name: ${{ steps.nextver.outputs.tag }} diff --git a/README.md b/README.md index 0c31722..6e68b1d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # YazFi - enhanced AsusWRT-Merlin Guest WiFi Networks -## v4.4.9 -### Updated on 2025-Nov-08 +## v4.4.10 +### Updated on 2026-Mar-21 ## About Feature expansion of guest WiFi networks on AsusWRT-Merlin, including, but not limited to: diff --git a/YazFi.sh b/YazFi.sh index 9f4c337..23bea7c 100644 --- a/YazFi.sh +++ b/YazFi.sh @@ -17,7 +17,7 @@ ## Guest Network DHCP script and for ## ## AsusWRT-Merlin firmware ## ################################################### -# Last Modified: 2025-Nov-04 +# Last Modified: 2026-Mar-21 #-------------------------------------------------- ###### Shellcheck directives ###### @@ -41,10 +41,10 @@ ### Start of script variables ### readonly SCRIPT_NAME="YazFi" readonly SCRIPT_CONF="/jffs/addons/$SCRIPT_NAME.d/config" -readonly YAZFI_VERSION="v4.4.9" -readonly SCRIPT_VERSION="v4.4.9" -readonly SCRIPT_VERSTAG="25110423" -SCRIPT_BRANCH="master" +readonly YAZFI_VERSION="v4.4.10" +readonly SCRIPT_VERSION="v4.4.10" +readonly SCRIPT_VERSTAG="26032100" +SCRIPT_BRANCH="develop" SCRIPT_REPO="https://raw.githubusercontent.com/AMTM-OSR/$SCRIPT_NAME/$SCRIPT_BRANCH" readonly SCRIPT_DIR="/jffs/addons/$SCRIPT_NAME.d" readonly USER_SCRIPT_DIR="$SCRIPT_DIR/userscripts.d" @@ -94,6 +94,9 @@ readonly branchxStr_TAG="[Branch: $SCRIPT_BRANCH]" readonly versionDev_TAG="${SCRIPT_VERSION}_${SCRIPT_VERSTAG}" readonly versionMod_TAG="$SCRIPT_VERSION on $ROUTER_MODEL" +# To support automatic script updates from AMTM # +doScriptUpdateFromAMTM=true + ##-------------------------------------## ## Added by Martinski W. [2025-Mar-16] ## ##-------------------------------------## @@ -399,35 +402,44 @@ Iface_Manage(){ Iface_BounceClients() { local callSleep=false - Print_Output true "Forcing $SCRIPT_NAME Guest WiFi clients to reauthenticate" "$PASS" - Print_Output false "Please wait..." "$PASS" + if [ -n "$IFACELIST" ] + then + Print_Output true "Forcing $SCRIPT_NAME Guest WiFi clients to reauthenticate" "$PASS" + Print_Output false "Please wait..." "$PASS" + fi - for IFACE in $IFACELIST; do + for IFACE in $IFACELIST + do callSleep=true wl -i "$IFACE" radio off >/dev/null 2>&1 done "$callSleep" && sleep 10 - for IFACE in $IFACELIST; do + for IFACE in $IFACELIST + do callSleep=true wl -i "$IFACE" radio on >/dev/null 2>&1 done "$callSleep" && sleep 2 ARP_CACHE="/proc/net/arp" - for IFACE in $IFACELIST; do + for IFACE in $IFACELIST + do if [ "$(eval echo '$'"$(Get_Iface_Var "$IFACE")_ENABLED")" = "true" ] then IFACE_MACS="$(wl -i "$IFACE" assoclist)" - if [ "$IFACE_MACS" != "" ]; then + if [ "$IFACE_MACS" != "" ] + then IFS=$'\n' - for GUEST_MAC in $IFACE_MACS; do + for GUEST_MAC in $IFACE_MACS + do GUEST_MACADDR="${GUEST_MAC#* }" GUEST_ARPCOUNT="$(grep -ic "$GUEST_MACADDR" "$ARP_CACHE")" [ "$GUEST_ARPCOUNT" -eq 0 ] && continue GUEST_ARPINFO="$(grep -i "$GUEST_MACADDR" "$ARP_CACHE")" - for ARP_ENTRY in $GUEST_ARPINFO; do + for ARP_ENTRY in $GUEST_ARPINFO + do GUEST_IPADDR="$(echo "$ARP_ENTRY" | awk -F ' ' '{print $1}')" arp -d "$GUEST_IPADDR" done @@ -445,10 +457,12 @@ Iface_BounceClients() fi } -Auto_DNSMASQ(){ +Auto_DNSMASQ() +{ case $1 in create) - if [ -f /jffs/scripts/dnsmasq.postconf ]; then + if [ -f /jffs/scripts/dnsmasq.postconf ] + then STARTUPLINECOUNT=$(grep -c "# $SCRIPT_NAME" /jffs/scripts/dnsmasq.postconf) STARTUPLINECOUNTEX=$(grep -cx "cat $DNSCONF >> /etc/dnsmasq.conf # $SCRIPT_NAME" /jffs/scripts/dnsmasq.postconf) @@ -884,9 +898,11 @@ Update_Version() localver="$(echo "$updatecheckresult" | cut -f2 -d',')" serverver="$(echo "$updatecheckresult" | cut -f3 -d',')" - if [ "$isupdate" = "version" ]; then + if [ "$isupdate" = "version" ] + then Print_Output true "New version of $SCRIPT_NAME available - $serverver" "$PASS" - elif [ "$isupdate" = "md5" ]; then + elif [ "$isupdate" = "md5" ] + then Print_Output true "MD5 hash of $SCRIPT_NAME does not match - hotfix available - $serverver" "$PASS" fi @@ -973,6 +989,23 @@ Update_Version() fi } +##-------------------------------------## +## Added by Martinski W. [2026-Feb-18] ## +##-------------------------------------## +ScriptUpdateFromAMTM() +{ + if ! "$doScriptUpdateFromAMTM" + then + printf "Automatic script updates via AMTM are currently disabled.\n\n" + return 1 + fi + if [ $# -gt 0 ] && [ "$1" = "check" ] + then return 0 + fi + Update_Version force unattended + return "$?" +} + ##----------------------------------------## ## Modified by Martinski W. [2025-Mar-16] ## ##----------------------------------------## @@ -1443,7 +1476,7 @@ Conf_FixBlanks() ##----------------------------------------## Conf_Validate() { - GUESTNET_ENABLED="false" + GUESTNET_ENABLED=false Conf_FixBlanks @@ -1452,44 +1485,44 @@ Conf_Validate() IFACETMP="$(Get_Iface_Var "$IFACE")" IPADDRTMP="" REDIRECTTMP="" - IFACE_PASS="true" + IFACE_PASS=true IFACE_ENABLED="" if [ -z "$(eval echo '$'"${IFACETMP}_ENABLED")" ] then - IFACE_ENABLED="false" + IFACE_ENABLED=false sed -i -e "s/${IFACETMP}_ENABLED=/${IFACETMP}_ENABLED=false/" "$SCRIPT_CONF" Print_Output false "${IFACETMP}_ENABLED is blank, setting to false" "$WARN" elif ! Validate_TrueFalse "${IFACETMP}_ENABLED" "$(eval echo '$'"${IFACETMP}_ENABLED")" then - IFACE_ENABLED="false" - IFACE_PASS="false" + IFACE_ENABLED=false + IFACE_PASS=false else IFACE_ENABLED="$(eval echo '$'"${IFACETMP}_ENABLED")" fi if [ "$IFACE_ENABLED" = "false" ] then - IFACE_PASS="false" + IFACE_PASS=false Print_Output false "Interface $IFACE is not enabled in $SCRIPT_NAME configuration" "$WARN" # elif ! echo "$IFACELIST_ORIG" | grep -q "$IFACE" then - IFACE_PASS="false" + IFACE_PASS=false Print_Output false "Interface $IFACE is not supported on this router" "$ERR" # elif ! Validate_Enabled_IFACE "$IFACE" || ! Validate_Exists_IFACE "$IFACE" then - IFACE_PASS="false" - GUESTNET_ENABLED="true" + IFACE_PASS=false + GUESTNET_ENABLED=true else - GUESTNET_ENABLED="true" + GUESTNET_ENABLED=true if [ "$(eval echo '$'"${IFACETMP}_ENABLED")" = "true" ] then if ! Validate_IP "${IFACETMP}_IPADDR" "$(eval echo '$'"${IFACETMP}_IPADDR")" then - IFACE_PASS="false" + IFACE_PASS=false else IPADDRTMP="$(eval echo '$'"${IFACETMP}_IPADDR" | cut -f1-3 -d".")" @@ -1502,14 +1535,14 @@ Conf_Validate() if [ "$(ifconfig -a | grep -o "inet addr:$IPADDRTMP.$(nvram get lan_ipaddr | cut -f4 -d'.')" | sed 's/inet addr://' | wc -l )" -gt 1 ] then Print_Output false "${IFACETMP}_IPADDR ($(eval echo '$'"${IFACETMP}_IPADDR")) has been used for another interface already" "$ERR" - IFACE_PASS="false" + IFACE_PASS=false fi fi if [ -n "$(eval echo '$'"${IFACETMP}_DHCPSTART")" ] && [ -n "$(eval echo '$'"${IFACETMP}_DHCPEND")" ] then if ! Validate_DHCP "${IFACETMP}_DHCPSTART|and|${IFACETMP}_DHCPEND" "$(eval echo '$'"${IFACETMP}_DHCPSTART")" "$(eval echo '$'"${IFACETMP}_DHCPEND")"; then - IFACE_PASS="false" + IFACE_PASS=false fi fi @@ -1520,13 +1553,13 @@ Conf_Validate() then if ! Validate_DHCP_LeaseTime "${IFACETMP}_DHCPLEASE" "$(eval echo '$'"${IFACETMP}_DHCPLEASE")" then - IFACE_PASS="false" + IFACE_PASS=false fi fi if ! Validate_TrueFalse "${IFACETMP}_FORCEDNS" "$(eval echo '$'"${IFACETMP}_FORCEDNS")" then - IFACE_PASS="false" + IFACE_PASS=false else if [ "$(eval echo '$'"${IFACETMP}_FORCEDNS")" = "true" ] then @@ -1537,18 +1570,18 @@ Conf_Validate() if ! Validate_IP "${IFACETMP}_DNS1" "$(eval echo '$'"${IFACETMP}_DNS1")" "DNS" then - IFACE_PASS="false" + IFACE_PASS=false fi if ! Validate_IP "${IFACETMP}_DNS2" "$(eval echo '$'"${IFACETMP}_DNS2")" "DNS" then - IFACE_PASS="false" + IFACE_PASS=false fi if ! Validate_TrueFalse "${IFACETMP}_ALLOWINTERNET" "$(eval echo '$'"${IFACETMP}_ALLOWINTERNET")" then ALLOWINTERNETTMP="true" - IFACE_PASS="false" + IFACE_PASS=false else ALLOWINTERNETTMP="$(eval echo '$'"${IFACETMP}_ALLOWINTERNET")" fi @@ -1556,19 +1589,19 @@ Conf_Validate() if [ "$ALLOWINTERNETTMP" = "false" ] && ! IP_Local "$(eval echo '$'"${IFACETMP}_DNS1")" then Print_Output false "$IFACE has internet access disabled and a non-local IP has been set for DNS1" "$ERR" - IFACE_PASS="false" + IFACE_PASS=false fi if [ "$ALLOWINTERNETTMP" = "false" ] && ! IP_Local "$(eval echo '$'"${IFACETMP}_DNS2")" then Print_Output false "$IFACE has internet access disabled and a non-local IP has been set for DNS2" "$ERR" - IFACE_PASS="false" + IFACE_PASS=false fi if ! Validate_TrueFalse "${IFACETMP}_REDIRECTALLTOVPN" "$(eval echo '$'"${IFACETMP}_REDIRECTALLTOVPN")" then REDIRECTTMP="false" - IFACE_PASS="false" + IFACE_PASS=false else REDIRECTTMP="$(eval echo '$'"${IFACETMP}_REDIRECTALLTOVPN")" fi @@ -1577,7 +1610,7 @@ Conf_Validate() then if ! Validate_VPNClientNo "${IFACETMP}_VPNCLIENTNUMBER" "$(eval echo '$'"${IFACETMP}_VPNCLIENTNUMBER")" then - IFACE_PASS="false" + IFACE_PASS=false else if [ "$(nvram get vpn_client"$(eval echo '$'"${IFACETMP}_VPNCLIENTNUMBER")"_rgw)" -ne 2 ] then @@ -1588,23 +1621,25 @@ Conf_Validate() fi fi - if ! Validate_TrueFalse "${IFACETMP}_TWOWAYTOGUEST" "$(eval echo '$'"${IFACETMP}_TWOWAYTOGUEST")"; then - IFACE_PASS="false" + if ! Validate_TrueFalse "${IFACETMP}_TWOWAYTOGUEST" "$(eval echo '$'"${IFACETMP}_TWOWAYTOGUEST")" + then + IFACE_PASS=false fi - if ! Validate_TrueFalse "${IFACETMP}_ONEWAYTOGUEST" "$(eval echo '$'"${IFACETMP}_ONEWAYTOGUEST")"; then - IFACE_PASS="false" + if ! Validate_TrueFalse "${IFACETMP}_ONEWAYTOGUEST" "$(eval echo '$'"${IFACETMP}_ONEWAYTOGUEST")" + then + IFACE_PASS=false fi if [ "$(eval echo '$'"${IFACETMP}_ONEWAYTOGUEST")" = "true" ] && [ "$(eval echo '$'"${IFACETMP}_TWOWAYTOGUEST")" = "true" ] then Print_Output false "$(eval echo '$'"${IFACETMP}_ONEWAYTOGUEST") & $(eval echo '$'"${IFACETMP}_TWOWAYTOGUEST") cannot both be true" "$ERR" - IFACE_PASS="false" + IFACE_PASS=false fi if ! Validate_TrueFalse "${IFACETMP}_CLIENTISOLATION" "$(eval echo '$'"${IFACETMP}_CLIENTISOLATION")" then - IFACE_PASS="false" + IFACE_PASS=false fi if [ "$(_FWVersionStrToNum_ "$fwInstalledBranchVer")" -lt "$(_FWVersionStrToNum_ 3004.386.1)" ] @@ -1615,7 +1650,8 @@ Conf_Validate() fi fi - if [ "$IFACE_PASS" = "true" ]; then + if [ "$IFACE_PASS" = "true" ] + then Print_Output false "$IFACE passed validation" "$PASS" fi fi @@ -1632,8 +1668,10 @@ Conf_Validate() fi fi done + IFACELIST="$(echo "$IFACELIST" | sed 's/^[[:blank:]]\+//;s/[[:blank:]]\+$//')" - if [ "$GUESTNET_ENABLED" = "false" ]; then + if [ "$GUESTNET_ENABLED" = "false" ] + then Print_Output true "No $SCRIPT_NAME guest networks are enabled in the configuration file!" "$CRIT" fi @@ -3703,7 +3741,8 @@ Menu_Status() GUEST_HOST="$(nvram get custom_clientlist | grep -ioE "<.*>$GUEST_MACADDR" | awk -F ">" '{print $(NF-1)}' | tr -d '<')" #thanks Adamm00 fi - if [ -x /opt/bin/dig ] && [ -z "$GUEST_HOST" ]; then + if [ -z "$GUEST_HOST" ] && [ -x /opt/bin/dig ] + then GUEST_HOST="$(/opt/bin/dig +short +answer -x "$GUEST_IPADDR" '@'"$(nvram get lan_ipaddr)" | cut -f1 -d'.')" fi elif [ -n "$FOUND_IPADDR" ] @@ -4002,7 +4041,7 @@ then fi ##----------------------------------------## -## Modified by Martinski W. [2025-Jun-18] ## +## Modified by Martinski W. [2026-Feb-18] ## ##----------------------------------------## case "$1" in install) @@ -4180,13 +4219,18 @@ case "$1" in exit 0 ;; update) - Update_Version unattended + Update_Version exit 0 ;; forceupdate) Update_Version force unattended exit 0 ;; + amtmupdate) + shift + ScriptUpdateFromAMTM "$@" + exit "$?" + ;; setversion) Set_Version_Custom_Settings local "$SCRIPT_VERSION" Set_Version_Custom_Settings server "$SCRIPT_VERSION"