Removed unused files.
Moved installer files into the ReleaseBuilder
This commit is contained in:
@@ -186,9 +186,9 @@ public static partial class Command
|
||||
EnvHelper.CopyDirectory(buildDir, binDir, recursive: true);
|
||||
|
||||
// Patch the plist and place the icon from the resources
|
||||
var installerDir = Path.Combine(baseDir, "Installer", "MacOS");
|
||||
var resourcesDir = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "MacOS");
|
||||
|
||||
var plist = File.ReadAllText(Path.Combine(installerDir, "app-resources", "Info.plist"))
|
||||
var plist = File.ReadAllText(Path.Combine(resourcesDir, "app-resources", "Info.plist"))
|
||||
.Replace("!LONG_VERSION!", rtcfg.ReleaseInfo.ReleaseName)
|
||||
.Replace("!SHORT_VERSION!", rtcfg.ReleaseInfo.Version.ToString());
|
||||
|
||||
@@ -198,21 +198,21 @@ public static partial class Command
|
||||
);
|
||||
|
||||
File.Copy(
|
||||
Path.Combine(installerDir, "app-resources", "Duplicati.icns"),
|
||||
Path.Combine(resourcesDir, "app-resources", "Duplicati.icns"),
|
||||
Path.Combine(tmpApp, "Contents", "Resources", "Duplicati.icns"),
|
||||
overwrite: true
|
||||
);
|
||||
|
||||
// Inject the launch agent
|
||||
EnvHelper.CopyDirectory(
|
||||
Path.Combine(installerDir, "daemon"),
|
||||
Path.Combine(resourcesDir, "daemon"),
|
||||
Path.Combine(tmpApp, "Contents", "Resources"),
|
||||
recursive: true
|
||||
);
|
||||
|
||||
// Inject the uninstall.sh script
|
||||
File.Copy(
|
||||
Path.Combine(installerDir, "uninstall.sh"),
|
||||
Path.Combine(resourcesDir, "uninstall.sh"),
|
||||
Path.Combine(tmpApp, "Contents", "MacOS", "uninstall.sh"),
|
||||
overwrite: true
|
||||
);
|
||||
@@ -239,7 +239,7 @@ public static partial class Command
|
||||
.Distinct()
|
||||
.ToList();
|
||||
|
||||
var entitlementFile = Path.Combine(installerDir, "Entitlements.plist");
|
||||
var entitlementFile = Path.Combine(resourcesDir, "Entitlements.plist");
|
||||
foreach (var f in signtargets)
|
||||
await rtcfg.Codesign(f, entitlementFile);
|
||||
|
||||
|
||||
@@ -240,8 +240,7 @@ public static partial class Command
|
||||
/// <returns>A task representing the asynchronous operation.</returns>
|
||||
static async Task BuildMsiPackage(string baseDir, string buildRoot, string msiFile, PackageTarget target, RuntimeConfig rtcfg)
|
||||
{
|
||||
var installerDir = Path.Combine(baseDir, "Installer", "Windows");
|
||||
var binFiles = Path.Combine(installerDir, "binfiles.wxs");
|
||||
var resourcesDir = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "Windows");
|
||||
|
||||
var buildTmp = Path.Combine(buildRoot, "tmp-msi");
|
||||
if (Directory.Exists(buildTmp))
|
||||
@@ -254,6 +253,10 @@ public static partial class Command
|
||||
if (!sourceFiles.EndsWith(Path.DirectorySeparatorChar))
|
||||
sourceFiles += Path.DirectorySeparatorChar;
|
||||
|
||||
var binFiles = Path.Combine(resourcesDir, "binfiles.txt");
|
||||
if (File.Exists(binFiles))
|
||||
File.Delete(binFiles);
|
||||
|
||||
File.WriteAllText(binFiles, WixHeatBuilder.CreateWixFilelist(sourceFiles));
|
||||
|
||||
await ProcessHelper.Execute([
|
||||
@@ -261,9 +264,9 @@ public static partial class Command
|
||||
"--define", $"HarvestPath={sourceFiles}",
|
||||
"--arch", target.ArchString,
|
||||
"--output", msiFile,
|
||||
Path.Combine(installerDir, "Shortcuts.wxs"),
|
||||
Path.Combine(resourcesDir, "Shortcuts.wxs"),
|
||||
binFiles,
|
||||
Path.Combine(installerDir, "Duplicati.wxs")
|
||||
Path.Combine(resourcesDir, "Duplicati.wxs")
|
||||
], workingDirectory: buildRoot);
|
||||
|
||||
if (rtcfg.UseAuthenticodeSigning)
|
||||
@@ -320,8 +323,8 @@ public static partial class Command
|
||||
}
|
||||
Directory.CreateDirectory(mountDir);
|
||||
|
||||
var installerDir = Path.Combine(baseDir, "Installer", "MacOS");
|
||||
var compressedDmg = Path.Combine(installerDir, "template.dmg.bz2");
|
||||
var resourcesDir = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "MacOS");
|
||||
var compressedDmg = Path.Combine(resourcesDir, "template.dmg.bz2");
|
||||
if (!File.Exists(compressedDmg))
|
||||
throw new FileNotFoundException($"Compressed dmg template file not found: {compressedDmg}");
|
||||
|
||||
@@ -358,7 +361,7 @@ public static partial class Command
|
||||
|
||||
// Place the prepared folder
|
||||
EnvHelper.CopyDirectory(Path.Combine(buildRoot, $"{target.BuildTargetString}-{rtcfg.MacOSAppName}"), appFolder, recursive: true);
|
||||
await PrepareAndReSignAppBundle(appFolder, installerDir, target, rtcfg);
|
||||
await PrepareAndReSignAppBundle(appFolder, resourcesDir, target, rtcfg);
|
||||
|
||||
// Set permissions inside DMG file
|
||||
if (!OperatingSystem.IsWindows())
|
||||
@@ -375,7 +378,7 @@ public static partial class Command
|
||||
Directory.Delete(mountDir, false);
|
||||
|
||||
if (rtcfg.UseCodeSignSigning)
|
||||
await rtcfg.Codesign(dmgFile, Path.Combine(installerDir, "Entitlements.plist"));
|
||||
await rtcfg.Codesign(dmgFile, Path.Combine(resourcesDir, "Entitlements.plist"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -394,7 +397,7 @@ public static partial class Command
|
||||
Directory.Delete(tmpFolder, true);
|
||||
Directory.CreateDirectory(tmpFolder);
|
||||
|
||||
var installerDir = Path.Combine(baseDir, "Installer", "MacOS");
|
||||
var installerDir = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "MacOS");
|
||||
|
||||
var appFolder = Path.Combine(tmpFolder, rtcfg.MacOSAppName);
|
||||
if (Directory.Exists(appFolder))
|
||||
@@ -527,7 +530,7 @@ public static partial class Command
|
||||
}
|
||||
|
||||
// Copy debian files
|
||||
var installerDir = Path.Combine(baseDir, "Installer", "debian");
|
||||
var resourcesDir = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "debian");
|
||||
|
||||
// Write in the release notes
|
||||
if (!string.IsNullOrEmpty(rtcfg.ChangelogNews))
|
||||
@@ -536,7 +539,7 @@ public static partial class Command
|
||||
// Write a custom changelog file
|
||||
File.WriteAllText(
|
||||
Path.Combine(pkgroot, "DEBIAN", "changelog"),
|
||||
File.ReadAllText(Path.Combine(installerDir, "changelog.template.txt"))
|
||||
File.ReadAllText(Path.Combine(resourcesDir, "changelog.template.txt"))
|
||||
.Replace("%VERSION%", rtcfg.ReleaseInfo.Version.ToString())
|
||||
.Replace("%DATE%", DateTime.UtcNow.ToString("ddd, dd MMM yyyy HH:mm:ss +0000", CultureInfo.InvariantCulture))
|
||||
);
|
||||
@@ -554,7 +557,7 @@ public static partial class Command
|
||||
// Write a custom control file
|
||||
File.WriteAllText(
|
||||
Path.Combine(pkgroot, "DEBIAN", "control"),
|
||||
File.ReadAllText(Path.Combine(installerDir, "control.template.txt"))
|
||||
File.ReadAllText(Path.Combine(resourcesDir, "control.template.txt"))
|
||||
.Replace("%VERSION%", rtcfg.ReleaseInfo.Version.ToString())
|
||||
.Replace("%ARCH%", debArchString)
|
||||
.Replace("%DEPENDS%", string.Join(", ", target.Interface == InterfaceType.GUI
|
||||
@@ -563,14 +566,14 @@ public static partial class Command
|
||||
);
|
||||
|
||||
// Install various helper files
|
||||
var sharedDir = Path.Combine(baseDir, "Installer", "shared");
|
||||
var sharedDir = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "shared");
|
||||
var supportFiles = new List<(string Source, string Destination)>{
|
||||
(
|
||||
Path.Combine(installerDir, "systemd", "duplicati.default"),
|
||||
Path.Combine(resourcesDir, "systemd", "duplicati.default"),
|
||||
Path.Combine(pkgroot, "etc", "default", "duplicati")
|
||||
),
|
||||
(
|
||||
Path.Combine(installerDir, "systemd", "duplicati.service"),
|
||||
Path.Combine(resourcesDir, "systemd", "duplicati.service"),
|
||||
Path.Combine(pkgroot, "lib", "systemd", "system", "duplicati.service")
|
||||
),
|
||||
(
|
||||
@@ -600,7 +603,7 @@ public static partial class Command
|
||||
|
||||
// Copy the Docker build file
|
||||
File.Copy(
|
||||
Path.Combine(installerDir, "Dockerfile.build"),
|
||||
Path.Combine(resourcesDir, "Dockerfile.build"),
|
||||
Path.Combine(debroot, "Dockerfile"),
|
||||
true
|
||||
);
|
||||
@@ -641,7 +644,7 @@ public static partial class Command
|
||||
/// <returns>A task representing the asynchronous operation.</returns>
|
||||
static async Task BuildRpmPackage(string baseDir, string buildRoot, string rpmFile, PackageTarget target, RuntimeConfig rtcfg)
|
||||
{
|
||||
var installerDir = Path.Combine(baseDir, "Installer", "fedora");
|
||||
var resourcesDir = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "fedora");
|
||||
var tmpbuild = Path.Combine(buildRoot, "tmp-fedora");
|
||||
if (Directory.Exists(tmpbuild))
|
||||
Directory.Delete(tmpbuild, true);
|
||||
@@ -667,13 +670,13 @@ public static partial class Command
|
||||
File.Move(tarfile, Path.Combine(sources, Path.GetFileName(tarfile)));
|
||||
|
||||
// Move in extra files for building
|
||||
var sharedDir = Path.Combine(baseDir, "Installer", "shared");
|
||||
var sharedDir = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "shared");
|
||||
File.Copy(Path.Combine(sharedDir, "pixmaps", "duplicati.xpm"), Path.Combine(sources, "duplicati.xpm"));
|
||||
File.Copy(Path.Combine(sharedDir, "pixmaps", "duplicati.png"), Path.Combine(sources, "duplicati.png"));
|
||||
File.Copy(Path.Combine(sharedDir, "desktop", "duplicati.desktop"), Path.Combine(sources, "duplicati.desktop"));
|
||||
File.Copy(Path.Combine(installerDir, "systemd", "duplicati.service"), Path.Combine(sources, "duplicati.service"));
|
||||
File.Copy(Path.Combine(installerDir, "systemd", "duplicati.default"), Path.Combine(sources, "duplicati.default"));
|
||||
File.Copy(Path.Combine(installerDir, "duplicati-install-recursive.sh"), Path.Combine(sources, "duplicati-install-recursive.sh"));
|
||||
File.Copy(Path.Combine(resourcesDir, "systemd", "duplicati.service"), Path.Combine(sources, "duplicati.service"));
|
||||
File.Copy(Path.Combine(resourcesDir, "systemd", "duplicati.default"), Path.Combine(sources, "duplicati.default"));
|
||||
File.Copy(Path.Combine(resourcesDir, "duplicati-install-recursive.sh"), Path.Combine(sources, "duplicati-install-recursive.sh"));
|
||||
|
||||
var executables = ExecutableRenames.AsEnumerable();
|
||||
if (target.Interface == InterfaceType.Cli)
|
||||
@@ -682,7 +685,7 @@ public static partial class Command
|
||||
// Write custom script to install executable files
|
||||
File.WriteAllLines(
|
||||
Path.Combine(sources, "duplicati-install-binaries.sh"),
|
||||
File.ReadAllLines(Path.Combine(installerDir, "duplicati-install-binaries.sh"))
|
||||
File.ReadAllLines(Path.Combine(resourcesDir, "duplicati-install-binaries.sh"))
|
||||
.SelectMany(line =>
|
||||
{
|
||||
if (line.StartsWith("REPL: "))
|
||||
@@ -701,7 +704,7 @@ public static partial class Command
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(sources, "duplicati.spec"),
|
||||
File.ReadAllText(Path.Combine(installerDir, "duplicati.spec.template.txt"))
|
||||
File.ReadAllText(Path.Combine(resourcesDir, "duplicati.spec.template.txt"))
|
||||
.Replace("%BUILDDATE%", DateTime.UtcNow.ToString("yyyyMMdd"))
|
||||
.Replace("%BUILDVERSION%", rtcfg.ReleaseInfo.Version.ToString())
|
||||
.Replace("%BUILDTAG%", rtcfg.ReleaseInfo.Channel.ToString().ToLowerInvariant())
|
||||
@@ -715,7 +718,7 @@ public static partial class Command
|
||||
|
||||
// Install the Docker build file
|
||||
File.Copy(
|
||||
Path.Combine(installerDir, "Dockerfile.build"),
|
||||
Path.Combine(resourcesDir, "Dockerfile.build"),
|
||||
Path.Combine(tmpbuild, "Dockerfile"),
|
||||
true
|
||||
);
|
||||
@@ -731,7 +734,7 @@ public static partial class Command
|
||||
// This is required because rpmbuild reads file mode
|
||||
// in a way that is not compatible with Docker desktop bind mounts
|
||||
File.Copy(
|
||||
Path.Combine(installerDir, "inside-docker.sh"),
|
||||
Path.Combine(resourcesDir, "inside-docker.sh"),
|
||||
Path.Combine(tmpbuild, "inside-docker.sh"),
|
||||
true
|
||||
);
|
||||
@@ -768,7 +771,7 @@ public static partial class Command
|
||||
/// <returns>A task representing the asynchronous operation.</returns>
|
||||
private static async Task BuildDockerImages(string baseDir, string buildRoot, IEnumerable<PackageTarget> targets, RuntimeConfig rtcfg)
|
||||
{
|
||||
var installerDir = Path.Combine(baseDir, "Installer", "Docker");
|
||||
var resourcesDir = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "Docker");
|
||||
var dockerArchs = targets.Select(target => target switch
|
||||
{
|
||||
PackageTarget { Arch: ArchType.x64, OS: OSType.Linux, Interface: InterfaceType.Cli } => "linux/amd64",
|
||||
@@ -820,7 +823,7 @@ public static partial class Command
|
||||
"--platform", string.Join(",", dockerArchs),
|
||||
"--build-arg", $"VERSION={rtcfg.ReleaseInfo.Version}",
|
||||
"--build-arg", $"CHANNEL={rtcfg.ReleaseInfo.Channel.ToString().ToLowerInvariant()}",
|
||||
"--file", Path.Combine(installerDir, "Dockerfile"),
|
||||
"--file", Path.Combine(resourcesDir, "Dockerfile"),
|
||||
"--output", $"type=image,push={rtcfg.PushToDocker.ToString().ToLowerInvariant()}",
|
||||
"."
|
||||
]);
|
||||
|
||||
@@ -18,7 +18,7 @@ public static partial class Command
|
||||
// Add modified files
|
||||
await ProcessHelper.Execute(new[] {
|
||||
"git", "add",
|
||||
"Updates/build_version.txt",
|
||||
"ReleaseBuilder/build_version.txt",
|
||||
"changelog.txt"
|
||||
}, workingDirectory: baseDir);
|
||||
|
||||
|
||||
@@ -345,7 +345,7 @@ public static partial class Command
|
||||
}
|
||||
|
||||
var baseDir = Path.GetDirectoryName(input.SolutionFile.FullName) ?? throw new Exception("Path to solution file was invalid");
|
||||
var versionFilePath = Path.Combine(baseDir, "Updates", "build_version.txt");
|
||||
var versionFilePath = Path.Combine(baseDir, "ReleaseBuilder", "build_version.txt");
|
||||
if (!File.Exists(versionFilePath))
|
||||
throw new FileNotFoundException($"Version file not found: {versionFilePath}");
|
||||
|
||||
@@ -596,7 +596,7 @@ public static partial class Command
|
||||
regex.Replace(File.ReadAllText(file), $"?v={releaseInfo.Version}")
|
||||
);
|
||||
|
||||
var wixFile = Path.Combine(baseDir, "Installer", "Windows", "UpgradeData.wxi");
|
||||
var wixFile = Path.Combine(baseDir, "ReleaseBuilder", "Resources", "Windows", "UpgradeData.wxi");
|
||||
File.WriteAllText(
|
||||
wixFile,
|
||||
Regex.Replace(
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
FROM --platform=$TARGETPLATFORM debian:latest
|
||||
|
||||
RUN apt update && apt install tini
|
||||
ENTRYPOINT [ "/usr/bin/tini", "--" ]
|
||||
|
||||
RUN apt update && apt install libssl3
|
||||
|
||||
ENV XDG_CONFIG_HOME=/data
|
||||
VOLUME /data
|
||||
|
||||
ARG CHANNEL=
|
||||
ARG VERSION=
|
||||
ENV DUPLICATI_CHANNEL=${CHANNEL}
|
||||
ENV DUPLICATI_VERSION=${VERSION}
|
||||
|
||||
ARG TARGETARCH
|
||||
COPY ./${TARGETARCH} /opt/duplicati
|
||||
|
||||
EXPOSE 8200
|
||||
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
|
||||
CMD ["/opt/duplicati/duplicati-server", "--webservice-port=8200", "--webservice-interface=any"]
|
||||
@@ -0,0 +1,63 @@
|
||||
# [Duplicati](https://www.duplicati.com)
|
||||
Duplicati is a free, open source, backup client that securely stores encrypted, incremental, compressed backups on cloud storage services and remote file servers. It works with:
|
||||
|
||||
*Amazon S3, IDrive e2, OneDrive, Google Drive, Rackspace Cloud Files, Backblaze (B2), Swift / OpenStack, WebDAV, SSH (SFTP), FTP, and more!*
|
||||
|
||||
Duplicati is licensed under the MIT license and available for Windows, OSX and Linux (.NET 4.7.1+ or Mono 4.8.0+ required).
|
||||
|
||||
## Available tags
|
||||
|
||||
* `beta` - the most recent beta release
|
||||
* `experimental` - the most recent experimental release
|
||||
* `canary` - the most recent canary release
|
||||
* `latest` - an alias for `beta`
|
||||
* specific versions like `2.0.2.1_beta_2017-08-01`
|
||||
|
||||
Images for the following OS/architecture combinations are available using Docker's multi-arch support:
|
||||
|
||||
* `linux/amd64`
|
||||
* `linux/arm/v7` - 32-bit ARMv7 devices like the Raspberry Pi 2
|
||||
* `linux/arm64` - 64-bit ARMv8 devices like the Raspberry Pi 4 (when running a 64-bit OS)
|
||||
|
||||
## How to use this image
|
||||
|
||||
```console
|
||||
$ docker run -p 8200:8200 -v /some/path:/some/path duplicati/duplicati
|
||||
```
|
||||
|
||||
Then, open [http://localhost:8200](http://localhost:8200) on the host to access the Duplicati web interface and configure backups. Any host directory that you want to back up needs to be mounted into the container using the `-v` option.
|
||||
|
||||
### Preserving configuration
|
||||
|
||||
All configuration is stored in `/data` inside the container, so you can mount a volume at that path to preserve the configuration:
|
||||
|
||||
```console
|
||||
$ docker run --name=duplicati -v duplicati-data:/data duplicati/duplicati
|
||||
```
|
||||
|
||||
This allows you to delete and recreate the container without losing your configuration:
|
||||
|
||||
```console
|
||||
$ docker rm duplicati
|
||||
$ docker run --name=duplicati -v duplicati-data:/data duplicati/duplicati
|
||||
```
|
||||
|
||||
### Using Duplicati CLI
|
||||
|
||||
Run the `duplicati-cli` command to use the Duplicati command-line interface:
|
||||
|
||||
```console
|
||||
$ docker run --rm duplicati/duplicati duplicati-cli help
|
||||
See duplicati.commandline.exe help <topic> for more information.
|
||||
General: example, changelog
|
||||
...
|
||||
$ docker run --rm -v /home:/backup/home duplicati/duplicati duplicati-cli backup ssh://user@host /backup/home
|
||||
```
|
||||
|
||||
### Specifying server arguments
|
||||
|
||||
To launch the Duplicati server with additional arguments, run the `duplicati-server` command:
|
||||
|
||||
```console
|
||||
$ docker run duplicati/duplicati duplicati-server --log-level=debug
|
||||
```
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<installer-gui-script minSpecVersion="1">
|
||||
<title>Duplicati</title>
|
||||
<organization>com.duplicati</organization>
|
||||
|
||||
<license file="LICENSE.html"/>
|
||||
|
||||
<pkg-ref id="com.duplicati.app"/>
|
||||
<pkg-ref id="com.duplicati.app.daemon"/>
|
||||
|
||||
<options require-scripts="false"/>
|
||||
<choices-outline>
|
||||
<line choice="com.duplicati.app"/>
|
||||
<line choice="com.duplicati.app.daemon"/>
|
||||
</choices-outline>
|
||||
|
||||
<choice id="com.duplicati.app" title="Duplicati App" description="The main Duplicati App" start_selected="true" enabled="false" visible="false">
|
||||
<pkg-ref id="com.duplicati.app"/>
|
||||
</choice>
|
||||
|
||||
<choice id="com.duplicati.app.daemon" title="Launch at login" description="Starts Duplicati automatically when you log in" start_selected="true">
|
||||
<pkg-ref id="com.duplicati.app.daemon"/>
|
||||
</choice>
|
||||
|
||||
<pkg-ref id="com.duplicati.app" version="0" onConclusion="none">DuplicatiApp.pkg</pkg-ref>
|
||||
<pkg-ref id="com.duplicati.app.daemon" version="0" onConclusion="none">DuplicatiDaemon.pkg</pkg-ref>
|
||||
</installer-gui-script>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.automation.apple-events</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,27 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
|
||||
<body>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>duplicati</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>Duplicati.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.duplicati.app</string>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<true/>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Duplicati</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>SUBL</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>!LONG_VERSION!</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Duplicati</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>!LONG_VERSION!</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
<key>LSUIElement</key>
|
||||
<true />
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
/usr/bin/open /Applications/Duplicati.app
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
if pgrep -x "Duplicati"; then
|
||||
RES=`osascript \
|
||||
-e "set question to display dialog \"Duplicati is currently running, you should quit before installing a new version\" with title \"Duplicati is already running\" buttons {\"Stop installation\", \"Continue\"} default button 1" \
|
||||
-e "if button returned of question is equal to \"Stop installation\" then return \"STOP\""`
|
||||
if [ "$RES" == "STOP" ];
|
||||
then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
/bin/launchctl load "/Library/LaunchAgents/com.duplicati.app.launchagent.plist"
|
||||
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
if /bin/launchctl list "com.duplicati.app.launchagent" &> /dev/null; then
|
||||
/bin/launchctl unload "/Library/LaunchAgents/com.duplicati.app.launchagent.plist"
|
||||
fi
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.duplicati.app.launchagent</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/usr/bin/open</string>
|
||||
<string>/Applications/Duplicati.app</string>
|
||||
</array>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
Binary file not shown.
Executable
+17
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
if [ -d /Applications/Duplicati.app ]; then
|
||||
rm -rf /Applications/Duplicati.app
|
||||
fi
|
||||
|
||||
if /bin/launchctl list "com.duplicati.app.launchagent" &> /dev/null; then
|
||||
/bin/launchctl unload "/Library/LaunchAgents/com.duplicati.app.launchagent.plist"
|
||||
fi
|
||||
|
||||
if [ -f "/Library/LaunchAgents/com.duplicati.app.launchagent.plist" ]; then
|
||||
rm "/Library/LaunchAgents/com.duplicati.app.launchagent.plist"
|
||||
fi
|
||||
|
||||
pkgutil --forget "com.duplicati.app"
|
||||
pkgutil --forget "com.duplicati.app.daemon"
|
||||
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?include UpgradeData.wxi ?>
|
||||
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
|
||||
<!-- Various nice-to-have shorthands for x64/x32 -->
|
||||
<?if $(sys.BUILDARCH) = "x64" ?>
|
||||
<?define SystemFolder = "System64Folder" ?>
|
||||
<?define SystemFolderX86 = "SystemFolder" ?>
|
||||
<?define SoftwareKey = "Software" ?>
|
||||
<?define SoftwareKeyX86 = "Software\Wow6432Node" ?>
|
||||
<?define ProgramFilesFolder = "ProgramFiles64Folder" ?>
|
||||
<?define ProgramFilesFolderX86 = "ProgramFilesFolder" ?>
|
||||
<?else?>
|
||||
<?define SystemFolder = "SystemFolder" ?>
|
||||
<?define SystemFolderX86 = "SystemFolder" ?>
|
||||
<?define SoftwareKey = "Software" ?>
|
||||
<?define SoftwareKeyX86 = "Software" ?>
|
||||
<?define ProgramFilesFolder = "ProgramFilesFolder" ?>
|
||||
<?endif?>
|
||||
|
||||
<?define DisplayName = "Duplicati" ?>
|
||||
|
||||
<Product Id="$(var.ProductCode)" Name="$(var.DisplayName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
|
||||
<Package InstallerVersion="405" Compressed="yes" Id="$(var.PackageCode)" InstallScope="perMachine" />
|
||||
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
|
||||
|
||||
<Property Id="FORSERVICE" Value="false" />
|
||||
|
||||
<Directory Id="TARGETDIR" Name="SourceDir">
|
||||
<Directory Id="ProgramMenuFolder" Name="Programs"/>
|
||||
<Directory Id="DesktopFolder" Name="Desktop"/>
|
||||
|
||||
<Directory Id="$(var.ProgramFilesFolder)">
|
||||
<Directory Id="INSTALLLOCATION" Name="Duplicati 2" />
|
||||
</Directory>
|
||||
</Directory>
|
||||
|
||||
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" />
|
||||
|
||||
<Feature Id="DuplicatiCore" Title="Duplicati core files" Level="1" Description="Installs the required files for Duplicati." AllowAdvertise="no" Absent="disallow" ConfigurableDirectory="INSTALLLOCATION" >
|
||||
<Feature Id="DuplicatiDesktopShortCutFeature" Title="Desktop Shortcut" Level="1" Description ="Installs a shortcut to Duplicati on the desktop" Absent="allow" AllowAdvertise="no">
|
||||
<ComponentRef Id="DuplicatiDesktopShortcutComponent"/>
|
||||
</Feature>
|
||||
|
||||
<Feature Id="DuplicatiProgramMenuShortCutFeature" Title="Program Menu Shortcut" Level="1" Description ="Installs a shortcut to Duplicati in the Program menu" Absent="allow" AllowAdvertise="no">
|
||||
<ComponentRef Id="DuplicatiProgramMenuShortcutComponent"/>
|
||||
</Feature>
|
||||
<ComponentGroupRef Id="DUPLICATIBIN" />
|
||||
</Feature>
|
||||
|
||||
<Feature Id="DuplicatiStartupShortCutFeature" Title="Launch Duplicati at startup" Level="1" Description ="Automatically launches Duplicati when you log on to the computer" Absent="allow" AllowAdvertise="no">
|
||||
<ComponentRef Id="StartupMenuItem"/>
|
||||
</Feature>
|
||||
|
||||
<!-- Launch duplicati setup -->
|
||||
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch Duplicati now" />
|
||||
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" />
|
||||
<CustomAction Id="LaunchApplication" FileKey="Duplicati.GUI.TrayIcon.exe" Impersonate="yes" ExeCommand="" Return="asyncNoWait" />
|
||||
|
||||
<!-- Set the Add/Remove icon -->
|
||||
<Property Id="ARPPRODUCTICON" Value="DuplicatiIcon.exe" />
|
||||
|
||||
<!-- Remove old versions -->
|
||||
<InstallExecuteSequence>
|
||||
<RemoveExistingProducts Before="InstallInitialize" />
|
||||
</InstallExecuteSequence>
|
||||
|
||||
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
|
||||
<Upgrade Id="$(var.UpgradeCode)">
|
||||
<UpgradeVersion Minimum="2.0.0.0" Property="PREVIOUSVERSIONSINSTALLED" Maximum="99.0.0.0" IncludeMinimum="yes" IncludeMaximum="no" />
|
||||
</Upgrade>
|
||||
|
||||
<Icon Id="DuplicatiIcon.exe" SourceFile="$(var.HarvestPath)Duplicati.GUI.TrayIcon.exe" />
|
||||
|
||||
</Product>
|
||||
</Wix>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 601 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 112 KiB |
@@ -0,0 +1,25 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf2759
|
||||
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\froman\fcharset0 TimesNewRomanPSMT;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\expandedcolortbl;;}
|
||||
\paperw12240\paperh15840\margl1440\margr1440\margb1417\margt1417\vieww12840\viewh16060\viewkind1
|
||||
\deftab720
|
||||
\pard\pardeftab720\ri0\sl380\sa240\partightenfactor0
|
||||
|
||||
\f0\fs25 \cf0 Copyright (c) 2024 Team Duplicati, https://duplicati.com, hello@duplicati.com
|
||||
\f1\fs24 \
|
||||
\pard\pardeftab720\ri0\sl380\sb240\sa240\partightenfactor0
|
||||
\cf0 \
|
||||
\pard\pardeftab720\ri0\sl380\sb240\sa240\partightenfactor0
|
||||
|
||||
\f0\fs25 \cf0 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:
|
||||
\f1\fs24 \
|
||||
\
|
||||
|
||||
\f0\fs25 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
\f1\fs24 \
|
||||
\
|
||||
|
||||
\f0\fs25 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.
|
||||
\f1\fs24 \
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
<Fragment>
|
||||
|
||||
<DirectoryRef Id="ProgramMenuFolder">
|
||||
<Component Id="DuplicatiProgramMenuShortcutComponent" Guid="1D03AB64-E310-4974-835E-E9E8CFB18BBC">
|
||||
<Shortcut Id="DuplicatiProgramMenuShortcut"
|
||||
Name="Duplicati"
|
||||
WorkingDirectory="INSTALLLOCATION"
|
||||
Description="Launch Duplicati"
|
||||
Directory="ProgramMenuFolder"
|
||||
Icon="DuplicatiIcon.exe"
|
||||
IconIndex="0"
|
||||
Target="[INSTALLLOCATION]Duplicati.GUI.TrayIcon.exe"
|
||||
/>
|
||||
<RegistryKey Root="HKCU" Key="Software\DuplicatiTeam\Duplicati\ProgramMenuShortcut">
|
||||
<RegistryValue
|
||||
Value="Installed"
|
||||
Type="string"
|
||||
KeyPath="yes" />
|
||||
</RegistryKey>
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<DirectoryRef Id="DesktopFolder">
|
||||
<Component Id="DuplicatiDesktopShortcutComponent" Guid="7BF060B8-389F-4a95-931C-5D551E55902A">
|
||||
<Shortcut Id="DuplicatiDesktopComponent"
|
||||
Name="Duplicati"
|
||||
WorkingDirectory="INSTALLLOCATION"
|
||||
Description="Launch Duplicati"
|
||||
Directory="DesktopFolder"
|
||||
Icon="DuplicatiIcon.exe"
|
||||
IconIndex="0"
|
||||
Target="[INSTALLLOCATION]Duplicati.GUI.TrayIcon.exe"
|
||||
/>
|
||||
<RegistryKey Root="HKCU" Key="Software\DuplicatiTeam\Duplicati\DesktopFolderShortcut">
|
||||
<RegistryValue
|
||||
Value="Installed"
|
||||
Type="string"
|
||||
KeyPath="yes" />
|
||||
</RegistryKey>
|
||||
</Component>
|
||||
</DirectoryRef>
|
||||
|
||||
<DirectoryRef Id="ProgramMenuFolder">
|
||||
<Directory Id="StartupFolder">
|
||||
<Component Id="StartupMenuItem" Guid="A85B1D4E-26EF-4d6a-8C1F-279EAABCE8DE">
|
||||
<Shortcut Id="DuplicatiStartupComponent"
|
||||
Name="Duplicati"
|
||||
WorkingDirectory="INSTALLLOCATION"
|
||||
Description="Launch Duplicati"
|
||||
Directory="StartupFolder"
|
||||
Icon="DuplicatiIcon.exe"
|
||||
IconIndex="0"
|
||||
Target="[INSTALLLOCATION]Duplicati.GUI.TrayIcon.exe"
|
||||
/>
|
||||
|
||||
<RegistryKey Root="HKCU" Key="Software\DuplicatiTeam\Duplicati\StartupShortcut">
|
||||
<RegistryValue
|
||||
Value="Installed"
|
||||
Type="string"
|
||||
KeyPath="yes" />
|
||||
</RegistryKey>
|
||||
</Component>
|
||||
</Directory>
|
||||
</DirectoryRef>
|
||||
|
||||
</Fragment>
|
||||
</Wix>
|
||||
@@ -0,0 +1,17 @@
|
||||
<Include>
|
||||
<!-- Never change the UpgradeCode -->
|
||||
<?define UpgradeCode="1c94bc5a-2bf2-4273-9d8f-2cb30e780d16" ?>
|
||||
|
||||
<!-- Remember to change product version on each install -->
|
||||
<?define ProductVersion="2.0.8.106" ?>
|
||||
|
||||
<?define Manufacturer="Duplicati Team" ?>
|
||||
|
||||
<!--
|
||||
It must be a MAJOR upgrade, otherwise the user cannot doubleclick the MSI.
|
||||
-->
|
||||
|
||||
<?define ProductCode="*" ?>
|
||||
<?define PackageCode="*" ?>
|
||||
|
||||
</Include>
|
||||
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,22 @@
|
||||
FROM ubuntu:latest
|
||||
|
||||
# Source build packages locally
|
||||
ARG DOCKER_BUILD_PROXY
|
||||
ENV DOCKER_BUILD_PROXY $DOCKER_BUILD_PROXY
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
|
||||
# Install common build tools
|
||||
RUN set -uex; \
|
||||
export http_proxy=${HTTP_PROXY-${DOCKER_BUILD_PROXY}}; \
|
||||
apt-get update; \
|
||||
apt-get install --no-install-suggests --no-install-recommends -y \
|
||||
build-essential \
|
||||
debhelper \
|
||||
dpkg-dev; \
|
||||
apt-get clean all
|
||||
|
||||
label org.label-schema.name = "duplicati/debian-build" \
|
||||
org.label-schema.version = "20161230" \
|
||||
org.label-schema.vendor="Deployable" \
|
||||
org.label-schema.docker.cmd="docker run -ti duplicati/debian-build" \
|
||||
org.label-schema.schema-version="1.0"
|
||||
@@ -0,0 +1,6 @@
|
||||
duplicati (%VERSION%) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
* See changelog.txt for changes
|
||||
|
||||
-- Duplicati Team <hello@duplicati.com> %DATE%
|
||||
@@ -0,0 +1,23 @@
|
||||
Source: duplicati
|
||||
Section: utils
|
||||
Priority: extra
|
||||
Build-Depends: debhelper-compat (= 13)
|
||||
Maintainer: Kenneth Skovhede <kenneth@duplicati.com>
|
||||
Standards-Version: 3.9.4
|
||||
Homepage: http://duplicati.com
|
||||
Vcs-Git: https://github.com/duplicati/duplicati.git
|
||||
Package: duplicati
|
||||
Architecture: %ARCH%
|
||||
Depends: %DEPENDS%
|
||||
Version: %VERSION%
|
||||
Description: Backup client for encrypted online backups
|
||||
Duplicati is a free open-source backup client that securely stores encrypted, incremental,
|
||||
compressed backups on cloud storage services and remote file servers. It
|
||||
supports targets like Amazon S3, Windows Live SkyDrive, Rackspace Cloud Files
|
||||
or WebDAV, SSH, FTP (and many more).
|
||||
.
|
||||
Duplicati has built-in AES-256 encryption and backups be can signed using GNU
|
||||
Privacy Guard. A built-in scheduler makes sure that backups are always
|
||||
up-to-date. Last but not least, Duplicati provides various options and tweaks
|
||||
like filters, deletion rules, transfer and bandwidth options to run backups
|
||||
for specific purposes.
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: duplicati
|
||||
# Required-Start:
|
||||
# Required-Stop:
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 1
|
||||
# Short-Description: Duplicati
|
||||
### END INIT INFO
|
||||
|
||||
DAEMON=/usr/bin/duplicati-server
|
||||
DAEMON_PROCESS=DuplicatiServer
|
||||
NAME=duplicati
|
||||
PIDFILE=/var/run/$NAME.pid
|
||||
DESC="Duplicati backup service"
|
||||
DEFAULT=/etc/default/$NAME
|
||||
|
||||
# Use LSB
|
||||
. /lib/lsb/init-functions
|
||||
|
||||
# If we don't have the basics, don't bother
|
||||
test -x $DAEMON || exit 0
|
||||
test -f $DEFAULT && . $DEFAULT
|
||||
|
||||
running_pid()
|
||||
{
|
||||
# Check if a given process pid's cmdline matches a given name
|
||||
pid=$1
|
||||
name=$2
|
||||
[ -z "$pid" ] && return 1
|
||||
[ ! -d /proc/$pid ] && return 1
|
||||
cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
|
||||
# Is this the expected child?
|
||||
[ "$cmd" != "$name" ] && return 1
|
||||
return 0
|
||||
}
|
||||
|
||||
running()
|
||||
{
|
||||
# Check if the process is running looking at /proc
|
||||
# (works for all users)
|
||||
# No pidfile, probably no daemon present
|
||||
[ ! -f "$PIDFILE" ] && return 1
|
||||
# Obtain the pid and check it against the binary name
|
||||
pid=`cat $PIDFILE`
|
||||
running_pid $pid $DAEMON_PROCESS || return 1
|
||||
return 0
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
log_daemon_msg "Starting $DESC" "$NAME"
|
||||
if running; then
|
||||
log_progress_msg "already running"
|
||||
log_end_msg 0
|
||||
exit 0
|
||||
fi
|
||||
rm -f $PIDFILE
|
||||
start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS
|
||||
log_end_msg $?
|
||||
;;
|
||||
stop)
|
||||
log_daemon_msg "Stopping $DESC" "$NAME"
|
||||
start-stop-daemon --stop --pidfile $PIDFILE
|
||||
log_end_msg $?
|
||||
;;
|
||||
restart|force-reload)
|
||||
$0 stop
|
||||
sleep 2
|
||||
$0 start
|
||||
;;
|
||||
*)
|
||||
N=/etc/init.d/$NAME
|
||||
echo "Usage: $N {start|stop|restart|force-reload}" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,10 @@
|
||||
# Defaults for duplicati initscript
|
||||
# sourced by /etc/init.d/duplicati
|
||||
# installed at /etc/default/duplicati by the maintainer scripts
|
||||
|
||||
#
|
||||
# This is a POSIX shell fragment
|
||||
#
|
||||
|
||||
# Additional options that are passed to the Daemon.
|
||||
DAEMON_OPTS=""
|
||||
@@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=Duplicati web-server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Nice=19
|
||||
IOSchedulingClass=idle
|
||||
EnvironmentFile=-/etc/default/duplicati
|
||||
ExecStart=/usr/bin/duplicati-server $DAEMON_OPTS
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,21 @@
|
||||
FROM fedora:latest
|
||||
|
||||
# Source build packages locally
|
||||
ARG DOCKER_BUILD_PROXY
|
||||
ENV DOCKER_BUILD_PROXY $DOCKER_BUILD_PROXY
|
||||
|
||||
# Install common build tools
|
||||
RUN dnf -y install deltarpm
|
||||
RUN dnf -y upgrade
|
||||
RUN dnf -y --allowerasing install @"Minimal Install" @buildsys-build yum-utils rpm-sign gnupg rpmdevtools
|
||||
|
||||
RUN dnf -y update
|
||||
|
||||
# Install build things
|
||||
RUN dnf -y install desktop-file-utils
|
||||
|
||||
LABEL org.label-schema.name = "duplicati/fedora-build" \
|
||||
org.label-schema.version = "20161230" \
|
||||
org.label-schema.vendor="Deployable" \
|
||||
org.label-schema.docker.cmd="docker run -ti duplicati/fedora-build" \
|
||||
org.label-schema.schema-version="1.0"
|
||||
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
# This file helps mark executables as executable and symlink them to the correct location
|
||||
# Lines starting with REPL: are repeated for each file in the executable list
|
||||
# The values %SOURCE% and %TARGET% are replaced with the source and target (symlink) file names
|
||||
|
||||
BUILDROOT=$1
|
||||
EXEC_PREFIX=$2
|
||||
NAMER=$3
|
||||
|
||||
# Fix permissions
|
||||
REPL: chmod 755 ${BUILDROOT}${EXEC_PREFIX}/lib/${NAMER}/%SOURCE%
|
||||
|
||||
# Setup symlinks
|
||||
REPL: ln -s ../lib/${NAMER}/%SOURCE% ${BUILDROOT}${EXEC_PREFIX}/bin/%TARGET%
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This file is a workaround to install a directory recursively,
|
||||
# without hitting limitations of the SPEC file build environment
|
||||
|
||||
OLDIFS=$IFS
|
||||
IFS=$'\n'
|
||||
|
||||
for file in $(find "$1" -type d -printf '%P\n'); do
|
||||
install -p -d -m 755 "$2/${file}"
|
||||
done
|
||||
|
||||
for file in $(find "$1" -type f -printf '%P\n'); do
|
||||
install -p -D -m 644 "$1/${file}" "$2/${file}"
|
||||
done
|
||||
|
||||
IFS=$OLDIFS
|
||||
@@ -0,0 +1,153 @@
|
||||
%define _build_id_links none
|
||||
|
||||
# Set up some defaults
|
||||
%global namer duplicati
|
||||
%global debug_package %{nil}
|
||||
%global alphatag .git
|
||||
%global _builddate %BUILDDATE%
|
||||
%global _buildversion %BUILDVERSION%
|
||||
%global _buildtag %BUILDTAG%
|
||||
|
||||
Name: %{namer}
|
||||
Version: %{_buildversion}
|
||||
Release: %{_buildtag}
|
||||
Icon: duplicati.xpm
|
||||
|
||||
# Disable auto dependencies as it picks up .Net 2.0 profile
|
||||
# and does not support supplying them with 4.5
|
||||
# Also, all thirdparty libraries are given as "provides" but they
|
||||
# are not installed for use externally
|
||||
AutoReqProv: no
|
||||
|
||||
Summary: Backup client for encrypted online backups
|
||||
License: MIT
|
||||
URL: https://duplicati.com
|
||||
Source0: duplicati-%{_buildversion}.tar.bz2
|
||||
Source1: %{namer}-install-recursive.sh
|
||||
Source2: %{namer}-install-binaries.sh
|
||||
Source3: %{namer}.service
|
||||
Source4: %{namer}.default
|
||||
Source5: %{namer}.png
|
||||
Source6: %{namer}.desktop
|
||||
|
||||
BuildRequires: desktop-file-utils
|
||||
BuildRequires: systemd
|
||||
|
||||
Requires: desktop-file-utils
|
||||
Requires: bash
|
||||
%DEPENDS%
|
||||
|
||||
%PROVIDES%
|
||||
|
||||
%description
|
||||
Duplicati is a free backup client that securely stores encrypted,
|
||||
incremental, compressed backups on cloud storage services and remote file
|
||||
servers. It supports targets like Amazon S3, Windows Live SkyDrive,
|
||||
Rackspace Cloud Files or WebDAV, SSH, FTP (and many more).
|
||||
|
||||
Duplicati has built-in AES-256 encryption and backups be can signed using
|
||||
GNU Privacy Guard. A built-in scheduler makes sure that backups are always
|
||||
up-to-date. Last but not least, Duplicati provides various options and
|
||||
tweaks like filters, deletion rules, transfer and bandwidth options to run
|
||||
backups for specific purposes.
|
||||
|
||||
%prep
|
||||
%setup -q -n %{namer}-%{_buildversion}
|
||||
|
||||
%build
|
||||
|
||||
# Build is expected to be complete
|
||||
# so no build action is performed
|
||||
|
||||
%install
|
||||
|
||||
install -d %{buildroot}%{_datadir}/pixmaps/
|
||||
install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/
|
||||
install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/licenses/
|
||||
install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/webroot/
|
||||
install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/lvm-scripts/
|
||||
install -d %{buildroot}%{_exec_prefix}/bin/
|
||||
install -d %{buildroot}%{_unitdir}
|
||||
install -d %{buildroot}%{_sysconfdir}/sysconfig/
|
||||
|
||||
|
||||
# Remove packaging artifacts
|
||||
find . -type f -name ._\* | xargs rm -rf
|
||||
|
||||
# Install all files, but the list is too long to be in the script itself :/
|
||||
/bin/bash %{_topdir}/SOURCES/%{namer}-install-recursive.sh "." "%{buildroot}%{_exec_prefix}/lib/%{namer}/"
|
||||
|
||||
# Move the icon in to place
|
||||
install -p %{_topdir}/SOURCES/%{namer}.png %{buildroot}%{_datadir}/pixmaps/
|
||||
|
||||
# Fix executable permissions and install symlinks
|
||||
/bin/bash %{_topdir}/SOURCES/%{namer}-install-binaries.sh "%{buildroot}" "%{_exec_prefix}" "%{namer}"
|
||||
|
||||
desktop-file-install %{_topdir}/SOURCES/%{namer}.desktop
|
||||
|
||||
# Install the service:
|
||||
install -p -D -m 644 %{_topdir}/SOURCES/%{namer}.service %{buildroot}%{_unitdir}
|
||||
install -p -D -m 644 %{_topdir}/SOURCES/%{namer}.default %{buildroot}%{_sysconfdir}/sysconfig/%{namer}
|
||||
|
||||
%post
|
||||
/bin/touch --no-create %{_datadir}/icons/hicolor || :
|
||||
%{_bindir}/gtk-update-icon-cache \
|
||||
--quiet %{_datadir}/icons/hicolor 2> /dev/null|| :
|
||||
%systemd_post %{namer}.service
|
||||
|
||||
%preun
|
||||
%systemd_preun %{namer}.service
|
||||
|
||||
%postun
|
||||
/bin/touch --no-create %{_datadir}/icons/hicolor || :
|
||||
%{_bindir}/gtk-update-icon-cache \
|
||||
--quiet %{_datadir}/icons/hicolor 2> /dev/null|| :
|
||||
%systemd_postun_with_restart %{namer}.service
|
||||
|
||||
%posttrans
|
||||
/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
|
||||
|
||||
|
||||
%files
|
||||
%doc changelog.txt licenses/license.txt
|
||||
%{_datadir}/*/*
|
||||
%{_exec_prefix}/lib/*
|
||||
%{_exec_prefix}/bin/*
|
||||
%{_sysconfdir}/sysconfig/*
|
||||
|
||||
|
||||
%changelog
|
||||
* Tue Apr 9 2024 Kenneth Skovhede <kenneth@duplicati.com> - 2.0.0-0.20240409.git
|
||||
- Fix package binaries installing and systemd service
|
||||
|
||||
* Mon Mar 25 2024 Kenneth Skovhede <kenneth@duplicati.com> - 2.0.0-0.20240325.git
|
||||
- Updated to build from arch-specific .Net8 binaries
|
||||
|
||||
* Wed Jun 21 2017 Kenneth Skovhede <kenneth@duplicati.com> - 2.0.0-0.20170621.git
|
||||
- Added the service file to the install
|
||||
|
||||
* Thu Apr 28 2016 Kenneth Skovhede <kenneth@duplicati.com> - 2.0.0-0.20160423.git
|
||||
- Made a binary version of the spec file
|
||||
|
||||
* Sat Apr 23 2016 Kenneth Skovhede <kenneth@duplicati.com> - 2.0.0-0.20160423.git
|
||||
- Updated list of dependencies
|
||||
|
||||
* Thu Mar 27 2014 Kenneth Skovhede <kenneth@duplicati.com> - 2.0.0-0.20140326.git
|
||||
- Moved to /usr/lib
|
||||
- Fixed minor build issues
|
||||
|
||||
* Wed Mar 26 2014 Kenneth Skovhede <kenneth@duplicati.com> - 2.0.0-0.20140326.git
|
||||
- Updated patch files
|
||||
- Fixed minor build issues
|
||||
|
||||
* Wed May 29 2013 Ismael Olea <ismael@olea.org> - 2.0.0-0.20130529.git
|
||||
- removed MacOSX support and deps
|
||||
- first compiler building spec
|
||||
|
||||
* Mon May 13 2013 Ismael Olea <ismael@olea.org> - 1.3.4-1
|
||||
- removing desktop contents
|
||||
|
||||
* Sun May 12 2013 Ismael Olea <ismael@olea.org> - 1.3.4-0
|
||||
- first dirty package for upstream compiled binary
|
||||
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This script is a workaround for Docker desktop not handling
|
||||
# permissions for mounted volumes correctly.
|
||||
|
||||
# This script is intended to be run inside a Docker container
|
||||
|
||||
mkdir /build-temp
|
||||
cp -R $1/* /build-temp
|
||||
|
||||
rpmbuild -bb --target $2 --define "_topdir /build-temp" SOURCES/duplicati.spec
|
||||
mv /build-temp/RPMS/$2/*.rpm /$1/build.rpm
|
||||
@@ -0,0 +1,11 @@
|
||||
# Defaults for duplicati initscript
|
||||
# sourced by /lib/systemd/system/duplicati.service
|
||||
# installed at /etc/sysconfig/duplicati.default by the maintainer scripts
|
||||
# copy to /etc/sysconfig/duplicati and edit if required
|
||||
|
||||
#
|
||||
# This is a POSIX shell fragment
|
||||
#
|
||||
|
||||
# Additional options that are passed to the Daemon.
|
||||
DAEMON_OPTS=""
|
||||
@@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=Duplicati web-server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Nice=19
|
||||
IOSchedulingClass=idle
|
||||
EnvironmentFile=-/etc/sysconfig/duplicati
|
||||
ExecStart=/usr/bin/duplicati-server $DAEMON_OPTS
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,12 @@
|
||||
[Desktop Entry]
|
||||
Categories=System;Archiving;FileTools;Filesystem;
|
||||
Type=Application
|
||||
Name=Duplicati
|
||||
GenericName= Backup tool
|
||||
GenericName[es]= Copias de respaldo
|
||||
Comment= Create and maintain local and remote backup copies of your data
|
||||
Comment[es]= Cree y mantenga copias de seguridad locales y remotas
|
||||
Exec=duplicati
|
||||
Icon=duplicati
|
||||
Terminal=false
|
||||
StartupNotify=true
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 579 B |
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{display:none;}
|
||||
.st1{fill:#D0CDC6;}
|
||||
.st2{fill:#FFFFFF;}
|
||||
.st3{fill:#1D4775;}
|
||||
.st4{fill:#8194A9;}
|
||||
.st5{fill:#EBF1F5;}
|
||||
.st6{fill:#65B1DD;}
|
||||
.st7{fill:#336697;}
|
||||
</style>
|
||||
<g id="backgrounds" class="st0">
|
||||
<rect id="black" x="-16" y="-16" width="64" height="64"/>
|
||||
<rect id="win2k" x="-16" y="-16" class="st1" width="64" height="64"/>
|
||||
<rect id="white" x="-16" y="-16" class="st2" width="64" height="64"/>
|
||||
<rect id="win7_aero" x="-16" y="-16" class="st3" width="64" height="64"/>
|
||||
<rect id="win7_1_" x="-16" y="-16" class="st4" width="64" height="64"/>
|
||||
<rect id="macosx" x="-16" y="-16" class="st5" width="64" height="64"/>
|
||||
</g>
|
||||
<g id="icon">
|
||||
<g id="small_8_">
|
||||
<path class="st6" d="M15,28c-1.7,0-3-1.3-3-3v-5c0-1.7,1.3-3,3-3h8c1.7,0,3,1.3,3,3v5c0,1.7-1.3,3-3,3H15z"/>
|
||||
<path class="st2" d="M23,18c1.1,0,2,0.9,2,2v5c0,1.1-0.9,2-2,2h-8c-1.1,0-2-0.9-2-2v-5c0-1.1,0.9-2,2-2H23 M23,16h-8
|
||||
c-2.2,0-4,1.8-4,4v5c0,2.2,1.8,4,4,4h8c2.2,0,4-1.8,4-4v-5C27,17.8,25.2,16,23,16L23,16z"/>
|
||||
</g>
|
||||
<g id="middle_8_">
|
||||
<path class="st7" d="M4,30c-1.7,0-3-1.3-3-3v-7c0-1.7,1.3-3,3-3h10c1.7,0,3,1.3,3,3v7c0,1.7-1.3,3-3,3H4z"/>
|
||||
<path class="st2" d="M14,18c1.1,0,2,0.9,2,2v7c0,1.1-0.9,2-2,2H4c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2H14 M14,16H4
|
||||
c-2.2,0-4,1.8-4,4v7c0,2.2,1.8,4,4,4h10c2.2,0,4-1.8,4-4v-7C18,17.8,16.2,16,14,16L14,16z"/>
|
||||
</g>
|
||||
<g id="big_10_">
|
||||
<path class="st3" d="M12,21c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h16c1.7,0,3,1.3,3,3v12c0,1.7-1.3,3-3,3H12z"/>
|
||||
<path class="st2" d="M28,4c1.1,0,2,0.9,2,2v12c0,1.1-0.9,2-2,2H12c-1.1,0-2-0.9-2-2V6c0-1.1,0.9-2,2-2H28 M28,2H12
|
||||
C9.8,2,8,3.8,8,6v12c0,2.2,1.8,4,4,4h16c2.2,0,4-1.8,4-4V6C32,3.8,30.2,2,28,2L28,2z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
@@ -0,0 +1,62 @@
|
||||
/* XPM */
|
||||
static char *appicon_32x32[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"32 32 24 1 ",
|
||||
" c #1D4775",
|
||||
". c #365B84",
|
||||
"X c #375C85",
|
||||
"o c #336697",
|
||||
"O c #4976A2",
|
||||
"+ c #4977A2",
|
||||
"@ c #4A77A3",
|
||||
"# c #517DA6",
|
||||
"$ c #65B1DD",
|
||||
"% c #77BAE1",
|
||||
"& c #BDCAD7",
|
||||
"* c #BECAD7",
|
||||
"= c #BFCBD8",
|
||||
"- c #BACBDC",
|
||||
"; c #BDCEDE",
|
||||
": c #C4D3E1",
|
||||
"> c #C5D3E1",
|
||||
", c #C5D4E2",
|
||||
"< c #D4E9F5",
|
||||
"1 c #F0F4F7",
|
||||
"2 c #F4F7F9",
|
||||
"3 c #FEFEFE",
|
||||
"4 c white",
|
||||
"5 c None",
|
||||
/* pixels */
|
||||
"55555555555555555555555555555555",
|
||||
"55555555555555555555555555555555",
|
||||
"55555555554444444444444444444455",
|
||||
"55555555544444444444444444444445",
|
||||
"5555555544&. .&44",
|
||||
"5555555544. .44",
|
||||
"5555555544 44",
|
||||
"5555555544 44",
|
||||
"5555555544 44",
|
||||
"5555555544 44",
|
||||
"5555555544 44",
|
||||
"5555555544 44",
|
||||
"5555555544 44",
|
||||
"5555555544 44",
|
||||
"5555555544 44",
|
||||
"5555555544 44",
|
||||
"5544444444 44",
|
||||
"5444444444 44",
|
||||
"44,+oooo24. .44",
|
||||
"44+ooooo=4=. X=44",
|
||||
"44oooooo#14444444444444444444445",
|
||||
"44ooooooo@=244444444444444444455",
|
||||
"44oooooooooooooo44$$$$$$$4455555",
|
||||
"44oooooooooooooo44$$$$$$$4455555",
|
||||
"44oooooooooooooo44$$$$$$$4455555",
|
||||
"44oooooooooooooo44$$$$$$%4455555",
|
||||
"44oooooooooooooo44$$$$$%<4455555",
|
||||
"44@oooooooooooo@4444444444555555",
|
||||
"44,@oooooooooo@,4444444445555555",
|
||||
"54444444444444444555555555555555",
|
||||
"55444444444444445555555555555555",
|
||||
"55555555555555555555555555555555"
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
103
|
||||
Reference in New Issue
Block a user