diff --git a/Duplicati.sln b/Duplicati.sln
index 2a1905483..ce41a69f4 100644
--- a/Duplicati.sln
+++ b/Duplicati.sln
@@ -109,7 +109,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net8", "net8", "{6B46F6B1-1
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.AutoUpdater", "Executables\net8\Duplicati.CommandLine.AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{95B7DD83-2C5A-4F1E-8EA7-39654B2B236A}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Service", "Executables\net8\Duplicati_Service\Duplicati.Service.csproj", "{34149709-F3ED-4FB5-A087-43EB195C948B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Service", "Executables\net8\Duplicati.Service\Duplicati.Service.csproj", "{34149709-F3ED-4FB5-A087-43EB195C948B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.BackendTester", "Executables\net8\Duplicati.CommandLine.BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{2F1C0C8D-5C15-4BC0-811F-87F2C98D9790}"
EndProject
@@ -148,6 +148,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.RestAPI",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.AliyunOSS", "Duplicati\Library\Backend\AliyunOSS\Duplicati.Library.Backend.AliyunOSS.csproj", "{4EB3DABC-D412-4C12-8876-41A1427A389E}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.SharpAESCrypt", "Executables\net8\Duplicati.CommandLine.SharpAESCrypt\Duplicati.CommandLine.SharpAESCrypt.csproj", "{FE6FD36C-E171-4599-8D55-62DA579C0864}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.Snapshots", "Executables\net8\Duplicati.CommandLine.Snapshots\Duplicati.CommandLine.Snapshots.csproj", "{0364E724-1929-445E-9145-90A70B01DDC0}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -414,6 +418,14 @@ Global
{C1D4D665-23A3-4216-9CD1-D67AE9AAAA4C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C1D4D665-23A3-4216-9CD1-D67AE9AAAA4C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C1D4D665-23A3-4216-9CD1-D67AE9AAAA4C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FE6FD36C-E171-4599-8D55-62DA579C0864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FE6FD36C-E171-4599-8D55-62DA579C0864}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FE6FD36C-E171-4599-8D55-62DA579C0864}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FE6FD36C-E171-4599-8D55-62DA579C0864}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0364E724-1929-445E-9145-90A70B01DDC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0364E724-1929-445E-9145-90A70B01DDC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0364E724-1929-445E-9145-90A70B01DDC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0364E724-1929-445E-9145-90A70B01DDC0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -467,6 +479,8 @@ Global
{0F5A1F4E-25FA-4D02-920D-CA2138498081} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3}
{6B594D23-B629-465C-B799-70EE9E56C218} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4}
{D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} = {FA88A246-EF8E-46E3-90AF-539B8C0A6ADE}
+ {FE6FD36C-E171-4599-8D55-62DA579C0864} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3}
+ {0364E724-1929-445E-9145-90A70B01DDC0} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8B40BAFE-D862-4397-9495-8F5EAF5CE80C}
diff --git a/Duplicati/Library/AutoUpdater/PackageHelper.cs b/Duplicati/Library/AutoUpdater/PackageHelper.cs
index dd6ca9c9a..3599fe81a 100644
--- a/Duplicati/Library/AutoUpdater/PackageHelper.cs
+++ b/Duplicati/Library/AutoUpdater/PackageHelper.cs
@@ -48,7 +48,16 @@ namespace Duplicati.Library.AutoUpdater
///
/// The backend testing tool
///
- BackendTester
+ BackendTester,
+ ///
+ /// The SharpAESCrypt tool
+ ///
+ SharpAESCrypt,
+ ///
+ /// The snapshot tool
+ ///
+ Snapshots
+
}
///
@@ -66,8 +75,10 @@ namespace Duplicati.Library.AutoUpdater
NamedExecutable.Server => Platform.IsClientWindows ? "Duplicati.Server.exe" : "duplicati-server",
NamedExecutable.WindowsService => "Duplicati.WindowsServer.exe",
NamedExecutable.BackendTool => Platform.IsClientWindows ? "Duplicati.CommandLine.BackendTool.exe" : "duplicati-backend-tool",
- NamedExecutable.RecoveryTool => Platform.IsClientWindows ? "Duplicati.Command.RecoveryTool.exe" : "duplicati-recovery-tool",
+ NamedExecutable.RecoveryTool => Platform.IsClientWindows ? "Duplicati.CommandLine.RecoveryTool.exe" : "duplicati-recovery-tool",
NamedExecutable.BackendTester => Platform.IsClientWindows ? "Duplicati.CommandLine.BackendTester.exe" : "duplicati-backend-tester",
+ NamedExecutable.SharpAESCrypt => Platform.IsClientWindows ? "Duplicati.CommandLine.SharpAESCrypt.exe" : "duplicati-aescrypt",
+ NamedExecutable.Snapshots => Platform.IsClientWindows ? "Duplicati.CommandLine.Snapshots.exe" : "duplicati-snapshots",
_ => throw new ArgumentException($"Named executable not known: {exe}", nameof(exe))
};
diff --git a/Duplicati/Library/Snapshots/Program.cs b/Duplicati/Library/Snapshots/Program.cs
index 94081106a..9e9f7c09b 100644
--- a/Duplicati/Library/Snapshots/Program.cs
+++ b/Duplicati/Library/Snapshots/Program.cs
@@ -1,32 +1,31 @@
-// Copyright (C) 2024, The Duplicati Team
-// https://duplicati.com, hello@duplicati.com
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the "Software"),
-// to deal in the Software without restriction, including without limitation
-// the rights to use, copy, modify, merge, publish, distribute, sublicense,
-// and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
+// Copyright (C) 2024, The Duplicati Team
+// https://duplicati.com, hello@duplicati.com
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
-using System.Text;
using Duplicati.Library.Common;
namespace Duplicati.Library.Snapshots
{
- static class Program
+ public static class Program
{
private static Dictionary ExtractOptions(List args)
{
@@ -68,7 +67,7 @@ namespace Duplicati.Library.Snapshots
{
List args = new List(_args);
Dictionary options = ExtractOptions(args);
-
+
if (args.Count == 0)
args = new List { System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) };
diff --git a/Executables/net8/Duplicati.CommandLine.SharpAESCrypt/Duplicati.CommandLine.SharpAESCrypt.csproj b/Executables/net8/Duplicati.CommandLine.SharpAESCrypt/Duplicati.CommandLine.SharpAESCrypt.csproj
new file mode 100644
index 000000000..d01f61af3
--- /dev/null
+++ b/Executables/net8/Duplicati.CommandLine.SharpAESCrypt/Duplicati.CommandLine.SharpAESCrypt.csproj
@@ -0,0 +1,21 @@
+
+
+
+ Exe
+ net8.0
+ The Server SharpAESCrypt implementation
+ Duplicati.CommandLine.SharpAESCrypt
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Executables/net8/Duplicati.CommandLine.SharpAESCrypt/Program.cs b/Executables/net8/Duplicati.CommandLine.SharpAESCrypt/Program.cs
new file mode 100644
index 000000000..e9ccb42d9
--- /dev/null
+++ b/Executables/net8/Duplicati.CommandLine.SharpAESCrypt/Program.cs
@@ -0,0 +1,9 @@
+namespace Duplicati.Server.Net8
+{
+ // Wrapper class to keep code independent
+ public static class Program
+ {
+ public static void Main(string[] args)
+ => SharpAESCrypt.SharpAESCrypt.CommandLineMain(args);
+ }
+}
\ No newline at end of file
diff --git a/Executables/net8/Duplicati.CommandLine.Snapshots/Duplicati.CommandLine.Snapshots.csproj b/Executables/net8/Duplicati.CommandLine.Snapshots/Duplicati.CommandLine.Snapshots.csproj
new file mode 100644
index 000000000..6cd6b7c6e
--- /dev/null
+++ b/Executables/net8/Duplicati.CommandLine.Snapshots/Duplicati.CommandLine.Snapshots.csproj
@@ -0,0 +1,21 @@
+
+
+
+ Exe
+ net8.0
+ The Server Snapshots implementation
+ Duplicati.CommandLine.Snapshots
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Executables/net8/Duplicati.CommandLine.Snapshots/Program.cs b/Executables/net8/Duplicati.CommandLine.Snapshots/Program.cs
new file mode 100644
index 000000000..65d221b73
--- /dev/null
+++ b/Executables/net8/Duplicati.CommandLine.Snapshots/Program.cs
@@ -0,0 +1,9 @@
+namespace Duplicati.Server.Net8
+{
+ // Wrapper class to keep code independent
+ public static class Program
+ {
+ public static void Main(string[] args)
+ => Duplicati.Library.Snapshots.Program.Main(args);
+ }
+}
\ No newline at end of file
diff --git a/Executables/net8/Duplicati_Service/Duplicati.Service.csproj b/Executables/net8/Duplicati.Service/Duplicati.Service.csproj
similarity index 100%
rename from Executables/net8/Duplicati_Service/Duplicati.Service.csproj
rename to Executables/net8/Duplicati.Service/Duplicati.Service.csproj
diff --git a/Executables/net8/Duplicati_Service/Program.cs b/Executables/net8/Duplicati.Service/Program.cs
similarity index 100%
rename from Executables/net8/Duplicati_Service/Program.cs
rename to Executables/net8/Duplicati.Service/Program.cs
diff --git a/ReleaseBuilder/Build/Command.cs b/ReleaseBuilder/Build/Command.cs
index ffe23c73a..82f35dad5 100644
--- a/ReleaseBuilder/Build/Command.cs
+++ b/ReleaseBuilder/Build/Command.cs
@@ -43,6 +43,8 @@ public static partial class Command
{ "Duplicati.CommandLine.BackendTool", "duplicati-backend-tool" },
{ "Duplicati.CommandLine.RecoveryTool", "duplicati-recovery-tool" },
{ "Duplicati.CommandLine.AutoUpdater", "duplicati-autoupdater" },
+ { "Duplicati.CommandLine.SharpAESCrypt", "duplicati-aescrypt" },
+ { "Duplicati.CommandLine.Snapshots", "duplicati-snapshots" },
{ "Duplicati.CommandLine.ConfigurationImporter", "duplicati-configuration-importer" },
{ "Duplicati.CommandLine", "duplicati-cli" },
{ "Duplicati.Server", "duplicati-server"},