Changed parameter from boolean to Enum for clarity of purpose

This commit is contained in:
Marcelo C.
2025-04-02 10:15:21 -03:00
parent 2da12c12bb
commit bf22d7e178
12 changed files with 28 additions and 22 deletions
+1 -1
View File
@@ -119,7 +119,7 @@ public static class Program
new Option<SecretProviderHelper.CachingLevel>("--secret-provider-cache", description: "The secret provider cache level", getDefaultValue: () => SecretProviderHelper.CachingLevel.None),
new Option<string>("--secret-provider-pattern", description: "The secret provider pattern", getDefaultValue: () => SecretProviderHelper.DEFAULT_PATTERN),
new Option<bool>($"--{DataFolderManager.PORTABLE_MODE_OPTION}", description: "Use portable mode for locating the database and storing configuration", getDefaultValue: () => DataFolderManager.PORTABLE_MODE),
new Option<DirectoryInfo?>($"--{DataFolderManager.SERVER_DATAFOLDER_OPTION}", description: "The datafolder to use for locating the database and storing configuration", getDefaultValue: () => new DirectoryInfo(DataFolderManager.GetDataFolder(true))),
new Option<DirectoryInfo?>($"--{DataFolderManager.SERVER_DATAFOLDER_OPTION}", description: "The datafolder to use for locating the database and storing configuration", getDefaultValue: () => new DirectoryInfo(DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly))),
};
runcmd.Handler = CommandHandler.Create<CommandLineArguments>(RunAgent);
+1 -1
View File
@@ -297,7 +297,7 @@ namespace Duplicati.CommandLine
new CommandLineArgument("quiet-console", CommandLineArgument.ArgumentType.Boolean, Strings.Program.QuietConsoleOptionShort, Strings.Program.QuietConsoleOptionLong, "false"),
new CommandLineArgument("auto-update", CommandLineArgument.ArgumentType.Boolean, Strings.Program.AutoUpdateOptionShort, Strings.Program.AutoUpdateOptionLong, "false"),
new CommandLineArgument(DataFolderManager.PORTABLE_MODE_OPTION, CommandLineArgument.ArgumentType.Boolean, Strings.Program.PortableModeOptionShort, Strings.Program.PortableModeOptionLong, DataFolderManager.PORTABLE_MODE.ToString().ToLowerInvariant()),
new CommandLineArgument(DataFolderManager.SERVER_DATAFOLDER_OPTION, CommandLineArgument.ArgumentType.Path, Strings.Program.DataFolderOptionShort, Strings.Program.DataFolderOptionLong, DataFolderManager.GetDataFolder(true)),
new CommandLineArgument(DataFolderManager.SERVER_DATAFOLDER_OPTION, CommandLineArgument.ArgumentType.Path, Strings.Program.DataFolderOptionShort, Strings.Program.DataFolderOptionLong, DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly)),
];
private static bool ReadOptionsFromFile(TextWriter outwriter, string filename, ref Library.Utility.IFilter filter, List<string> cargs, Dictionary<string, string> options)
@@ -198,7 +198,7 @@ public class Connection
var opts = new Dictionary<string, string>();
if (settings.Key != null)
opts["settings-encryption-key"] = settings.Key.Key;
if (File.Exists(Path.Combine(DataFolderManager.GetDataFolder(true), DataFolderManager.SERVER_DATABASE_FILENAME)))
if (File.Exists(Path.Combine(DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly), DataFolderManager.SERVER_DATABASE_FILENAME)))
{
string? cfg = null;
using (var connection = Server.Program.GetDatabaseConnection(opts, true))
@@ -230,12 +230,12 @@ public class Connection
return CreateConnectionWithClient(client, accessToken);
}
}
else if (!string.IsNullOrWhiteSpace(DataFolderManager.GetDataFolder(true)))
else if (!string.IsNullOrWhiteSpace(DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly)))
{
if (console != null)
console.AppendConsoleMessage($"No database found in {DataFolderManager.GetDataFolder(true)}");
console.AppendConsoleMessage($"No database found in {DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly)}");
else
Console.WriteLine($"No database found in {DataFolderManager.GetDataFolder(true)}");
Console.WriteLine($"No database found in {DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly)}");
}
}
catch (Exception ex)
+1 -1
View File
@@ -179,7 +179,7 @@ public sealed record Settings(
File.WriteAllText(SettingsFile, JsonSerializer.Serialize(LoadSettings(SettingsFile, thisKey)
.Where(x => x.HostUrl != HostUrl)
.Append(new PersistedSettings(RefreshToken, HostUrl, DataFolderManager.GetDataFolder(false))) // Explicit false for clarity
.Append(new PersistedSettings(RefreshToken, HostUrl, DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ReadWritePermissionSet)))
.Select(x => x with
{
RefreshToken = string.IsNullOrWhiteSpace(x.RefreshToken) || thisKey == null
@@ -45,7 +45,7 @@ public class SettingsBinder : BinderBase<Settings>
/// <summary>
/// The server datafolder option.
/// </summary>
public static readonly Option<DirectoryInfo?> serverDatafolderOption = new Option<DirectoryInfo?>($"--{DataFolderManager.SERVER_DATAFOLDER_OPTION}", description: "The server datafolder to use for locating the database and storing configuration", getDefaultValue: () => new DirectoryInfo(DataFolderManager.GetDataFolder(true)));
public static readonly Option<DirectoryInfo?> serverDatafolderOption = new Option<DirectoryInfo?>($"--{DataFolderManager.SERVER_DATAFOLDER_OPTION}", description: "The server datafolder to use for locating the database and storing configuration", getDefaultValue: () => new DirectoryInfo(DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly)));
/// <summary>
/// The server portable mode option.
/// </summary>
@@ -179,7 +179,7 @@ namespace Duplicati.GUI.TrayIcon
}
else if (Utility.ParseBoolOption(options, READCONFIGFROMDB_OPTION))
{
if (File.Exists(Path.Combine(DataFolderManager.GetDataFolder(), DataFolderManager.SERVER_DATABASE_FILENAME)))
if (File.Exists(Path.Combine(DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ReadWritePermissionSet), DataFolderManager.SERVER_DATABASE_FILENAME)))
{
passwordSource = PasswordSource.Database;
databaseConnection = Server.Program.GetDatabaseConnection(options, true);
@@ -51,7 +51,7 @@ public static class DataFolderLocator
public static string GetDefaultStorageFolder(string targetfilename, bool autoCreate, bool readOnly = false)
{
var folder = DataFolderManager.OVERRIDEN_DATAFOLDER
? DataFolderManager.GetDataFolder(true)
? DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly)
: GetDefaultStorageFolderInternal(targetfilename, AutoUpdateSettings.AppName);
if (SystemIO.IO_OS.DirectoryExists(folder))
@@ -34,6 +34,11 @@ namespace Duplicati.Library.AutoUpdater;
/// </summary>
public static class DataFolderManager
{
public enum AccessMode
{
ProbeOnly,
ReadWritePermissionSet
}
/// <summary>
/// The log tag for this class
/// </summary>
@@ -86,7 +91,7 @@ public static class DataFolderManager
/// <summary>
/// The folder where the machine id is placed
/// </summary>
public static string GetDataFolder(bool probeOnly = false)
public static string GetDataFolder(AccessMode mode)
{
// Trigger portable mode, if the flag is set
PORTABLE_MODE = ParseBoolSlim(ExtractOptionSlim(PORTABLE_MODE_OPTION));
@@ -129,7 +134,7 @@ public static class DataFolderManager
if (!File.Exists(Path.Combine(dataFolder, Util.InsecurePermissionsMarkerFile)))
try
{
if (!probeOnly)
if (mode == AccessMode.ReadWritePermissionSet)
SystemIO.IO_OS.DirectorySetPermissionUserRWOnly(dataFolder);
}
catch (Exception ex)
@@ -142,7 +147,7 @@ public static class DataFolderManager
Directory.CreateDirectory(dataFolder);
try
{
if (!probeOnly)
if (mode == AccessMode.ReadWritePermissionSet)
SystemIO.IO_OS.DirectorySetPermissionUserRWOnly(dataFolder);
}
catch (Exception ex)
@@ -151,7 +156,7 @@ public static class DataFolderManager
}
}
if (!probeOnly && !File.Exists(Path.Combine(dataFolder, INSTALL_FILE)))
if (mode == AccessMode.ReadWritePermissionSet && !File.Exists(Path.Combine(dataFolder, INSTALL_FILE)))
{
// In case there was already a machine id file from 2.0.8.1 or older, copy it to the new location
if (File.Exists(Path.Combine(dataFolder, "updates", INSTALL_FILE)))
@@ -160,7 +165,7 @@ public static class DataFolderManager
File.WriteAllText(Path.Combine(dataFolder, INSTALL_FILE), AutoUpdateSettings.UpdateInstallFileText);
}
if (!probeOnly && !File.Exists(Path.Combine(dataFolder, MACHINE_FILE)))
if (mode == AccessMode.ReadWritePermissionSet && !File.Exists(Path.Combine(dataFolder, MACHINE_FILE)))
File.WriteAllText(Path.Combine(dataFolder, MACHINE_FILE), AutoUpdateSettings.UpdateMachineFileText(InstallID));
return dataFolder;
@@ -233,7 +238,7 @@ public static class DataFolderManager
/// </summary>
private static readonly Lazy<string> _installID = new(() =>
{
try { return File.ReadAllLines(Path.Combine(GetDataFolder(true), INSTALL_FILE)).FirstOrDefault(x => !string.IsNullOrWhiteSpace(x))?.Trim() ?? ""; }
try { return File.ReadAllLines(Path.Combine(GetDataFolder(DataFolderManager.AccessMode.ProbeOnly), INSTALL_FILE)).FirstOrDefault(x => !string.IsNullOrWhiteSpace(x))?.Trim() ?? ""; }
catch { }
return string.Empty;
@@ -250,7 +255,7 @@ public static class DataFolderManager
private static readonly Lazy<string> _machineID = new(() =>
{
string? machinedId = null;
try { machinedId = File.ReadAllLines(Path.Combine(GetDataFolder(true), MACHINE_FILE)).FirstOrDefault(x => !string.IsNullOrWhiteSpace(x))?.Trim() ?? ""; }
try { machinedId = File.ReadAllLines(Path.Combine(GetDataFolder(DataFolderManager.AccessMode.ProbeOnly), MACHINE_FILE)).FirstOrDefault(x => !string.IsNullOrWhiteSpace(x))?.Trim() ?? ""; }
catch { }
return string.IsNullOrWhiteSpace(machinedId)
@@ -109,7 +109,7 @@ public static class PreloadSettingsLoader
// User-context path for preload settings,
// the same default path as where other data is stored
Path.Combine(DataFolderManager.GetDataFolder(true), FILE_NAME),
Path.Combine(DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly), FILE_NAME),
}
.Concat(PortablePreloadPaths)
.Where(x => !string.IsNullOrEmpty(x))
+1 -1
View File
@@ -117,7 +117,7 @@ namespace Duplicati.Library.AutoUpdater
Console.WriteLine("{0} - Choose different channel than the default {1}, valid settings: {2}", string.Format(AutoUpdateSettings.UPDATECHANNEL_ENVNAME_TEMPLATE, AutoUpdateSettings.AppName), AutoUpdater.AutoUpdateSettings.DefaultUpdateChannel, string.Join(",", Enum.GetNames(typeof(ReleaseType)).Where(x => x != ReleaseType.Unknown.ToString())));
Console.WriteLine();
Console.WriteLine("Updates are downloaded from: {0}", string.Join(";", AutoUpdateSettings.URLs));
Console.WriteLine("Settings and configuration files are placed in: {0}", DataFolderManager.GetDataFolder(true));
Console.WriteLine("Settings and configuration files are placed in: {0}", DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly));
Console.WriteLine("This version is \"{0}\" ({1}) and is installed in: {2}", UpdaterManager.SelfVersion.Displayname, UpdaterManager.SelfVersion.Version, UpdaterManager.INSTALLATIONDIR);
Console.WriteLine();
}
@@ -24,6 +24,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using System.Threading.Tasks;
using Duplicati.Library.AutoUpdater;
namespace Duplicati.Library.Main.Operation
{
@@ -37,7 +38,7 @@ namespace Duplicati.Library.Main.Operation
yield return string.Format("Duplicati: {0} ({1})", Library.Utility.Utility.getEntryAssembly().FullName, System.Reflection.Assembly.GetExecutingAssembly().FullName);
yield return string.Format("Autoupdate urls: {0}", string.Join(";", AutoUpdater.AutoUpdateSettings.URLs));
yield return string.Format("Default data folder: {0}", AutoUpdater.DataFolderManager.GetDataFolder(true));
yield return string.Format("Default data folder: {0}", AutoUpdater.DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly));
yield return string.Format("Install folder: {0}", AutoUpdater.UpdaterManager.INSTALLATIONDIR);
yield return string.Format("Version name: \"{0}\" ({1})", AutoUpdater.UpdaterManager.SelfVersion.Displayname, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);
yield return string.Format("Current Version folder {0}", System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
+2 -2
View File
@@ -793,7 +793,7 @@ namespace Duplicati.Server
public static Connection GetDatabaseConnection(Dictionary<string, string> commandlineOptions, bool silentConsole)
{
DataFolder = DataFolderManager.GetDataFolder();
DataFolder = DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ReadWritePermissionSet);
// Emit a warning if the database is stored in the Windows folder
if (Util.IsPathUnderWindowsFolder(DataFolder))
@@ -1015,7 +1015,7 @@ namespace Duplicati.Server
new CommandLineArgument(PING_PONG_KEEPALIVE_OPTION, CommandLineArgument.ArgumentType.Boolean, Strings.Program.PingpongkeepaliveShort, Strings.Program.PingpongkeepaliveLong),
new CommandLineArgument(DISABLE_UPDATE_CHECK_OPTION, CommandLineArgument.ArgumentType.Boolean, Strings.Program.DisableupdatecheckShort, Strings.Program.DisableupdatecheckLong),
new CommandLineArgument(LOG_RETENTION_OPTION, CommandLineArgument.ArgumentType.Timespan, Strings.Program.LogretentionShort, Strings.Program.LogretentionLong, DEFAULT_LOG_RETENTION),
new CommandLineArgument(DataFolderManager.SERVER_DATAFOLDER_OPTION, CommandLineArgument.ArgumentType.Path, Strings.Program.ServerdatafolderShort, Strings.Program.ServerdatafolderLong(DataFolderManager.GetDataFolder()), DataFolderManager.GetDataFolder()),
new CommandLineArgument(DataFolderManager.SERVER_DATAFOLDER_OPTION, CommandLineArgument.ArgumentType.Path, Strings.Program.ServerdatafolderShort, Strings.Program.ServerdatafolderLong(DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly)), DataFolderManager.GetDataFolder(DataFolderManager.AccessMode.ProbeOnly)),
new CommandLineArgument(DISABLE_DB_ENCRYPTION_OPTION, CommandLineArgument.ArgumentType.Boolean, Strings.Program.DisabledbencryptionShort, Strings.Program.DisabledbencryptionLong),
new CommandLineArgument(REQUIRE_DB_ENCRYPTION_KEY_OPTION, CommandLineArgument.ArgumentType.Boolean, Strings.Program.RequiredbencryptionShort, Strings.Program.RequiredbencryptionLong),
new CommandLineArgument(SETTINGS_ENCRYPTION_KEY_OPTION, CommandLineArgument.ArgumentType.Password, Strings.Program.SettingsencryptionkeyShort, Strings.Program.SettingsencryptionkeyLong(EncryptedFieldHelper.ENVIROMENT_VARIABLE_NAME)),