#!/bin/sh ############################################################################################################## # # # ██████╗███████╗██╗ ██╗ ███╗ ███╗ █████╗ ███╗ ██╗ █████╗ ██████╗ ███████╗██████╗ # # ██╔════╝██╔════╝██║ ██║ ████╗ ████║██╔══██╗████╗ ██║██╔══██╗██╔════╝ ██╔════╝██╔══██╗ # # ██║ █████╗ ██║ █╗ ██║ ██╔████╔██║███████║██╔██╗ ██║███████║██║ ███╗█████╗ ██████╔╝ # # ██║ ██╔══╝ ██║███╗██║ ██║╚██╔╝██║██╔══██║██║╚██╗██║██╔══██║██║ ██║██╔══╝ ██╔══██╗ # # ╚██████╗██║ ╚███╔███╔╝ ██║ ╚═╝ ██║██║ ██║██║ ╚████║██║ ██║╚██████╔╝███████╗██║ ██║ # # ╚═════╝╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ # # # # AsusWRT-Merlin CFW Manager For Ubuntu LTS # # By Adamm - https://github.com/Adamm00/amcfwm # # 16/11/2023 - v1.1.9 # ############################################################################################################## # shellcheck disable=SC1090,SC1091 clear sed -n '2,14p' "$0" mkdir -p "$HOME/amcfwm" if [ -f "$HOME/amcfwm/amcfwm.lock" ] && [ -d "/proc/$(cat "$HOME/amcfwm/amcfwm.lock")" ]; then echo "[*] Lock File Detected (pid=$(cat "$HOME/amcfwm/amcfwm.lock")) - Exiting" exit 1 else echo "$$" > "$HOME/amcfwm/amcfwm.lock" fi ############### #- Functions -# ############### Red() { printf -- '\033[1;31m%s\033[0m\n' "$1" } Grn() { printf -- '\033[1;32m%s\033[0m\n' "$1" } Filter_Version() { grep -m1 -oE 'v[0-9]{1,2}([.][0-9]{1,2})([.][0-9]{1,2})' } Cron_Enable() { { echo "#!/bin/sh" echo "sudo -H -u $USER sh /bin/amcfwm build >/dev/null 2>&1"; } | sudo tee /etc/cron.daily/amcfwm >/dev/null 2>&1 sudo chmod 755 "/etc/cron.daily/amcfwm" } Cron_Disable() { sudo rm -rf "/etc/cron.daily/amcfwm" } Webhook_Success() { avatar="https://i.imgur.com/jZk12SL.png" curl -s -H "Content-Type: application/json" \ -X POST \ -d "$(cat </dev/null)", "fields": [{ "name": "Firmware Version", "value": "$FWNAME", "inline": false }, { "name": "Git Version", "value": "$(sed -n '1p' "$HOME/amcfwm/$FWMODEL.git" 2>/dev/null)", "inline": false }, { "name": "Compile Time", "value": "$ftime", "inline": false } ], "footer": { "text": "$(date)", "icon_url": "$avatar" } }] } EOF )" "$WEBHOOKURL" } Webhook_Failed() { avatar="https://i.imgur.com/jZk12SL.png" curl -s -H "Content-Type: application/json" \ -X POST \ -d "$(cat </dev/null)", "fields": [{ "name": "Git Version", "value": "$(sed -n '1p' "$HOME/amcfwm/$FWMODEL.git" 2>/dev/null)", "inline": false }, { "name": "Build Log", "value": "$HOME/amcfwm/$FWMODEL-output.txt", "inline": false }, { "name": "Compile Time", "value": "$ftime", "inline": false } ], "footer": { "text": "$(date)", "icon_url": "$avatar" } }] } EOF )" "$WEBHOOKURL" } Set_Default() { SRC_LOC="$HOME/amng" STAGE_LOC="$HOME/images" FINAL_LOC=admin@router.asus.com:/mnt/sda1/Share SSH_PORT="22" BUILDREV="1" RSYNC_TREE="y" FORCEBUILD="n" BUILDCRON="y" TRANSFERZIP="y" TRANSFERTRX="y" TRANSFERW="y" TRANSFERPKGTB="y" TRANSFERTXT="y" COMBINED="n" BAC68="n" BAC88="n" BAC3100="n" BAC5300="n" BAC86="n" BAX88="n" BAX58="n" BAX56="n" BAX86="n" BGTAC2900="n" BGTAX11000="n" BAX68="n" BGTAXE11000="n" BAC68V4="n" BGTAX6000="n" BXT12="n" BGTAXE16000="n" BGTAX11000PRO="n" BAX86PRO="n" BAX88PRO="n" WEBHOOKURL="" Write_Config } Write_Config() { { printf '%s\n' "################################################" printf '%s\n' "## Generated By AMCFWM - Do Not Manually Edit ##" printf '%-45s %s\n\n' "## $(date +"%b %d %T")" "##" printf '%s\n' "## Locations ##" printf '%s="%s"\n' "SRC_LOC" "$SRC_LOC" printf '%s="%s"\n' "STAGE_LOC" "$STAGE_LOC" printf '%s="%s"\n' "FINAL_LOC" "$FINAL_LOC" printf '%s="%s"\n\n' "SSH_PORT" "$SSH_PORT" printf '%s\n' "## Misc Options ##" printf '%s="%s"\n' "BUILDREV" "$BUILDREV" printf '%s="%s"\n' "RSYNC_TREE" "$RSYNC_TREE" printf '%s="%s"\n' "FORCEBUILD" "$FORCEBUILD" printf '%s="%s"\n\n' "BUILDCRON" "$BUILDCRON" printf '%s\n' "## Transfer Options ##" printf '%s="%s"\n' "TRANSFERZIP" "$TRANSFERZIP" printf '%s="%s"\n' "TRANSFERTRX" "$TRANSFERTRX" printf '%s="%s"\n' "TRANSFERW" "$TRANSFERW" printf '%s="%s"\n' "TRANSFERPKGTB" "$TRANSFERPKGTB" printf '%s="%s"\n' "TRANSFERTXT" "$TRANSFERTXT" printf '%s="%s"\n\n' "COMBINED" "$COMBINED" printf '%s\n' "## FW Models ##" printf '%s="%s"\n' "BAC68" "$BAC68" printf '%s="%s"\n' "BAC88" "$BAC88" printf '%s="%s"\n' "BAC3100" "$BAC3100" printf '%s="%s"\n' "BAC5300" "$BAC5300" printf '%s="%s"\n' "BAC86" "$BAC86" printf '%s="%s"\n' "BAX88" "$BAX88" printf '%s="%s"\n' "BAX58" "$BAX58" printf '%s="%s"\n' "BAX56" "$BAX56" printf '%s="%s"\n' "BAX86" "$BAX86" printf '%s="%s"\n' "BGTAC2900" "$BGTAC2900" printf '%s="%s"\n' "BGTAX11000" "$BGTAX11000" printf '%s="%s"\n' "BAX68" "$BAX68" printf '%s="%s"\n' "BGTAXE11000" "$BGTAXE11000" printf '%s="%s"\n' "BAC68V4" "$BAC68V4" printf '%s="%s"\n' "BGTAX6000" "$BGTAX6000" printf '%s="%s"\n' "BXT12" "$BXT12" printf '%s="%s"\n' "BGTAXE16000" "$BGTAXE16000" printf '%s="%s"\n' "BGTAX11000PRO" "$BGTAX11000PRO" printf '%s="%s"\n' "BAX86PRO" "$BAX86PRO" printf '%s="%s"\n\n' "BAX88PRO" "$BAX88PRO" printf '%s\n' "## Webhook Notifications ##" printf '%s="%s"\n' "WEBHOOKURL" "$WEBHOOKURL" printf '\n%s\n' "################################################" } > "$HOME/amcfwm/amcfwm.cfg" } Load_Menu() { if [ -f "$HOME/amcfwm/amcfwm.cfg" ]; then . "$HOME/amcfwm/amcfwm.cfg" else Set_Default fi printf '\n\n==============================================================================================================\n\n\n' reloadmenu="1" while true; do echo "Select Menu Option:" echo "[1] --> Build Firmware Images" echo "[2] --> Setup VM" echo "[3] --> Setup Repo / Toolchain" echo echo "[4] --> Settings" echo "[5] --> Update AMCFWM" echo "[6] --> Cleanup Inactive Builds" echo echo "[7] --> Uninstall" echo echo "[e] --> Exit Menu" echo printf "[1-7]: " read -r "menu" echo case "$menu" in 1) option1="build" break ;; 2) option1="install" break ;; 3) option1="repo" break ;; 4) option1="settings" while true; do echo "Select Setting To Toggle:" printf '%-35s | %-40s\n' "[1] --> Source Location" "$(Grn "$SRC_LOC")" printf '%-35s | %-40s\n' "[2] --> Stage Location" "$(Grn "$STAGE_LOC")" printf '%-35s | %-40s\n' "[3] --> Final Remote Location" "$(Grn "$FINAL_LOC")" printf '%-35s | %-40s\n\n' "[4] --> Remote SSH Port" "$(Grn "$SSH_PORT")" printf '%-35s | %-40s\n' "[5] --> Build Revision" "$(if [ "$BUILDREV" = "1" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[6] --> Rsync Tree" "$(if [ "$RSYNC_TREE" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[7] --> Force Image Build" "$(if [ "$FORCEBUILD" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n\n' "[8] --> Daily Build Cronjob" "$(if [ "$BUILDCRON" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[9] --> Transfer .zip Files" "$(if [ "$TRANSFERZIP" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[10] --> Transfer .trx Files" "$(if [ "$TRANSFERTRX" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[11] --> Transfer .w Files" "$(if [ "$TRANSFERW" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[12] --> Transfer .pkgtb Files" "$(if [ "$TRANSFERPKGTB" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n\n' "[13] --> Transfer .txt Files" "$(if [ "$TRANSFERTXT" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[14] --> Combined Images" "$(if [ "$COMBINED" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[15] --> AC68U Build" "$(if [ "$BAC68" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[16] --> AC88U Build" "$(if [ "$BAC88" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[17] --> AC3100 Build" "$(if [ "$BAC3100" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[18] --> AC5300 Build" "$(if [ "$BAC5300" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[19] --> AC86U Build" "$(if [ "$BAC86" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[20] --> AX88U Build" "$(if [ "$BAX88" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[21] --> AX58U Build" "$(if [ "$BAX58" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[22] --> AX56U Build" "$(if [ "$BAX56" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[23] --> AX86U Build" "$(if [ "$BAX86" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[24] --> GTAC2900 Build" "$(if [ "$BGTAC2900" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[25] --> GTAX11000 Build" "$(if [ "$BGTAX11000" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[26] --> AX68U Build" "$(if [ "$BAX68" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[27] --> GTAXE11000 Build" "$(if [ "$BGTAXE11000" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[28] --> RTAC68U V4 Build" "$(if [ "$BAC68V4" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[29] --> GTAX6000 Build" "$(if [ "$BGTAX6000" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[30] --> XT12 Build" "$(if [ "$BXT12" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[31] --> GTAXE16000 Build" "$(if [ "$BGTAXE16000" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[32] --> GTAX11000_PRO Build" "$(if [ "$BGTAX11000PRO" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n' "[33] --> AX86_PRO Build" "$(if [ "$BAX86PRO" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n\n' "[34] --> AX88_PRO Build" "$(if [ "$BAX88PRO" = "y" ]; then Grn "[Enabled]"; else Red "[Disabled]"; fi)" printf '%-35s | %-40s\n\n' "[35] --> Webhook URL" "$(if [ -n "$WEBHOOKURL" ]; then Grn "$WEBHOOKURL"; else Red "[Disabled]"; fi)" printf '%-35s\n\n' "[36] --> Reset All Settings To Default" printf "[1-36]: " read -r "menu2" echo case "$menu2" in 1) option2="srcloc" echo "Enter Source Location:" echo printf "[Location]: " read -r "option3" echo if [ -z "$option3" ]; then echo "[*] Location Field Can't Be Empty - Please Try Again"; echo; unset "option1" "option2" "option3"; continue; fi if [ ! -d "$option3" ]; then echo "[*] Location Doesn't Exist - Please Try Again"; echo; unset "option1" "option2" "option3"; continue; fi break ;; 2) option2="stageloc" echo "Enter Stage Location:" echo printf "[Location]: " read -r "option3" echo if [ -z "$option3" ]; then echo "[*] Location Field Can't Be Empty - Please Try Again"; echo; unset "option1" "option2" "option3"; continue; fi if [ ! -d "$option3" ]; then echo "[*] Location Doesn't Exist - Please Try Again"; echo; unset "option1" "option2" "option3"; continue; fi break ;; 3) option2="finalloc" echo "Enter Final Location:" echo printf "[Location]: " read -r "option3" echo if [ -z "$option3" ]; then echo "[*] Location Field Can't Be Empty - Please Try Again"; echo; unset "option1" "option2" "option3"; continue; fi break ;; 4) option2="sshport" echo "Enter Remote SSH Port:" echo printf "[Port]: " read -r "option3" echo if [ -z "$option3" ]; then echo "[*] Location Field Can't Be Empty - Please Try Again"; echo; unset "option1" "option2" "option3"; continue; fi if ! [ "$option3" -eq "$option3" ] 2>/dev/null; then echo "[*] $option3 Isn't A Valid Port Number!"; echo; unset "option1" "option2" "option3"; continue; fi break ;; 5) option2="buildrev" while true; do echo "Select Build Revision Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 6) option2="rsynctree" while true; do echo "Select Rsync Tree Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 7) option2="forcebuild" while true; do echo "Select Force Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 8) option2="buildcron" while true; do echo "Select Daily Build Cronjob Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 9) option2="transferzip" while true; do echo "Select Transfer .zip Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 10) option2="transfertrx" while true; do echo "Select Transfer .trx Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 11) option2="transferw" while true; do echo "Select Transfer .w Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 12) option2="transferpkgtb" while true; do echo "Select Transfer .pkgtb Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 13) option2="transfertxt" while true; do echo "Select Transfer .txt Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 14) option2="combined" while true; do echo "Combine Firmware Images:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 15) option2="bac68" while true; do echo "Select AC68U Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 16) option2="bac88" while true; do echo "Select AC88U Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 17) option2="bac3100" while true; do echo "Select AC3100 Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 18) option2="bac5300" while true; do echo "Select AC5300 Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 19) option2="bac86" while true; do echo "Select AC86U Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 20) option2="bax88" while true; do echo "Select AX88U Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 21) option2="bax58" while true; do echo "Select AX58U Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 22) option2="bax56" while true; do echo "Select AX56U Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 23) option2="bax86" while true; do echo "Select AX86U Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 24) option2="bgtac2900" while true; do echo "Select GTAC2900 Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 25) option2="bgtax11000" while true; do echo "Select GTAX11000 Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 26) option2="bax68" while true; do echo "Select AX68U Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 27) option2="bgtaxe11000" while true; do echo "Select GTAXE11000 Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 28) option2="bac68v4" while true; do echo "Select RTAC68U V4 Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 29) option2="bgtax6000" while true; do echo "Select GTAX6000 Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 30) option2="bxt12" while true; do echo "Select XT12 Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 31) option2="bgtaxe16000" while true; do echo "Select GTAXE16000 Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 32) option2="bgtax11000pro" while true; do echo "Select GTAX11000_PRO Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 33) option2="bax86pro" while true; do echo "Select AX86U_PRO Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 34) option2="bax88pro" while true; do echo "Select AX88U_PRO Build Option:" echo "[1] --> Enable" echo "[2] --> Disable" echo printf "[1-2]: " read -r "menu3" echo case "$menu3" in 1) option3="enable" break ;; 2) option3="disable" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu3 Isn't An Option!" echo ;; esac done break ;; 35) option2="webhookurl" echo "Enter Webhook URL:" echo printf "[Webhook URL]: " read -r "option3" echo break ;; 36) option2="reset" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu2 Isn't An Option!" echo ;; esac done break ;; 5) option1="update" while true; do echo "Select Update Option:" echo "[1] --> Check For And Install Any New Updates" echo "[2] --> Check For Updates Only" echo "[3] --> Force Update Even If No Updates Detected" echo printf "[1-3]: " read -r "menu2" echo case "$menu2" in 1) break ;; 2) option2="check" break ;; 3) option2="-f" break ;; e|exit|back|menu) unset "option1" "option2" "option3" clear Load_Menu break ;; *) echo "[*] $menu2 Isn't An Option!" echo ;; esac done break ;; 6) option1="cleanup" break ;; 7) option1="uninstall" break ;; e|exit) echo "[*] Exiting!" echo; exit 0 ;; *) echo "[*] $menu Isn't An Option!" echo ;; esac done } if [ -z "$1" ]; then Load_Menu fi if [ -n "$option1" ]; then set "$option1" "$option2" "$option3" echo "[$] $0 $*" | tr -s " " fi if [ -f "$HOME/amcfwm/amcfwm.cfg" ]; then . "$HOME/amcfwm/amcfwm.cfg" else Set_Default fi printf '\n\n==============================================================================================================\n\n\n' ############## #- Commands -# ############## case "$1" in build) if [ "$BAC68" != "y" ] && [ "$BAC88" != "y" ] && [ "$BAC3100" != "y" ] && [ "$BAC5300" != "y" ] && [ "$BAC86" != "y" ] && [ "$BAX88" != "y" ] && [ "$BAX58" != "y" ] && [ "$BAX56" != "y" ] && [ "$BAX86" != "y" ] && [ "$BGTAC2900" != "y" ] && [ "$BGTAX11000" != "y" ] && [ "$BAX68" != "y" ] && [ "$BGTAXE11000" != "y" ] && [ "$BAC68V4" != "y" ] && [ "$BGTAX6000" != "y" ] && [ "$BXT12" != "y" ] && [ "$BGTAXE16000" != "y" ] && [ "$BGTAX11000PRO" != "y" ] && [ "$BAX86PRO" != "y" ] && [ "$BAX88PRO" != "y" ]; then echo "[*] No Models Configured For Build" else if [ "$BUILDREV" = "1" ]; then export BUILDREV="1"; fi stime="$(date +%s)" build_fw() { BRANCH="$3" FWMODEL="$2" FWPATH="$1" LOCALFWVER="$(sed -n '1p' "$HOME/amcfwm/$FWMODEL.git" 2>/dev/null)" if [ -d "$HOME/$FWPATH" ]; then REMOTEFWVER="$(git ls-remote "$(git -C "$HOME/$FWPATH" remote get-url origin)" "$BRANCH" | awk '{print $1}')" else REMOTEFWVER="null" fi if [ "$LOCALFWVER" != "$REMOTEFWVER" ] || [ "$FORCEBUILD" = "y" ]; then echo "*** $(date +%R) - Starting building $FWMODEL..." cd "$HOME/$FWPATH" || exit 1 if make "$FWMODEL" > "$HOME/amcfwm/$FWMODEL-output.txt" 2>&1; then cd image || exit 1 if [ "$FWMODEL" = "rt-ac86u" ] || [ "$FWMODEL" = "gt-ac2900" ] || [ "$FWMODEL" = "rt-ax88u" ] || [ "$FWMODEL" = "gt-ax11000" ]; then FWNAME="$(find -- *_cferom_ubi.w | head -n 1)" ZIPNAME="$(echo "$FWNAME" | sed 's~_cferom_ubi.w~~g').zip" elif [ "$FWMODEL" = "rt-ax58u" ] || [ "$FWMODEL" = "rt-ac68u_v4" ]; then rm ./*_cferom_puresqubi.w FWNAME="$(find -- *_puresqubi.w | head -n 1)" ZIPNAME="$(echo "$FWNAME" | sed 's~_puresqubi.w~~g').zip" elif [ "$FWMODEL" = "rt-ax86u" ] || [ "$FWMODEL" = "rt-ax68u" ] || [ "$FWMODEL" = "rt-ax56u" ] || [ "$FWMODEL" = "gt-axe11000" ]; then rm ./*_cferom_pureubi.w # Broken cferom, do not use until fixed upstream FWNAME="$(find -- *_pureubi.w | head -n 1)" ZIPNAME="$(echo "$FWNAME" | sed 's~_pureubi.w~~g').zip" elif [ "$FWMODEL" = "gt-ax6000" ] || [ "$FWMODEL" = "xt12" ] || [ "$FWMODEL" = "gt-axe16000" ] || [ "$FWMODEL" = "gt-ax11000_pro" ] || [ "$FWMODEL" = "rt-ax86u_pro" ] || [ "$FWMODEL" = "rt-ax88u_pro" ]; then FWNAME="$(find -- *_nand_squashfs.pkgtb | head -n 1)" ZIPNAME="$(echo "$FWNAME" | sed 's~_nand_squashfs.pkgtb~~g').zip" else FWNAME="$(find -- *.trx | head -n 1)" ZIPNAME="$(echo "$FWNAME" | sed 's~.trx~~g').zip" fi cp "$FWNAME" "$STAGE_LOC/" sha256sum "$FWNAME" > sha256sum.sha256 zip -qj "$STAGE_LOC/$ZIPNAME" "$FWNAME" "$STAGE_LOC/README-merlin.txt" "$STAGE_LOC"/Changelog*.txt "sha256sum.sha256" 2>/dev/null ftime="$(printf '%02dh:%02dm:%02ds\n' $((($(date +%s)-stime)/3600)) $((($(date +%s)-stime)%3600/60)) $((($(date +%s)-stime)%60)))" echo echo "*** $(date +%R) - Done building $FWMODEL! ($ftime)" touch "$HOME/amcfwm/build.success" else ftime="$(printf '%02dh:%02dm:%02ds\n' $((($(date +%s)-stime)/3600)) $((($(date +%s)-stime)%3600/60)) $((($(date +%s)-stime)%60)))" echo echo "!!! $(date +%R) - $FWMODEL build failed! ($ftime)" echo "!!! $(date +%R) - $HOME/amcfwm/$FWMODEL-output.txt" fi { git -C "$HOME/$FWPATH" rev-parse HEAD if [ -n "$FWNAME" ]; then echo "$FWNAME"; else echo "$(git -C "$HOME/$FWPATH" rev-parse HEAD) [Failed]"; fi ; } > "$HOME/amcfwm/$FWMODEL.git" if [ -n "$WEBHOOKURL" ]; then if [ -n "$FWNAME" ]; then Webhook_Success; else Webhook_Failed; fi fi fi } clean_tree() { FWPATH="$1" # SDKPATH="$2" FWMODEL="$3" BRANCH="$4" LOCALFWVER="$(sed -n '1p' "$HOME/amcfwm/$FWMODEL.git" 2>/dev/null)" if [ -d "$HOME/$FWPATH" ]; then REMOTEFWVER="$(git ls-remote "$(git -C "$HOME/$FWPATH" remote get-url origin)" "$BRANCH" | awk '{print $1}')" else REMOTEFWVER="null" fi if [ "$LOCALFWVER" != "$REMOTEFWVER" ] || [ "$FORCEBUILD" = "y" ]; then echo echo "*** $(date +%R) - Cleaning up $FWMODEL..." if [ "$RSYNC_TREE" = "y" ]; then echo "*** $(date +%R) - Updating $FWMODEL tree..." rsync -a --del "$SRC_LOC/" "$HOME/$FWPATH" elif [ "$RSYNC_TREE" = "btrfs" ]; then echo "*** $(date +%R) - Copying $FWMODEL tree..." rm -rf "${HOME:?}/$FWPATH" cp -ar --reflink=auto "$SRC_LOC" "$HOME/$FWPATH" fi cd "$HOME/$FWPATH" || exit 1 git checkout "$BRANCH" >/dev/null 2>&1 git pull origin "$BRANCH" >/dev/null 2>&1 echo "*** $(date +%R) - $FWMODEL code ready." else echo "*** $(date +%R) - $FWMODEL Up To Date" fi } # Initial cleanup echo "--- $(date +%R) - Global cleanup..." mkdir -p "$STAGE_LOC/backup" mv "$STAGE_LOC"/* "$STAGE_LOC/backup/" 2>/dev/null cp "$SRC_LOC/README-merlin.txt" "$STAGE_LOC/" cp "$SRC_LOC"/Changelog*.txt "$STAGE_LOC/" echo "--- $(date +%R) - Updating Base Repo" cd "$SRC_LOC" || exit 1 git pull >/dev/null 2>&1 # Update all model trees echo "--- $(date +%R) - Preparing trees" if [ "$BAC68" = "y" ]; then clean_tree amng.ac68 release/src-rt-6.x.4708 rt-ac68u 386_x fi if [ "$BAC3100" = "y" ]; then clean_tree amng.ac3100 release/src-rt-7.14.114.x/src rt-ac3100 386_x fi if [ "$BAC88" = "y" ]; then clean_tree amng.ac88 release/src-rt-7.14.114.x/src rt-ac88u 386_x fi if [ "$BAC5300" = "y" ]; then clean_tree amng.ac5300 release/src-rt-7.14.114.x/src rt-ac5300 386_x fi if [ "$BAC86" = "y" ]; then clean_tree amng.ac86 release/src-rt-5.02hnd rt-ac86u 386_x fi if [ "$BAX88" = "y" ]; then clean_tree amng.ax88 release/src-rt-5.02axhnd rt-ax88u master fi if [ "$BAX58" = "y" ]; then clean_tree amng.ax58 release/src-rt-5.02axhnd.675x rt-ax58u master fi if [ "$BAX56" = "y" ]; then clean_tree amng.ax56 release/src-rt-5.02axhnd.675x rt-ax56u master fi if [ "$BAX86" = "y" ]; then clean_tree amng.ax86 release/src-rt-5.02L.07p2axhnd rt-ax86u master fi if [ "$BGTAC2900" = "y" ]; then clean_tree amng.gt2900 release/src-rt-5.02hnd gt-ac2900 386_x fi if [ "$BGTAX11000" = "y" ]; then clean_tree amng.gt11000 release/src-rt-5.02axhnd gt-ax11000 master fi if [ "$BAX68" = "y" ]; then clean_tree amng.ax68 release/src-rt-5.02L.07p2axhnd rt-ax68u master fi if [ "$BGTAXE11000" = "y" ]; then clean_tree amng.gtaxe11000 release/src-rt-5.02L.07p2axhnd gt-axe11000 master fi if [ "$BAC68V4" = "y" ]; then clean_tree amng.ac68v4 release/src-rt-5.02L.07p2axhnd rt-ac68u_v4 386_x fi if [ "$BGTAX6000" = "y" ]; then clean_tree amng.gtax6000 release/src-rt-5.04axhnd.675x gt-ax6000 master fi if [ "$BXT12" = "y" ]; then clean_tree amng.xt12 release/src-rt-5.04axhnd.675x xt12 master fi if [ "$BGTAXE16000" = "y" ]; then clean_tree amng.gtaxe16000 release/src-rt-5.04axhnd.675x gt-axe16000 master fi if [ "$BGTAX11000PRO" = "y" ]; then clean_tree amng.gtax11000pro release/src-rt-5.04axhnd.675x gt-ax11000_pro master fi if [ "$BAX86PRO" = "y" ]; then clean_tree amng.ax86pro release/src-rt-5.04axhnd.675x rt-ax86u_pro master fi if [ "$BAX88PRO" = "y" ]; then clean_tree amng.ax88pro release/src-rt-5.04axhnd.675x rt-ax88u_pro master fi echo echo "--- $(date +%R) - All trees ready!" echo # Launch parallel builds echo "--- $(date +%R) - Launching all builds" if [ "$BAC68" = "y" ]; then build_fw amng.ac68/release/src-rt-6.x.4708 rt-ac68u 386_x & fi if [ "$BAC3100" = "y" ]; then build_fw amng.ac3100/release/src-rt-7.14.114.x/src rt-ac3100 386_x & fi if [ "$BAC88" = "y" ]; then build_fw amng.ac88/release/src-rt-7.14.114.x/src rt-ac88u 386_x & fi if [ "$BAC5300" = "y" ]; then build_fw amng.ac5300/release/src-rt-7.14.114.x/src rt-ac5300 386_x & fi if [ "$BAC86" = "y" ]; then build_fw amng.ac86/release/src-rt-5.02hnd rt-ac86u 386_x & fi if [ "$BAX88" = "y" ]; then build_fw amng.ax88/release/src-rt-5.02axhnd rt-ax88u master & fi if [ "$BAX58" = "y" ]; then build_fw amng.ax58/release/src-rt-5.02axhnd.675x rt-ax58u master & fi if [ "$BAX56" = "y" ]; then build_fw amng.ax56/release/src-rt-5.02axhnd.675x rt-ax56u master & fi if [ "$BAX86" = "y" ]; then build_fw amng.ax86/release/src-rt-5.02L.07p2axhnd rt-ax86u master & fi if [ "$BGTAC2900" = "y" ]; then build_fw amng.gt2900/release/src-rt-5.02hnd gt-ac2900 386_x & fi if [ "$BGTAX11000" = "y" ]; then build_fw amng.gt11000/release/src-rt-5.02axhnd gt-ax11000 master & fi if [ "$BAX68" = "y" ]; then build_fw amng.ax68/release/src-rt-5.02L.07p2axhnd rt-ax68u master & fi if [ "$BGTAXE11000" = "y" ]; then build_fw amng.gtaxe11000/release/src-rt-5.02L.07p2axhnd gt-axe11000 master & fi if [ "$BAC68V4" = "y" ]; then build_fw amng.ac68v4/release/src-rt-5.02L.07p2axhnd rt-ac68u_v4 386_x & fi if [ "$BGTAX6000" = "y" ]; then build_fw amng.gtax6000/release/src-rt-5.04axhnd.675x gt-ax6000 master & fi if [ "$BXT12" = "y" ]; then build_fw amng.xt12/release/src-rt-5.04axhnd.675x xt12 master & fi if [ "$BGTAXE16000" = "y" ]; then build_fw amng.gtaxe16000/release/src-rt-5.04axhnd.675x gt-axe16000 master & fi if [ "$BGTAX11000PRO" = "y" ]; then build_fw amng.gtax11000pro/release/src-rt-5.04axhnd.675x gt-ax11000_pro master & fi if [ "$BAX86PRO" = "y" ]; then build_fw amng.ax86pro/release/src-rt-5.04axhnd.675x rt-ax86u_pro master & fi if [ "$BAX88PRO" = "y" ]; then build_fw amng.ax88pro/release/src-rt-5.04axhnd.675x rt-ax88u_pro master & fi sleep 5 echo "--- $(date +%R) - All builds launched, please wait..." wait if [ "$BAC68" = "y" ] && [ "$BAC68V4" = "y" ] && [ "$COMBINED" = "y" ]; then echo "--- $(date +%R) - Building combined RT-AC68U image..." cd "$HOME/amng.ac68/release/src-rt-6.x.4708" || exit 1 make rt-ac68u-combine_image BCM=y IMAGEDIR="$STAGE_LOC" > "output.txt" 2>&1; cd "$STAGE_LOC" || exit 1 FWNAME="$(find -- RT-AC68U_*.trx | head -n 1)" ZIPNAME="$(echo "$FWNAME" | sed 's~.trx~~g').zip" sha256sum "$FWNAME" > sha256sum.sha256 zip -qj "$ZIPNAME" "$FWNAME" README-merlin.txt Changelog*.txt sha256sum.sha256 2>/dev/null rm RT-AC68U_V4* sha256sum.sha256 fi echo cd "$STAGE_LOC" || exit 1 { sha256sum -- *.trx sha256sum -- *.w; } 2>/dev/null | unix2dos > sha256sums-ng.txt # Copy everything to the host if [ -n "$FINAL_LOC" ] && [ -f "$HOME/amcfwm/build.success" ]; then if [ "$TRANSFERZIP" = "y" ]; then scp -P "$SSH_PORT" -- *.zip "$FINAL_LOC/" 2>/dev/null; fi if [ "$TRANSFERTRX" = "y" ]; then scp -P "$SSH_PORT" -- *.trx "$FINAL_LOC/" 2>/dev/null; fi if [ "$TRANSFERW" = "y" ]; then scp -P "$SSH_PORT" -- *.w "$FINAL_LOC/" 2>/dev/null; fi if [ "$TRANSFERPKGTB" = "y" ]; then scp -P "$SSH_PORT" -- *.pkgtb "$FINAL_LOC/" 2>/dev/null; fi if [ "$TRANSFERTXT" = "y" ]; then scp -P "$SSH_PORT" -- *.txt "$FINAL_LOC/" 2>/dev/null; fi echo rm -rf "$HOME/amcfwm/build.success" fi echo "=== $(date +%R) - All done!" fi ;; install) if grep -qF "Ubuntu " "/etc/os-release"; then if ! sudo grep -qF "$USER ALL=(ALL) NOPASSWD: ALL" /etc/sudoers; then echo "Adding $USER To Sudoers File" echo "$USER ALL=(ALL) NOPASSWD: ALL" | sudo EDITOR='tee -a' visudo fi sudo apt-get update sudo apt-get -y dist-upgrade sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get -y install "linux-headers-$(uname -r)" sudo apt-get -y install lib32ncurses-dev dos2unix libtool-bin cmake libproxy-dev uuid-dev liblzo2-dev autoconf automake bash bison bzip2 diffutils file flex m4 g++ gawk groff-base libncurses5-dev libtool libslang2 make patch perl pkg-config shtool subversion tar texinfo zlib1g zlib1g-dev git gettext libexpat1-dev libssl-dev cvs gperf unzip python2 libxml-parser-perl gcc-multilib libxml2-dev g++-multilib gitk libncurses5 mtd-utils libvorbis-dev autopoint autogen sed build-essential intltool libelf1 libglib2.0-dev xutils-dev lib32z1-dev lib32stdc++6 xsltproc gtk-doc-tools libelf-dev:i386 libelf1:i386 libltdl-dev openssh-server curl nano lzip patchelf autoconf-archive libpython2.7:i386 libisl-dev:i386 libisl-dev sudo apt -y autoremove if [ ! -f "$HOME/amcfwm/amcfwm.sh" ]; then curl -fsL --retry 3 "https://raw.githubusercontent.com/Adamm00/amcfwm/master/amcfwm.sh" -o "$HOME/amcfwm/amcfwm.sh"; fi sudo ln -sf "$HOME/amcfwm/amcfwm.sh" /bin/amcfwm sudo chmod 755 "/bin/amcfwm" mkdir -p "$HOME/images" echo if [ ! -f "$HOME/.ssh/id_rsa" ]; then ssh-keygen -b 4096 fi echo "Your SSH Pubkey For Remote SSH Access - Save This File - [Press Enter To Continue]" cat "$HOME/.ssh/id_rsa.pub" read -r "continue" echo "Setting Up OpenSSH-Server - Input Pubkey Of Your SSH Client - [Press Enter To Continue]" read -r "continue" sudo nano -w "$HOME/.ssh/authorized_keys" while true; do echo "Harden SSH Server? y/n" echo printf "[y/n]: " read -r "menu" echo case "$menu" in y) echo "Hardening OpenSSH Config" if grep -qF "#Port 22" /etc/ssh/sshd_config; then SSHPORT="$(awk -v min=49152 -v max=65535 -v freq=1 'BEGIN{"tr -cd 0-9 > "$HOME/.profile" # BCM-HND sudo ln -fs "$HOME/am-toolchains/brcm-arm-hnd" "/opt/toolchains" { echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/opt/toolchains/crosstools-arm-gcc-5.3-linux-4.1-glibc-2.22-binutils-2.25/usr/lib # AsusWRT-Merlin CFW Manager" echo "export TOOLCHAIN_BASE=/opt/toolchains # AsusWRT-Merlin CFW Manager" echo "PATH=\$PATH:/opt/toolchains/crosstools-arm-gcc-5.3-linux-4.1-glibc-2.22-binutils-2.25/usr/bin # AsusWRT-Merlin CFW Manager" echo "PATH=\$PATH:/opt/toolchains/crosstools-aarch64-gcc-5.3-linux-4.1-glibc-2.22-binutils-2.25/usr/bin # AsusWRT-Merlin CFW Manager"; } >> "$HOME/.profile" # BCM-HND AX { echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/opt/toolchains/crosstools-arm-gcc-5.5-linux-4.1-glibc-2.26-binutils-2.28.1/usr/lib # AsusWRT-Merlin CFW Manager" echo "PATH=\$PATH:/opt/toolchains/crosstools-arm-gcc-5.5-linux-4.1-glibc-2.26-binutils-2.28.1/usr/bin # AsusWRT-Merlin CFW Manager" echo "PATH=\$PATH:/opt/toolchains/crosstools-aarch64-gcc-5.5-linux-4.1-glibc-2.26-binutils-2.28.1/usr/bin # AsusWRT-Merlin CFW Manager"; } >> "$HOME/.profile" # BCM-HND 5.04 { echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/opt/toolchains/crosstools-arm-gcc-9.2-linux-4.19-glibc-2.30-binutils-2.32/usr/lib # AsusWRT-Merlin CFW Manager" echo "export PATH=\$PATH:/opt/toolchains/crosstools-aarch64-gcc-9.2-linux-4.19-glibc-2.30-binutils-2.32/usr/bin # AsusWRT-Merlin CFW Manager" echo "export PATH=\$PATH:/opt/toolchains/crosstools-arm-gcc-9.2-linux-4.19-glibc-2.30-binutils-2.32/usr/bin # AsusWRT-Merlin CFW Manager"; } >> "$HOME/.profile" if [ ! -f "$HOME/amcfwm/amcfwm.cfg" ]; then Set_Default fi echo "Repo Setup Complete!" echo ;; settings) case "$2" in srcloc) if [ -z "$3" ]; then echo "[*] Source Location Not Specified - Exiting"; echo; exit 1; fi SRC_LOC="$3" echo "[i] Source Location Set To $SRC_LOC" ;; stageloc) if [ -z "$3" ]; then echo "[*] Stage Location Not Specified - Exiting"; echo; exit 1; fi STAGE_LOC="$3" echo "[i] Stage Location Set To $STAGE_LOC" ;; finalloc) if [ -z "$3" ]; then echo "[*] Final Location Not Specified - Exiting"; echo; exit 1; fi FINAL_LOC="$3" echo "[i] Final Location Set To $FINAL_LOC" ;; sshport) if [ -z "$3" ]; then echo "[*] Remote SSH Port Not Specified - Exiting"; echo; exit 1; fi if ! [ "$3" -eq "$3" ] 2>/dev/null; then echo "[*] $3 Isn't A Valid Port Number!"; echo; exit 1; fi SSH_PORT="$3" echo "[i] Remote SSH Port Set To $SSH_PORT" ;; buildrev) case "$3" in enable) BUILDREV="1" echo "[i] Build Revision String Enabled" ;; disable) BUILDREV="n" echo "[i] Build Revision String Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; rsynctree) case "$3" in enable) RSYNC_TREE="y" echo "[i] Rsync Tree Enabled" ;; disable) RSYNC_TREE="n" echo "[i] Rsync Tree Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; forcebuild) case "$3" in enable) FORCEBUILD="y" echo "[i] Force Image Build Enabled" ;; disable) FORCEBUILD="n" echo "[i] Force Image Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; buildcron) case "$3" in enable) BUILDCRON="y" Cron_Enable echo "[i] Daily Build Cronjob Enabled" ;; disable) BUILDCRON="n" Cron_Disable echo "[i] Daily Build Cronjob Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; transferzip) case "$3" in enable) TRANSFERZIP="y" echo "[i] Transfer .zip Files Enabled" ;; disable) TRANSFERZIP="n" echo "[i] Transfer .zip Files Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; transfertrx) case "$3" in enable) TRANSFERTRX="y" echo "[i] Transfer .trx Files Enabled" ;; disable) TRANSFERTRX="n" echo "[i] Transfer .trx Files Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; transferw) case "$3" in enable) TRANSFERW="y" echo "[i] Transfer .w Files Enabled" ;; disable) TRANSFERW="n" echo "[i] Transfer .w Files Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; transferpkgtb) case "$3" in enable) TRANSFERPKGTB="y" echo "[i] Transfer .pkgtb Files Enabled" ;; disable) TRANSFERPKGTB="n" echo "[i] Transfer .pkgtb Files Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; transfertxt) case "$3" in enable) TRANSFERTXT="y" echo "[i] Transfer .txt Files Enabled" ;; disable) TRANSFERTXT="n" echo "[i] Transfer .txt Files Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; combined) case "$3" in enable) COMBINED="y" echo "[i] Combine Firmware Images Enabled" ;; disable) COMBINED="n" echo "[i] Combine Firmware Images Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bac68) case "$3" in enable) BAC68="y" echo "[i] AC68U Build Enabled" ;; disable) BAC68="n" echo "[i] AC68U Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bac88) case "$3" in enable) BAC88="y" echo "[i] AC88U Build Enabled" ;; disable) BAC88="n" echo "[i] AC88U Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bac3100) case "$3" in enable) BAC3100="y" echo "[i] AC3100 Build Enabled" ;; disable) BAC3100="n" echo "[i] AC3100 Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bac5300) case "$3" in enable) BAC5300="y" echo "[i] AC5300 Build Enabled" ;; disable) BAC5300="n" echo "[i] AC5300 Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bac86) case "$3" in enable) BAC86="y" echo "[i] AC86U Build Enabled" ;; disable) BAC86="n" echo "[i] AC86U Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bax88) case "$3" in enable) BAX88="y" echo "[i] AX88U Build Enabled" ;; disable) BAX88="n" echo "[i] AX88U Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bax58) case "$3" in enable) BAX58="y" echo "[i] AX58U Build Enabled" ;; disable) BAX58="n" echo "[i] AX58U Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bax56) case "$3" in enable) BAX56="y" echo "[i] AX56U Build Enabled" ;; disable) BAX56="n" echo "[i] AX56U Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bax86) case "$3" in enable) BAX86="y" echo "[i] AX86U Build Enabled" ;; disable) BAX86="n" echo "[i] AX86U Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bgtac2900) case "$3" in enable) BGTAC2900="y" echo "[i] GT-AC2900 Build Enabled" ;; disable) BGTAC2900="n" echo "[i] GT-AC2900 Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bgtax11000) case "$3" in enable) BGTAX11000="y" echo "[i] GT-AX11000 Build Enabled" ;; disable) BGTAX11000="n" echo "[i] GT-AX11000 Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bax68) case "$3" in enable) BAX68="y" echo "[i] AX68U Build Enabled" ;; disable) BAX68="n" echo "[i] AX68U Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bgtaxe11000) case "$3" in enable) BGTAXE11000="y" echo "[i] GTAXE11000 Build Enabled" ;; disable) BGTAXE11000="n" echo "[i] GTAXE11000 Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bac68v4) case "$3" in enable) BAC68V4="y" echo "[i] AC68U V4 Build Enabled" ;; disable) BAC68V4="n" echo "[i] AC68U V4 Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bgtax6000) case "$3" in enable) BGTAX6000="y" echo "[i] GTAX6000 Build Enabled" ;; disable) BGTAX6000="n" echo "[i] GTAX6000 Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bxt12) case "$3" in enable) BXT12="y" echo "[i] XT12 Build Enabled" ;; disable) BXT12="n" echo "[i] XT12 Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bgtaxe16000) case "$3" in enable) BGTAXE16000="y" echo "[i] GTAXE16000 Build Enabled" ;; disable) BGTAXE16000="n" echo "[i] GTAXE16000 Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bgtax11000pro) case "$3" in enable) BGTAX11000PRO="y" echo "[i] GTAX11000_PRO Build Enabled" ;; disable) BGTAX11000PRO="n" echo "[i] GTAX11000_PRO Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bax86pro) case "$3" in enable) BAX86PRO="y" echo "[i] AX86U_PRO Build Enabled" ;; disable) BAX86PRO="n" echo "[i] AX86U_PRO Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; bax88pro) case "$3" in enable) BAX88PRO="y" echo "[i] AX88U_PRO Build Enabled" ;; disable) BAX88PRO="n" echo "[i] AX88U_PRO Build Disabled" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo; exit 2 ;; esac ;; webhookurl) WEBHOOKURL="$3" if [ -n "$WEBHOOKURL" ]; then echo "[i] Webhook URL Set To $WEBHOOKURL" else echo "[i] Webhook Notifications Disabled" fi ;; reset) Set_Default echo "[i] All Settings Reset" ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo ;; esac ;; update) remotedir="https://raw.githubusercontent.com/Adamm00/amcfwm/master" localver="$(Filter_Version < "$0")" remotever="$(curl -fsL --retry 3 --connect-timeout 3 "${remotedir}/amcfwm.sh" | Filter_Version)" localmd5="$(md5sum "$0" | awk '{print $1}')" remotemd5="$(curl -fsL --retry 3 --connect-timeout 3 "${remotedir}/amcfwm.sh" | md5sum | awk '{print $1}')" if [ "$localmd5" = "$remotemd5" ] && [ "$2" != "-f" ]; then echo "[i] AMCFWM Up To Date - $localver (${localmd5})" noupdate="1" elif [ "$localmd5" != "$remotemd5" ] && [ "$2" = "check" ]; then echo "[i] AMCFWM Update Detected - $remotever (${remotemd5})" noupdate="1" elif [ "$2" = "-f" ]; then echo "[i] Forcing Update" fi if [ "$localmd5" != "$remotemd5" ] || [ "$2" = "-f" ] && [ "$noupdate" != "1" ]; then echo "[i] New Version Detected - Updating To $remotever (${remotemd5})" sudo curl -fsL --retry 3 --connect-timeout 3 "${remotedir}/amcfwm.sh" -o "$0" sudo curl -fsL --retry 3 --connect-timeout 3 "${remotedir}/2-amcfwm-motd" -o "/etc/update-motd.d/2-amcfwm-motd" echo "[i] Update Complete!" echo exit 0 fi ;; cleanup) echo "[i] Cleaning Up Inactive Build Directories" if [ "$BAC68" != "y" ] && [ -d "$HOME/amng.ac68" ]; then echo "[i] Removing $HOME/amng.ac68 ($(du -sh "$HOME/amng.ac68" | awk '{print $1}'))" rm -rf "$HOME/amng.ac68" "$HOME/amcfwm/rt-ac68u.git" "$HOME/amcfwm/rt-ac68u-output.txt" fi if [ "$BAC3100" != "y" ] && [ -d "$HOME/amng.ac3100" ]; then echo "[i] Removing $HOME/amng.ac3100 ($(du -sh "$HOME/amng.ac3100" | awk '{print $1}'))" rm -rf "$HOME/amng.ac3100" "$HOME/amcfwm/rt-ac3100.git" "$HOME/amcfwm/rt-ac3100-output.txt" fi if [ "$BAC88" != "y" ] && [ -d "$HOME/amng.ac88" ]; then echo "[i] Removing $HOME/amng.ac88 ($(du -sh "$HOME/amng.ac88" | awk '{print $1}'))" rm -rf "$HOME/amng.ac88" "$HOME/amcfwm/rt-ac88u.git" "$HOME/amcfwm/rt-ac88u-output.txt" fi if [ "$BAC5300" != "y" ] && [ -d "$HOME/amng.ac5300" ]; then echo "[i] Removing $HOME/amng.ac5300 ($(du -sh "$HOME/amng.ac5300" | awk '{print $1}'))" rm -rf "$HOME/amng.ac5300" "$HOME/amcfwm/rt-ac5300.git" "$HOME/amcfwm/rt-ac5300-output.txt" fi if [ "$BAC86" != "y" ] && [ -d "$HOME/amng.ac86" ]; then echo "[i] Removing $HOME/amng.ac86 ($(du -sh "$HOME/amng.ac86" | awk '{print $1}'))" rm -rf "$HOME/amng.ac86" "$HOME/amcfwm/rt-ac86u.git" "$HOME/amcfwm/rt-ac86u-output.txt" fi if [ "$BAX88" != "y" ] && [ -d "$HOME/amng.ax88" ]; then echo "[i] Removing $HOME/amng.ax88 ($(du -sh "$HOME/amng.ax88" | awk '{print $1}'))" rm -rf "$HOME/amng.ax88" "$HOME/amcfwm/rt-ax88u.git" "$HOME/amcfwm/rt-ax88u-output.txt" fi if [ "$BAX58" != "y" ] && [ -d "$HOME/amng.ax58" ]; then echo "[i] Removing $HOME/amng.ax58 ($(du -sh "$HOME/amng.ax58" | awk '{print $1}'))" rm -rf "$HOME/amng.ax58" "$HOME/amcfwm/rt-ax58u.git" "$HOME/amcfwm/rt-ax58u-output.txt" fi if [ "$BAX56" != "y" ] && [ -d "$HOME/amng.ax56" ]; then echo "[i] Removing $HOME/amng.ax56 ($(du -sh "$HOME/amng.ax56" | awk '{print $1}'))" rm -rf "$HOME/amng.ax56" "$HOME/amcfwm/rt-ax56u.git" "$HOME/amcfwm/rt-ax56u-output.txt" fi if [ "$BAX86" != "y" ] && [ -d "$HOME/amng.ax86" ]; then echo "[i] Removing $HOME/amng.ax86 ($(du -sh "$HOME/amng.ax86" | awk '{print $1}'))" rm -rf "$HOME/amng.ax86" "$HOME/amcfwm/rt-ax86u.git" "$HOME/amcfwm/rt-ax86u-output.txt" fi if [ "$BGTAC2900" != "y" ] && [ -d "$HOME/amng.gt2900" ]; then echo "[i] Removing $HOME/amng.gt2900 ($(du -sh "$HOME/amng.gt2900" | awk '{print $1}'))" rm -rf "$HOME/amng.gt2900" "$HOME/amcfwm/gt-ac2900.git" "$HOME/amcfwm/gt-ac2900-output.txt" fi if [ "$BGTAX11000" != "y" ] && [ -d "$HOME/amng.gt11000" ]; then echo "[i] Removing $HOME/amng.gt11000 ($(du -sh "$HOME/amng.gt11000" | awk '{print $1}'))" rm -rf "$HOME/amng.gt11000" "$HOME/amcfwm/gt-ax11000.git" "$HOME/amcfwm/gt-ax11000-output.txt" fi if [ "$BAX68" != "y" ] && [ -d "$HOME/amng.ax68" ]; then echo "[i] Removing $HOME/amng.ax68 ($(du -sh "$HOME/amng.ax68" | awk '{print $1}'))" rm -rf "$HOME/amng.ax68" "$HOME/amcfwm/rt-ax68u.git" "$HOME/amcfwm/rt-ax68u-output.txt" fi if [ "$BGTAXE11000" != "y" ] && [ -d "$HOME/amng.gtaxe11000" ]; then echo "[i] Removing $HOME/amng.gtaxe11000 ($(du -sh "$HOME/amng.gtaxe11000" | awk '{print $1}'))" rm -rf "$HOME/amng.gtaxe11000" "$HOME/amcfwm/gt-axe11000.git" "$HOME/amcfwm/gt-axe11000-output.txt" fi if [ "$BAC68V4" != "y" ] && [ -d "$HOME/amng.ac68v4" ]; then echo "[i] Removing $HOME/amng.ac68v4 ($(du -sh "$HOME/amng.ac68v4" | awk '{print $1}'))" rm -rf "$HOME/amng.ac68v4" "$HOME/amcfwm/rt-ac68uv4.git" "$HOME/amcfwm/rt-ac68uv4-output.txt" fi if [ "$BGTAX6000" != "y" ] && [ -d "$HOME/amng.gtax6000" ]; then echo "[i] Removing $HOME/amng.gtax6000 ($(du -sh "$HOME/amng.gtax6000" | awk '{print $1}'))" rm -rf "$HOME/amng.gtax6000" "$HOME/amcfwm/gt-ax6000.git" "$HOME/amcfwm/gt-ax6000-output.txt" fi if [ "$BXT12" != "y" ] && [ -d "$HOME/amng.xt12" ]; then echo "[i] Removing $HOME/amng.xt12 ($(du -sh "$HOME/amng.xt12" | awk '{print $1}'))" rm -rf "$HOME/amng.xt12" "$HOME/amcfwm/zen-xt12.git" "$HOME/amcfwm/zen-xt12-output.txt" fi if [ "$BGTAXE16000" != "y" ] && [ -d "$HOME/amng.gtaxe16000" ]; then echo "[i] Removing $HOME/amng.gtaxe16000 ($(du -sh "$HOME/amng.gtaxe16000" | awk '{print $1}'))" rm -rf "$HOME/amng.gtaxe16000" "$HOME/amcfwm/gt-axe16000.git" "$HOME/amcfwm/gt-axe16000-output.txt" fi if [ "$BGTAX11000PRO" != "y" ] && [ -d "$HOME/amng.gtax11000pro" ]; then echo "[i] Removing $HOME/amng.gtax11000pro ($(du -sh "$HOME/amng.gtax11000pro" | awk '{print $1}'))" rm -rf "$HOME/amng.gtax11000pro" "$HOME/amcfwm/gt-ax11000_pro.git" "$HOME/amcfwm/gt-ax11000_pro-output.txt" fi if [ "$BAX86PRO" != "y" ] && [ -d "$HOME/amng.ax86pro" ]; then echo "[i] Removing $HOME/amng.ax86pro ($(du -sh "$HOME/amng.ax86pro" | awk '{print $1}'))" rm -rf "$HOME/amng.ax86pro" "$HOME/amcfwm/rt-ax86u_pro.git" "$HOME/amcfwm/rt-ax86u_pro-output.txt" fi if [ "$BAX88PRO" != "y" ] && [ -d "$HOME/amng.ax88pro" ]; then echo "[i] Removing $HOME/amng.ax88pro ($(du -sh "$HOME/amng.ax88pro" | awk '{print $1}'))" rm -rf "$HOME/amng.ax88pro" "$HOME/amcfwm/rt-ax88u_pro.git" "$HOME/amcfwm/rt-ax88u_pro-output.txt" fi ;; uninstall) echo "If You Were Experiencing Issues, Try Update Or Visit SNBForums/Github For Support" echo "https://github.com/Adamm00/amcfwm" echo while true; do echo "[!] Warning - This Will Delete All Files Related To The Project" echo "Are You Sure You Want To Uninstall?" echo echo "[1] --> Yes" echo "[2] --> No" echo echo "Please Select Option" printf "[1-2]: " read -r "continue" echo case "$continue" in 1) sudo rm -rf "$HOME/am-toolchains" "$HOME/amng" "$HOME"/amng.* "/opt/toolchains" "/opt/brcm-arm" "/etc/update-motd.d/2-amcfwm-motd" sed -i '\~AsusWRT-Merlin CFW Manager~d' "$HOME/.profile" sudo rm -rf "$HOME/amcfwm" "/bin/amcfwm" break ;; 2|e|exit) echo "[*] Exiting!" echo; exit 0 ;; *) echo "[*] $continue Isn't An Option!" echo ;; esac done ;; *) echo "Command Not Recognized, Please Try Again" echo "For Help Check https://github.com/Adamm00/amcfwm" echo ;; esac printf '\n\n==============================================================================================================\n\n\n' Write_Config rm -rf "$HOME/amcfwm/amcfwm.lock" if [ -n "$reloadmenu" ]; then printf "[i] Press Enter To Continue..."; read -r continue; exec "$0"; fi