diff --git a/MerlinAU.sh b/MerlinAU.sh index 0db270b3..c678bfd0 100644 --- a/MerlinAU.sh +++ b/MerlinAU.sh @@ -4,15 +4,15 @@ # # Original Creation Date: 2023-Oct-01 by @ExtremeFiretop. # Official Co-Author: @Martinski W. - Date: 2023-Nov-01 -# Last Modified: 2025-Mar-30 +# Last Modified: 2025-Apr-08 ################################################################### set -u ## Set version for each Production Release ## -readonly SCRIPT_VERSION=1.4.0 +readonly SCRIPT_VERSION=1.4.1 readonly SCRIPT_NAME="MerlinAU" ## Set to "master" for Production Releases ## -SCRIPT_BRANCH="master" +SCRIPT_BRANCH="dev" ##----------------------------------------## ## Modified by Martinski W. [2024-Jul-03] ## @@ -1138,9 +1138,9 @@ _UpdateLoginPswdCheckHelper_() } ##----------------------------------------## -## Modified by Martinski W. [2025-Mar-07] ## +## Modified by Martinski W. [2025-Apr-07] ## ##----------------------------------------## -_InitCustomSettingsConfig_() +_InitCustomDefaultsConfig_() { [ ! -d "$SETTINGS_DIR" ] && mkdir -m 755 -p "$SETTINGS_DIR" @@ -1177,53 +1177,99 @@ _InitCustomSettingsConfig_() if ! grep -q "^FW_New_Update_Notification_Date " "$CONFIG_FILE" then - sed -i "1 i FW_New_Update_Notification_Date TBD" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 1 ] + then echo "FW_New_Update_Notification_Date TBD" >> "$CONFIG_FILE" + else sed -i "1 i FW_New_Update_Notification_Date TBD" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_New_Update_Notification_Vers " "$CONFIG_FILE" then - sed -i "2 i FW_New_Update_Notification_Vers TBD" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 2 ] + then echo "FW_New_Update_Notification_Vers TBD" >> "$CONFIG_FILE" + else sed -i "2 i FW_New_Update_Notification_Vers TBD" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_New_Update_Postponement_Days=" "$CONFIG_FILE" then - sed -i "3 i FW_New_Update_Postponement_Days=$FW_UpdateDefaultPostponementDays" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 3 ] + then echo "FW_New_Update_Postponement_Days=$FW_UpdateDefaultPostponementDays" >> "$CONFIG_FILE" + else sed -i "3 i FW_New_Update_Postponement_Days=$FW_UpdateDefaultPostponementDays" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_New_Update_EMail_Notification " "$CONFIG_FILE" then - sed -i "4 i FW_New_Update_EMail_Notification $FW_UpdateEMailNotificationDefault" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 4 ] + then echo "FW_New_Update_EMail_Notification $FW_UpdateEMailNotificationDefault" >> "$CONFIG_FILE" + else sed -i "4 i FW_New_Update_EMail_Notification $FW_UpdateEMailNotificationDefault" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_New_Update_EMail_FormatType=" "$CONFIG_FILE" then - sed -i "5 i FW_New_Update_EMail_FormatType=\"${FW_UpdateEMailFormatTypeDefault}\"" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 5 ] + then echo "FW_New_Update_EMail_FormatType=\"${FW_UpdateEMailFormatTypeDefault}\"" >> "$CONFIG_FILE" + else sed -i "5 i FW_New_Update_EMail_FormatType=\"${FW_UpdateEMailFormatTypeDefault}\"" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_New_Update_Cron_Job_Schedule=" "$CONFIG_FILE" then - sed -i "6 i FW_New_Update_Cron_Job_Schedule=\"${FW_Update_CRON_DefaultSchedule}\"" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 6 ] + then echo "FW_New_Update_Cron_Job_Schedule=\"${FW_Update_CRON_DefaultSchedule}\"" >> "$CONFIG_FILE" + else sed -i "6 i FW_New_Update_Cron_Job_Schedule=\"${FW_Update_CRON_DefaultSchedule}\"" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_New_Update_ZIP_Directory_Path=" "$CONFIG_FILE" then - sed -i "7 i FW_New_Update_ZIP_Directory_Path=\"${FW_Update_ZIP_DefaultSetupDIR}\"" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 7 ] + then echo "FW_New_Update_ZIP_Directory_Path=\"${FW_Update_ZIP_DefaultSetupDIR}\"" >> "$CONFIG_FILE" + else sed -i "7 i FW_New_Update_ZIP_Directory_Path=\"${FW_Update_ZIP_DefaultSetupDIR}\"" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_New_Update_LOG_Directory_Path=" "$CONFIG_FILE" then - sed -i "8 i FW_New_Update_LOG_Directory_Path=\"${FW_Update_LOG_BASE_DefaultDIR}\"" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 8 ] + then echo "FW_New_Update_LOG_Directory_Path=\"${FW_Update_LOG_BASE_DefaultDIR}\"" >> "$CONFIG_FILE" + else sed -i "8 i FW_New_Update_LOG_Directory_Path=\"${FW_Update_LOG_BASE_DefaultDIR}\"" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_New_Update_LOG_Preferred_Path=" "$CONFIG_FILE" then preferredPath="$(Get_Custom_Setting FW_New_Update_LOG_Directory_Path)" - sed -i "9 i FW_New_Update_LOG_Preferred_Path=\"${preferredPath}\"" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 9 ] + then echo "FW_New_Update_LOG_Preferred_Path=\"${preferredPath}\"" >> "$CONFIG_FILE" + else sed -i "9 i FW_New_Update_LOG_Preferred_Path=\"${preferredPath}\"" "$CONFIG_FILE" + fi + retCode=1 + fi + if ! grep -q "^FW_New_Update_EMail_CC_Name=" "$CONFIG_FILE" + then + if [ "$(wc -l < "$CONFIG_FILE")" -lt 10 ] + then echo "FW_New_Update_EMail_CC_Name=TBD" >> "$CONFIG_FILE" + else sed -i "10 i FW_New_Update_EMail_CC_Name=TBD" "$CONFIG_FILE" + fi + retCode=1 + fi + if ! grep -q "^FW_New_Update_EMail_CC_Address=" "$CONFIG_FILE" + then + if [ "$(wc -l < "$CONFIG_FILE")" -lt 11 ] + then echo "FW_New_Update_EMail_CC_Address=TBD" >> "$CONFIG_FILE" + else sed -i "11 i FW_New_Update_EMail_CC_Address=TBD" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^credentials_base64 " "$CONFIG_FILE" then - sed -i "10 i credentials_base64 TBD" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 12 ] + then echo "credentials_base64 TBD" >> "$CONFIG_FILE" + else sed -i "12 i credentials_base64 TBD" "$CONFIG_FILE" + fi _UpdateLoginPswdCheckHelper_ InitPWD retCode=1 else @@ -1231,32 +1277,50 @@ _InitCustomSettingsConfig_() fi if ! grep -q "^CheckChangeLog " "$CONFIG_FILE" then - sed -i "11 i CheckChangeLog ENABLED" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 13 ] + then echo "CheckChangeLog ENABLED" >> "$CONFIG_FILE" + else sed -i "13 i CheckChangeLog ENABLED" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_Update_Check " "$CONFIG_FILE" then - sed -i "12 i FW_Update_Check TBD" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 14 ] + then echo "FW_Update_Check TBD" >> "$CONFIG_FILE" + else sed -i "14 i FW_Update_Check TBD" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^Allow_Updates_OverVPN " "$CONFIG_FILE" then - sed -i "13 i Allow_Updates_OverVPN DISABLED" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 15 ] + then echo "Allow_Updates_OverVPN DISABLED" >> "$CONFIG_FILE" + else sed -i "15 i Allow_Updates_OverVPN DISABLED" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^FW_Allow_Beta_Production_Up " "$CONFIG_FILE" then - sed -i "14 i FW_Allow_Beta_Production_Up ENABLED" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 16 ] + then echo "FW_Allow_Beta_Production_Up ENABLED" >> "$CONFIG_FILE" + else sed -i "16 i FW_Allow_Beta_Production_Up ENABLED" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^Allow_Script_Auto_Update " "$CONFIG_FILE" then - sed -i "15 i Allow_Script_Auto_Update DISABLED" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 17 ] + then echo "Allow_Script_Auto_Update DISABLED" >> "$CONFIG_FILE" + else sed -i "17 i Allow_Script_Auto_Update DISABLED" "$CONFIG_FILE" + fi retCode=1 fi if ! grep -q "^Script_Update_Cron_Job_SchedDays=" "$CONFIG_FILE" then - sed -i "16 i Script_Update_Cron_Job_SchedDays=\"${SW_Update_CRON_DefaultSchedDays}\"" "$CONFIG_FILE" + if [ "$(wc -l < "$CONFIG_FILE")" -lt 18 ] + then echo "Script_Update_Cron_Job_SchedDays=\"${SW_Update_CRON_DefaultSchedDays}\"" >> "$CONFIG_FILE" + else sed -i "18 i Script_Update_Cron_Job_SchedDays=\"${SW_Update_CRON_DefaultSchedDays}\"" "$CONFIG_FILE" + fi retCode=1 fi dos2unix "$CONFIG_FILE" @@ -1265,6 +1329,32 @@ _InitCustomSettingsConfig_() return "$retCode" } +##-------------------------------------## +## Added by Martinski W. [2025-Apr-07] ## +##-------------------------------------## +_InitCustomUserSettings_() +{ + FW_UpdateCronJobSchedule="$(Get_Custom_Setting FW_New_Update_Cron_Job_Schedule)" + ScriptAutoUpdateSetting="$(Get_Custom_Setting Allow_Script_Auto_Update)" + ScriptUpdateCronSchedDays="$(Get_Custom_Setting Script_Update_Cron_Job_SchedDays)" + + FW_UpdatePostponementDays="$(Get_Custom_Setting FW_New_Update_Postponement_Days)" + FW_UpdateExpectedRunDate="$(Get_Custom_Setting FW_New_Update_Expected_Run_Date)" + + # F/W Update Email Notifications # + sendEMailFormaType="$(Get_Custom_Setting FW_New_Update_EMail_FormatType)" + sendEMailNotificationsFlag="$(Get_Custom_Setting FW_New_Update_EMail_Notification)" + sendEMail_CC_Name="$(Get_Custom_Setting FW_New_Update_EMail_CC_Name)" + sendEMail_CC_Address="$(Get_Custom_Setting FW_New_Update_EMail_CC_Address)" + if [ "$sendEMailFormaType" = "HTML" ] + then isEMailFormatHTML=true + else isEMailFormatHTML=false + fi + + _SetUp_FW_UpdateZIP_DirectoryPaths_ + _SetUp_FW_UpdateLOG_DirectoryPaths_ +} + ##----------------------------------------## ## Modified by Martinski W. [2025-Jan-05] ## ##----------------------------------------## @@ -1974,40 +2064,23 @@ readonly hookScriptFName="services-start" readonly hookScriptFPath="${SCRIPTS_PATH}/$hookScriptFName" readonly hookScriptTagStr="#Added by $ScriptFNameTag#" -# Postponement Days for F/W Update Check # -FW_UpdatePostponementDays="$(Get_Custom_Setting FW_New_Update_Postponement_Days)" -FW_UpdateExpectedRunDate="$(Get_Custom_Setting FW_New_Update_Expected_Run_Date)" - ##----------------------------------------## -## Modified by Martinski W. [2024-Feb-18] ## +## Modified by Martinski W. [2025-Apr-07] ## ##----------------------------------------## # F/W Update Email Notifications # isEMailFormatHTML=true isEMailConfigEnabledInAMTM=false -sendEMailFormaType="$(Get_Custom_Setting FW_New_Update_EMail_FormatType)" -sendEMailNotificationsFlag="$(Get_Custom_Setting FW_New_Update_EMail_Notification)" -sendEMail_CC_Name="$(Get_Custom_Setting FW_New_Update_EMail_CC_Name)" -sendEMail_CC_Address="$(Get_Custom_Setting FW_New_Update_EMail_CC_Address)" -if [ "$sendEMailFormaType" = "HTML" ] -then isEMailFormatHTML=true -else isEMailFormatHTML=false -fi ##----------------------------------------## -## Modified by Martinski W. [2024-Nov-27] ## +## Modified by Martinski W. [2025-Apr-07] ## ##----------------------------------------## # Define the CRON job command to execute # -# Define the hook script file to be used # -ScriptAutoUpdateSetting="$(Get_Custom_Setting Allow_Script_Auto_Update)" -ScriptUpdateCronSchedDays="$(Get_Custom_Setting Script_Update_Cron_Job_SchedDays)" - readonly SCRIPT_UP_CRON_JOB_RUN="sh $ScriptFilePath checkupdates" readonly SCRIPT_UP_CRON_JOB_TAG="${ScriptFNameTag}_ScriptUpdate" readonly DAILY_SCRIPT_UPDATE_CHECK_JOB="sh $ScriptFilePath scriptAUCronJob & $hookScriptTagStr" readonly DAILY_SCRIPT_UPDATE_CHECK_HOOK="[ -f $ScriptFilePath ] && $DAILY_SCRIPT_UPDATE_CHECK_JOB" # Define the CRON job command to execute # -FW_UpdateCronJobSchedule="$(Get_Custom_Setting FW_New_Update_Cron_Job_Schedule)" readonly CRON_JOB_RUN="sh $ScriptFilePath run_now" readonly CRON_JOB_TAG_OLD="$ScriptFNameTag" readonly CRON_JOB_TAG="${ScriptFNameTag}_FWUpdate" @@ -2151,14 +2224,36 @@ _Mount_WebUI_() return 0 } -##-------------------------------------## -## Added by Martinski W. [2025-Feb-12] ## -##-------------------------------------## +##----------------------------------------## +## Modified by Martinski W. [2025-Apr-07] ## +##----------------------------------------## _CheckFor_WebGUI_Page_() { if "$mountWebGUI_OK" && \ [ "$(_Check_WebGUI_Page_Exists_)" = "NONE" ] - then _Mount_WebUI_ ; fi + then + if [ ! -s "$SCRIPT_WEB_ASP_PATH" ] + then + _ReleaseLock_ + exec "$ScriptFilePath" install + exit 0 + else + _Mount_WebUI_ + fi + fi +} + +##-------------------------------------## +## Added by Martinski W. [2025-Apr-07] ## +##-------------------------------------## +_CheckFor_VersionFile_() +{ + if [ ! -s "$SCRIPT_VERPATH" ] + then + _ReleaseLock_ + exec "$ScriptFilePath" install + exit 0 + fi } ##----------------------------------------## @@ -2711,9 +2806,9 @@ _DownloadScriptFiles_() return "$retCode" } -##----------------------------------------## -## Modified by Martinski W. [2025-Mar-24] ## -##----------------------------------------## +##------------------------------------------## +## Modified by ExtremeFiretop [2025-Apr-08] ## +##------------------------------------------## _SCRIPT_UPDATE_() { local extraParam="" @@ -2755,7 +2850,7 @@ _SCRIPT_UPDATE_() if "$mountWebGUI_OK" then _SetVersionSharedSettings_ server "$DLRepoVersion" ; fi - if [ "$SCRIPT_VERSION" = "$DLRepoVersion" ] + if [ "$SCRIPT_VERSION" = "$DLRepoVersion" ] && { [ -z "$DLRepoBuildNum" ] || [ "$DLRepoBuildNum" = "$ScriptBuildNum" ]; } then echo -e "${CYANct}You are on the latest version! Would you like to download anyways?${NOct}" echo -e "${CYANct}This will overwrite your currently installed version.${NOct}" @@ -2770,9 +2865,13 @@ _SCRIPT_UPDATE_() fi printf "\n${CYANct}Download successful!${NOct}\n" printf "$(date) - Successfully downloaded $SCRIPT_NAME v${DLRepoVersion}\n" + printf "${CYANct}Update successful! Restarting script...${NOct}\n" + sleep 1 + _CheckForNewGUIVersionUpdate_ && extraParam="install" + _ReleaseLock_ + exec "$ScriptFilePath" $extraParam + exit 0 fi - _WaitForEnterKey_ - return else printf "\n\n${GRNct}Exiting Script Update Utility...${NOct}\n" sleep 1 @@ -2780,6 +2879,9 @@ _SCRIPT_UPDATE_() fi elif [ "$scriptUpdateNotify" != "0" ] then + if [ -n "$DLRepoBuildNum" ] && [ "$DLRepoBuildNum" -gt "$ScriptBuildNum" ] + then echo -e "${CYANct}Developer update with timestamp $DLRepoBuildNum available!${NOct}" + fi echo -e "${CYANct}Bingo! New version available! Would you like to update now?${NOct}" if _WaitForYESorNO_ then @@ -2790,6 +2892,7 @@ _SCRIPT_UPDATE_() if "$mountWebGUI_OK" then _SetVersionSharedSettings_ local "$DLRepoVersion" fi + printf "\n${CYANct}Download successful!${NOct}\n" printf "\n$(date) - Successfully downloaded $SCRIPT_NAME v${DLRepoVersion}\n" printf "${CYANct}Update successful! Restarting script...${NOct}\n" sleep 1 @@ -5065,9 +5168,9 @@ _toggle_change_log_check_() _WaitForEnterKey_ } -##------------------------------------------## -## Modified by ExtremeFiretop [2024-Jul-23] ## -##------------------------------------------## +##----------------------------------------## +## Modified by Martinski W. [2025-Apr-07] ## +##----------------------------------------## _Toggle_VPN_Access_() { local currentSetting="$(Get_Custom_Setting "Allow_Updates_OverVPN")" @@ -5078,23 +5181,23 @@ _Toggle_VPN_Access_() printf "Disabling this feature will shut down Tailscale/ZeroTier VPN access during updates.\n" printf "Proceed if you do not need remote VPN access during firmware updates.\n" - if _WaitForYESorNO_ "\nProceed to ${GRNct}DISABLE${NOct}?" + if _WaitForYESorNO_ "\nProceed to ${REDct}DISABLE${NOct}?" then Update_Custom_Settings "Allow_Updates_OverVPN" "DISABLED" - printf "VPN access will now be ${GRNct}DISABLED.${NOct}\n" + printf "VPN access will now be ${REDct}DISABLED.${NOct}\n" else - printf "VPN access during updates remains ${REDct}ENABLED.${NOct}\n" + printf "VPN access during updates remains ${GRNct}ENABLED.${NOct}\n" fi else printf "\n${REDct}*WARNING*${NOct}\n" printf "Enabling this feature will keep Tailscale/ZeroTier VPN access active during updates.\n" printf "Proceed only if you require Tailscale/ZeroTier to connect remotely via an SSH session during firmware updates.\n" - if _WaitForYESorNO_ "\nProceed to ${REDct}ENABLE${NOct}?" + if _WaitForYESorNO_ "\nProceed to ${GRNct}ENABLE${NOct}?" then Update_Custom_Settings "Allow_Updates_OverVPN" "ENABLED" - printf "VPN access will now be ${REDct}ENABLED.${NOct}\n" + printf "VPN access will now be ${GRNct}ENABLED.${NOct}\n" else - printf "VPN access during updates remains ${GRNct}DISABLED.${NOct}\n" + printf "VPN access during updates remains ${REDct}DISABLED.${NOct}\n" fi fi _WaitForEnterKey_ @@ -9215,7 +9318,8 @@ _CheckForMinimumRequirements_() _DoStartupInit_() { _CreateDirPaths_ - _InitCustomSettingsConfig_ + _InitCustomDefaultsConfig_ + _InitCustomUserSettings_ _CreateSymLinks_ _InitHelperJSFile_ _SetVersionSharedSettings_ local "$SCRIPT_VERSION" @@ -9229,21 +9333,24 @@ _DoStartupInit_() } ##----------------------------------------## -## Modified by Martinski W. [2025-Jan-15] ## +## Modified by Martinski W. [2025-Apr-07] ## ##----------------------------------------## _DoInstallation_() { local webguiOK=true - + if ! _AcquireLock_ cliFileLock ; then return 1 ; fi _CreateDirPaths_ - _InitCustomSettingsConfig_ + _InitCustomDefaultsConfig_ + _InitCustomUserSettings_ _CreateSymLinks_ _InitHelperJSFile_ _SetVersionSharedSettings_ local "$SCRIPT_VERSION" _SetVersionSharedSettings_ server "$SCRIPT_VERSION" _DownloadScriptFiles_ install + _CheckAndSetBackupOption_ + _SetDefaultBuildType_ if "$mountWebGUI_OK" then @@ -10255,9 +10362,9 @@ _ShowAdvancedOptionsMenu_() printf "\n ${GRNct}4${NOct}. Toggle Tailscale/ZeroTier Access During Updates" if [ "$VPNAccess" = "DISABLED" ] then - printf "\n${padStr}[Currently ${GRNct}DISABLED${NOct}]\n" + printf "\n${padStr}[Currently ${REDct}DISABLED${NOct}]\n" else - printf "\n${padStr}[Currently ${REDct}ENABLED${NOct}]\n" + printf "\n${padStr}[Currently ${GRNct}ENABLED${NOct}]\n" fi # Check if the file BACKUPMON exists # @@ -10699,7 +10806,8 @@ _DoInitializationStartup_() then return 1 ; fi _CreateDirPaths_ - _InitCustomSettingsConfig_ + _InitCustomDefaultsConfig_ + _InitCustomUserSettings_ _CreateSymLinks_ _InitHelperJSFile_ _SetVersionSharedSettings_ local "$SCRIPT_VERSION" @@ -10719,7 +10827,7 @@ FW_InstalledVerStr="${GRNct}${FW_InstalledVersion}${NOct}" FW_NewUpdateVerInit=TBD ##----------------------------------------## -## Modified by Martinski W. [2025-Feb-12] ## +## Modified by Martinski W. [2025-Apr-07] ## ##----------------------------------------## if [ $# -eq 0 ] || [ -z "$1" ] || \ { [ $# -gt 1 ] && [ "$1" = "reload" ] ; } @@ -10729,6 +10837,8 @@ then inMenuMode=true _DoInitializationStartup_ + _CheckFor_VersionFile_ + if _AcquireLock_ cliFileLock then _CheckForNewScriptUpdates_ @@ -10736,6 +10846,7 @@ then fi if [ "$ScriptAutoUpdateSetting" = "ENABLED" ] then _AddScriptAutoUpdateCronJob_ ; fi + _ConfirmCronJobForFWAutoUpdates_ _CheckFor_WebGUI_Page_ diff --git a/README.md b/README.md index f300d7d0..604c89fb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MerlinAU - AsusWRT-Merlin Firmware Auto Updater -## v1.4.0 -## 2025-Apr-06 +## v1.4.1 +## 2025-Apr-08 ## WebUI: ![image](https://github.com/user-attachments/assets/92701007-a902-4724-9bae-b255856a686a) diff --git a/version.txt b/version.txt index 88c5fb89..9e0593f5 100644 --- a/version.txt +++ b/version.txt @@ -1 +1,2 @@ -1.4.0 +1.4.1 +25040806