From 7fa5f4a4051623151d5292bc4d34073244930734 Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Sun, 11 Jan 2026 22:01:50 +0100 Subject: [PATCH 1/3] Feature: Configure backup retention --- .../Resources/Strings.Designer.cs | 22 +++++++++++++ .../Resources/Strings.resx | 10 ++++++ .../Network/NetworkInterface.cs | 1 - .../GlobalStaticConfiguration.cs | 16 +++++----- .../NETworkManager.Settings/SettingsInfo.cs | 31 +++++++++++++++++++ .../SettingsManager.cs | 12 ++++++- .../ViewModels/SettingsProfilesViewModel.cs | 24 ++++++++++++++ .../ViewModels/SettingsSettingsViewModel.cs | 30 ++++++++++++++++-- .../Views/SettingsSettingsView.xaml | 18 ++++++++++- 9 files changed, 150 insertions(+), 14 deletions(-) diff --git a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs index fbd0f19ec1..4e7e0aca64 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.Designer.cs +++ b/Source/NETworkManager.Localization/Resources/Strings.Designer.cs @@ -4552,6 +4552,19 @@ public static string HelpMessage_SaveCredentials { } } + /// + /// Sucht eine lokalisierte Zeichenfolge, die The number of settings backups that are retained before the oldest one is deleted. + /// + ///An automatic backup is only created once a day, before saving a change. + /// + ///The value 0 disables the creation of automatic backups. Backups that have already been created are not deleted. ähnelt. + /// + public static string HelpMessage_SettingsMaximumNumberOfBackups { + get { + return ResourceManager.GetString("HelpMessage_SettingsMaximumNumberOfBackups", resourceCulture); + } + } + /// /// Sucht eine lokalisierte Zeichenfolge, die Displays the status bar in the bottom-left of the WebView when hovering over a link. ähnelt. /// @@ -5783,6 +5796,15 @@ public static string MaximumHops { } } + /// + /// Sucht eine lokalisierte Zeichenfolge, die Maximum Number of Backups ähnelt. + /// + public static string MaximumNumberOfBackups { + get { + return ResourceManager.GetString("MaximumNumberOfBackups", resourceCulture); + } + } + /// /// Sucht eine lokalisierte Zeichenfolge, die Maximum number ({0}) of hops/router reached! ähnelt. /// diff --git a/Source/NETworkManager.Localization/Resources/Strings.resx b/Source/NETworkManager.Localization/Resources/Strings.resx index 28ccf1c004..14ca461f78 100644 --- a/Source/NETworkManager.Localization/Resources/Strings.resx +++ b/Source/NETworkManager.Localization/Resources/Strings.resx @@ -3951,4 +3951,14 @@ If you click Cancel, the profile file will remain unencrypted. Could not parse "{0}". + + Maximum Number of Backups + + + The number of settings backups that are retained before the oldest one is deleted. + +An automatic backup is only created once a day, before saving a change. + +The value 0 disables the creation of automatic backups. Backups that have already been created are not deleted. + \ No newline at end of file diff --git a/Source/NETworkManager.Models/Network/NetworkInterface.cs b/Source/NETworkManager.Models/Network/NetworkInterface.cs index d7662f6704..7cd8c34038 100644 --- a/Source/NETworkManager.Models/Network/NetworkInterface.cs +++ b/Source/NETworkManager.Models/Network/NetworkInterface.cs @@ -527,7 +527,6 @@ private static void RemoveIPAddressFromNetworkInterface(NetworkInterfaceConfig c #endregion - #region Events /// diff --git a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs index af7ea9117d..28c92928a6 100644 --- a/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs +++ b/Source/NETworkManager.Settings/GlobalStaticConfiguration.cs @@ -46,9 +46,6 @@ public static class GlobalStaticConfiguration public static string ZipFileExtensionFilter => "ZIP Archive (*.zip)|*.zip"; public static string XmlFileExtensionFilter => "XML-File (*.xml)|*.xml"; - // Backup settings - public static int Backup_MaximumNumberOfBackups => 10; - #endregion #region Default settings @@ -74,18 +71,21 @@ public static class GlobalStaticConfiguration public static bool Status_ShowWindowOnNetworkChange => true; public static int Status_WindowCloseTime => 10; - // HotKey + // Settings: HotKey public static int HotKey_ShowWindowKey => 79; public static int HotKey_ShowWindowModifier => 3; - // Update + // Settings: Update public static bool Update_CheckForUpdatesAtStartup => true; - public static bool Update_CheckForPreReleases => false; - - // Experimental public static bool Experimental_EnableExperimentalFeatures => false; + // Settings: Profiles + public static int Profiles_MaximumNumberOfBackups => 10; + + // Settings: Settings + public static int Settings_MaximumNumberOfBackups => 10; + // Application: Dashboard public static string Dashboard_PublicIPv4Address => "1.1.1.1"; public static string Dashboard_PublicIPv6Address => "2606:4700:4700::1111"; diff --git a/Source/NETworkManager.Settings/SettingsInfo.cs b/Source/NETworkManager.Settings/SettingsInfo.cs index 4a41e94680..b8f993cff0 100644 --- a/Source/NETworkManager.Settings/SettingsInfo.cs +++ b/Source/NETworkManager.Settings/SettingsInfo.cs @@ -582,6 +582,37 @@ public string Profiles_LastSelected } } + private int _profiles_MaximumNumberOfBackups = GlobalStaticConfiguration.Profiles_MaximumNumberOfBackups; + + public int Profiles_MaximumNumberOfBackups + { + get => _profiles_MaximumNumberOfBackups; + set + { + if (value == _profiles_MaximumNumberOfBackups) + return; + + _profiles_MaximumNumberOfBackups = value; + OnPropertyChanged(); + } + } + + // Settings + private int _settings_MaximumNumberOfBackups = GlobalStaticConfiguration.Settings_MaximumNumberOfBackups; + + public int Settings_MaximumNumberOfBackups + { + get => _settings_MaximumNumberOfBackups; + set + { + if (value == _settings_MaximumNumberOfBackups) + return; + + _settings_MaximumNumberOfBackups = value; + OnPropertyChanged(); + } + } + #endregion #region Others diff --git a/Source/NETworkManager.Settings/SettingsManager.cs b/Source/NETworkManager.Settings/SettingsManager.cs index 7c0041f063..6aeb6b9a96 100644 --- a/Source/NETworkManager.Settings/SettingsManager.cs +++ b/Source/NETworkManager.Settings/SettingsManager.cs @@ -265,6 +265,16 @@ private static void SerializeToFile(string filePath) /// called as part of a daily maintenance routine. private static void CreateDailyBackupIfNeeded() { + var maxBackups = Current.Settings_MaximumNumberOfBackups; + + // Check if backups are disabled + if (maxBackups == 0) + { + Log.Debug("Daily backups are disabled. Skipping backup creation..."); + + return; + } + var currentDate = DateTime.Now.Date; if (Current.LastBackup < currentDate) @@ -284,7 +294,7 @@ private static void CreateDailyBackupIfNeeded() // Cleanup old backups CleanupBackups(GetSettingsBackupFolderLocation(), GetSettingsFileName(), - GlobalStaticConfiguration.Backup_MaximumNumberOfBackups); + maxBackups); Current.LastBackup = currentDate; } diff --git a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs index fd42c76821..04f4b7fcb1 100644 --- a/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsProfilesViewModel.cs @@ -22,6 +22,8 @@ public class SettingsProfilesViewModel : ViewModelBase public Action CloseAction { get; set; } + private readonly bool _isLoading; + private string _location; public string Location @@ -67,12 +69,31 @@ public ProfileFileInfo SelectedProfileFile } } + private int _maximumNumberOfBackups; + + public int MaximumNumberOfBackups + { + get => _maximumNumberOfBackups; + set + { + if (value == _maximumNumberOfBackups) + return; + + if (!_isLoading) + SettingsManager.Current.Profiles_MaximumNumberOfBackups = value; + + _maximumNumberOfBackups = value; + OnPropertyChanged(); + } + } #endregion #region Constructor, LoadSettings public SettingsProfilesViewModel() { + _isLoading = true; + ProfileFiles = new CollectionViewSource { Source = ProfileManager.ProfileFiles }.View; ProfileFiles.SortDescriptions.Add( new SortDescription(nameof(ProfileFileInfo.Name), ListSortDirection.Ascending)); @@ -80,11 +101,14 @@ public SettingsProfilesViewModel() SelectedProfileFile = ProfileFiles.Cast().FirstOrDefault(); LoadSettings(); + + _isLoading = false; } private void LoadSettings() { Location = ProfileManager.GetProfilesFolderLocation(); + MaximumNumberOfBackups = SettingsManager.Current.Profiles_MaximumNumberOfBackups; } #endregion diff --git a/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs b/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs index 399ffb1e02..fbe8f3be3f 100644 --- a/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs +++ b/Source/NETworkManager/ViewModels/SettingsSettingsViewModel.cs @@ -1,8 +1,6 @@ -using MahApps.Metro.SimpleChildWindow; -using NETworkManager.Localization.Resources; +using NETworkManager.Localization.Resources; using NETworkManager.Settings; using NETworkManager.Utilities; -using NETworkManager.Views; using System; using System.Diagnostics; using System.Threading.Tasks; @@ -16,6 +14,8 @@ public class SettingsSettingsViewModel : ViewModelBase #region Variables public Action CloseAction { get; set; } + private readonly bool _isLoading; + private string _location; public string Location @@ -30,18 +30,42 @@ public string Location OnPropertyChanged(); } } + + private int _maximumNumberOfBackups; + + public int MaximumNumberOfBackups + { + get => _maximumNumberOfBackups; + set + { + if (value == _maximumNumberOfBackups) + return; + + if (!_isLoading) + SettingsManager.Current.Settings_MaximumNumberOfBackups = value; + + _maximumNumberOfBackups = value; + OnPropertyChanged(); + } + } + #endregion #region Constructor, LoadSettings public SettingsSettingsViewModel() { + _isLoading = true; + LoadSettings(); + + _isLoading = false; } private void LoadSettings() { Location = SettingsManager.GetSettingsFolderLocation(); + MaximumNumberOfBackups = SettingsManager.Current.Settings_MaximumNumberOfBackups; } #endregion diff --git a/Source/NETworkManager/Views/SettingsSettingsView.xaml b/Source/NETworkManager/Views/SettingsSettingsView.xaml index 7f91995927..c97e846d8a 100644 --- a/Source/NETworkManager/Views/SettingsSettingsView.xaml +++ b/Source/NETworkManager/Views/SettingsSettingsView.xaml @@ -3,6 +3,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" xmlns:viewModels="clr-namespace:NETworkManager.ViewModels" xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization" @@ -30,8 +31,23 @@ + + + + + + +