Giter Site home page Giter Site logo

duplicati-client's Introduction

Duplicati Client

The Duplicati Client connects to Duplicati servers remotely or locally and helps manage them easily through the command-line.

A note on maintenance status

I don't really use duplicati anymore, so maintaining this tool has low priority for me. I probably won't add new features or fix unimportant bugs. I might help out with troubleshooting issues, but I won't make promises.

To my knowledge the tool works fine on all platforms it has been used on, and it is fairly feature complete, so this isn't a declaration of deprecation.. It is just a formal statement about my reprioritization.

Table of contents

Why use Duplicati Client?

Duplicati ships with a CommandLine tool that is capable of doing various actions like backups, restores, and verifying backend data.

However, the Duplicati CommandLine is a separate program. It does not communicate with the Duplicati Server that you interact with when using the web UI.

This plays out in various ways when trying to manually initiate a backup using the CommandLine tool and the Duplicati server not updating it's metadata or even showing that a backup is happening.

Additionally, the CommandLine is stateless in the sense that you need to provide all the relevant information each time you want to run a command. This can be daunting if you just want to initiate a backup run on an existing backup.

The Duplicati Client is a cross platform command-line tool that allows you to interact with the Duplicati Server as if you were using the web UI. It interacts with the same REST API as the web UI, which means it will behave the same and can be used from practically any machine that the web UI can be used from.

Furthermore, this tool makes it easy to write custom scripts for use in cron jobs or ad-hoc tasks. You can simply call the Client from your script or cron job as most options can be provided inline by the script. Even if your Duplicati Server is password protected your scripts can easily log in by using a parametersfile.

External libraries used

Currently the script relies on multiple external libraries:

requests
PyYaml
python-dateutil

Installation

From source

Clone the repo

git clone https://github.com/pectojin/duplicati-client

The client runs on Python 3 and requires the above dependencies

pip3 install -r requirements.txt

For convenience you can symlink the client

sudo ln -s /location/of/git/repo/duplicati_client.py /usr/bin/duc

On UNIX it should automatically attempt to use Python on your system so now you can just call

duc

And you're good to go.

Windows self contained binary

For installation of the Windows self contained binary package I recommend copying it to C:\Program Files\Duplicati Client and then adding that path to your environment variable path so that you can call duplicati_client from anywhere in your CLI.

GNU/Linux and macOS self contained binaries

Self contained binaries are also available for Linux and macOS.

These are useful if you cannot or will not install the 3rd party dependencies on your system, or if you experience compatibility problems with your current Python installation.

I recommend copying the binary package to /opt/duplicati_client on Linux and /Applications/Duplicati Client on macOS. Then symlink the duplicati_client binary

sudo ln -s /location/of/duplicati_client /usr/bin/duc

Usage

To begin log into a server:

duc login https://my.duplicati.server

Then you can list resources

duc list backups

Get info

duc get backup 1

Run a backup job

duc run 1

Logout when you're done

duc logout

Supported commands

list      list all resources of a given type
get       display breif information on one or many resources
describe  display detailed information on a specific resource
set       set values on resources
run       run a backup job
abort     abort a task
create    create a resource on the server from a YAMl or JSON file
update    update a resource on the server from a YAMl or JSON file
delete    delete a resource on the server
export    export a backup from the server to YAMl or JSON format
repair    repair a database
vacuum    vacuum a database
verify    verify remote backup data
compact   compact remote backup data
dismiss   dismiss notifications
logs      display the logs for a given job
login     log into a Duplicati server
logout    end the current server session
status    print information about the current session
version   print version number
config    print the config
verbose   change between normal and verbose mode
precise   change between short and precise time format
params    import parameters from a YAML file
pause     pause Duplicati server
resume    resume paused Duplicati server

Setting the server password

It's possible to configure a server password using the set password command.

duc set password

It will prompt for the new password and configure it on the server. You can also provide it inline using --password or using a parameters file.

You can disable the password using --disable

duc set password --disable

Additionally, the set password command will remove the password-protection prompt ("If your machine is in a multi-user environment..."), so if you just want to pre-configure a system to remove that message you can make the --disable call to remove this message.

Parameters file

Using the command params you can specify a parameters file. With this file you can provide most of the optional CLI arguments without having to specify them inline when calling your commands.

The parameters file is set once using the params command and then automatically loaded on each call.

You must create the parameters file yourself. An example of a parameters file:

password: verysecretpassword
verbose: True

Then specify that you want to use a parameters file

duc params ~/.config/duplicati-client/parameters.yml

This will load your password, set verbose mode, and allow insecure connections by default when you run a command.

Loaded 3 parameters from ~/.config/duplicati-client/parameters.yml

Then, if you're connecting to a different server, simply override the default password by adding the --password argument in the CLI.

duc login localhost --password=othersecretpassword

Verbose is an exception to this rule. It applies session wide and can only be toggled by calling the verbose command, which is nonsensical if you have a parameters file enabling it again.

If you need to disable your parameters file, run

duc params --disable

Export backups

The export command enables building backup configuration files through the CLI. The Duplicati client will pull the necessary information on the selected backup and construct a configuration file. The configuration file can be exported in either YAML or JSON depending on preference

duc export backup [id]

By default the client will export YAML, but you can manually specify either with --output. Additionally you can specify the output path with --output-path. You can also opt to export all backup configs using --all.

The resulting file can then be used to create new backup jobs with the import command. Notice that the JSON output is identical to exporting from the Duplicati Web UI, so if you need interoperability use JSON. The YAML file is only understood by this client for now.

Default options defined in settings are not exported with the job configuration.

Create and update backups

The Create command allows creating backup jobs from a configuration file. Either a JSON file, as exported from the Duplicati Web UI, or a YAML/JSON file exported from this client. Input files are automatically converted into the JSON format that the Duplicati server requires, so it does not matter which format you import from.

duc create backup [path_to_file]

By default metadata will not be imported, but if you'd like to retain the metadata use --import-metadata

The Update command allows updating an existing job from a configuration file.

duc update backup [backup_id] [path_to_file]

Duplicati does not currently allow to update a backup configuration without also overwriting the metadata. If your config file was exported a long time ago with old metadata you may not be interested in this.

Apply the --strip-metadata option to remove the metadata before updating the backup config. This way no metadata will be displayed until the backup job has had a chance to run and provide the correct metadata.

Encrypted configuration files are currently not supported.

A note on versioning

duplicati-client will maintain a 0.x release status until Duplicati leaves beta. It's just not logical to make a "stable release" of a tool that interacts with product with no stable release. With that being said the Duplicati API has never broken duplicati-client with changes.

Every 0.x change indicates a larger change in user interface or addition of features.

0.x.x changes indicates small bug fixes and changes that shouldn't be noticable. Every "unit" of change increments this value, so a change from 0.x.1 to 0.x.5 indicates 4 separate logical units of change.

Building releases

Releases are built in a fairly simple manner using a script for each platform located in the scripts/ folder:

scripts/general_build.sh  scripts/linux_build.sh  scripts/macos_build.sh  scripts/windows_build.sh

All of the scripts rely on python and the packages declared in build-requirements.txt. Furthermore a comprimise has been made for the windows packaging using cygwin instead of writing a windows native script.

After setting up the dependencies simply run the script and the release packages can be found in script/releases:

% cd scripts
% bash ./general_build.sh

Build version: 0.6.3
Creating release folder and copying files...
Packing release into a zip archive...
Done!
% ls releases
duplicati_client_0.6.3_general  duplicati_client_0.6.3_general.zip

PyInstaller takes care of bundling the application and all dependencies into a single binary that can be run without python installed.

duplicati-client's People

Contributors

avmaksimov avatar gpatel-fr avatar mjmayer avatar pectojin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

duplicati-client's Issues

Problem with login via Cloudflare tunel

Hello, I have Duplicati behind cloudflare tunel with with some Access policies.

In order to do Duplicati login, I created a cloudflare exception to allow the IP address - it works. I connect to the Duplicate page both with a browser and get the content via wget (StatusCode 200 is returned)
But duplicati_client.exe won't connect for some reason and returns a 503 error

Problem:

  • Cant login to Duplicati behind Cloudflare

duplicati_client.exe login https://duplicati_my-domain.com --password secretpaswword
Connecting to https://duplicati_my-domain.com:443...
Server is not responding. Is it running?
Code: 503

I'm pretty sure that the problem shouldn't be on the cloudflare configuration side (otherwise wget shouldn't work either), but I don't know where the problem is. Maybe some TLS or HTTP/2 problem?

Question: How to get the status of the backup (success/failed)?

I want to monitor the status of my backups automatically on notify myself if something broke.
As the APi is not documented officially, i am trying to extract the simple information for each backup like "Status: Success/Failed" from the API using duplicati-client.

list backups only tells me when it was running the last time, but not if it was running successfully.

Can i get this information using the api directly or do i need to do additional queries? (Or write my own method?)

Support HTTP Basic authentication

Hi

I have my Duplicati server behind a Apache server, protected with HTTP Basic authentication. I think that's the cause that duc doesn't work and always returns error 401. As fas as I've seen, the --password parameter refers to Duplicati's internal password, so it doesn't work in my case.

Would it be possible to add some extra parameter to provide HTTP Basic username and password? I think having Duplicati behind a Apache proxy is a pretty typical configuration.

Thanks and congratulations, duc is a very nice and useful program!

UTF-8 Error in Docker Container based on Alpine Linux

I want to add duplicati-client as new layer on top of the official "nodered/node-red" image in docker hub. I know that there is no locale support of the underlying Alpine Linux. So I added musl-locales-master to my Dockerfile - hoping that this helps also for UTF-8. Unfortunately duplicati-client is still not working in this environment (see below). Does anyone has experience in running duplicati-client on Alpine?

Best regards

PS: On Ubuntu duplicati-client is working fine


$ duc login http://duplicati:8200 --password=my password
Traceback (most recent call last):
File "/usr/bin/duc", line 1372, in
main(**vars(args))
File "/usr/bin/duc", line 97, in main
data = auth.login(data, url, password, verify, interactive,
File "/usr/local/lib/duplicati-client/auth.py", line 126, in login
salt = r.json()["Salt"]
File "/usr/lib/python3.8/site-packages/requests/models.py", line 900, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib/python3.8/json/init.py", line 337, in loads
raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",
json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)

Error with the certificate while trying to login into the server

Hello!

I'm trying to login into the server using duc login https://localhost --insecure but I'm getting the following error:

Traceback (most recent call last):
  File "/usr/bin/duc", line 1397, in <module>
    main(**vars(args))
  File "/usr/bin/duc", line 103, in main
    data = auth.login(data, url, password, verify, interactive,
  File "/opt/duplicati-client/auth.py", line 112, in login
    token = urllib.parse.unquote(r.cookies["xsrf-token"])
  File "/usr/lib/python3/dist-packages/requests/cookies.py", line 328, in __getitem__
    return self._find_no_duplicates(name)
  File "/usr/lib/python3/dist-packages/requests/cookies.py", line 399, in _find_no_duplicates
    raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
KeyError: "name='xsrf-token', domain=None, path=None"

I already tried to start duplicati-server using a pfx key that I generated and then specifying this file with the --certfile option but I'm getting the following output:

Server certificate could not be validated. You can specify a certificate with --certfile or explicitly ignore this error with --insecure

Possible error: getting the middle of logs, not last ones

Hello. I don't understand if it's a problem on my environment or not but I see not last log(s) but logs from the middle.
For example today is 06 aug 2022, but I see the last only 1 aug 2022 and 4 before.
But there are 15 backup logs.

I see it with at least with two backups.
I use -all parameter .

I started searching a bug in Duc but I can't see it. May be the author know better this moment or perhaps API of Duplicati,

Can we get a real timestamp for last and next backup?

At the moment, I seem to be getting a fuzzy date, but an ISO date (which always includes date and time) would be far more useful for my purposes.

As far as I can tell, the duplicati ajax call returns such a value, so could we expose that?

Old data return when using latest Duplicati Beta 2.0.4.5

Hi,

I just started using duplicati-client today but I noticed that it returns old data.
My backups started failing on November 19th so I upgraded to the latest beta.
Now everything is working again but I noticed that the client still returns data from the last failure while all backups have ran successfully today.
The data size locally and remote are correct.
Also the version count is correct but the timestamps are not correct.

The web interface does display the correct data and I also tried to restart duplicati but no difference:
image

image

"duc run" and "duc get" show different command patterns

Hi there,
first of all thank you very much for providing duplicati-client.

I use version duplicati-client 0.6.3 beta with Duplicati v2.0.5.114-2.0.5.114_canary_2021-03-10 installed as a service on a Linux Mint box.
Issuing: "duc get backup 2" it works as noted in README.md
Issuing "duc run backup 2" it does not work as noted in the README.md
Issuing "duc run 2" it works as intended.
Perhaps I got something wrong from the README.md but I think there should not be a difference between the command pattern of "duc get" and "duc run".

Issue with latest version of duplicati beta

Hi @Pectojin,

I'm seeing a strange thing with your duplicati client talking to the latest version of duplicati beta. When you do a backup, the web client indicates that the backup has finished successfully, but your duplicati command line client indicates the following:
Progress:
BackendAction: Get
BackendFileProgress: 11426877
BackendFileSize: 11426877
BackendIsBlocking: false
BackendPath: duplicati-b1cfa4892296247b0bcc7479354f1df6a.dblock.zip.aes
BackendSpeed: 4676
BackupID: '1'
CurrentFilename: null
CurrentFileoffset: 0
CurrentFilesize: 0
OverallProgress: 1.0
Phase: Backup_WaitForUpload
ProcessedFileCount: 8
ProcessedFileSize: 64994320
StillCounting: false
TaskID: 2
TotalFileCount: 1582
TotalFileSize: 818099961
Schedule: null

This is from duplicati_client describe backup 1

I've reproduced this on three different PCs so it seems consistent. As you can see, the commandline client believes that we are still in "Backup_WaitForUpload" state even though the backup has finished according to the web client.

Do you know why this is?
thanks

0.4.9 gnu_linux doesn't work on Synology

Thought I'd test the latest beta to see if it works better with my Synology NAS. The previous beta would just "hang" for most operations.

The new one doesn't run at all. I get the following error:

[14572] Error loading Python lib '/tmp/_MEINjsKN1/libpython3.7m.so.1.0': dlopen: /lib/libc.so.6: version GLIBC_2.25 not found (required by /tmp/_MEINjsKN1/libpython3.7m.so.1.0)

Looks like Synology is at version 2.20? (And this is with the most recent version of Synology DSM software):

bash-4.3# ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 20 Oct  9 05:00 /lib/libc.so.6 -> libc-2.20-2014.11.so

Any suggestions?

Binary for Windows

Hello!

Just a short question - hopefully not a silly one:

Is there an allready compiled version (exe) for windows availabel?

Yours
Mike

Add to Pypi

It would be nice to have this client packaged so it can be installed as:

pip install duplicati-client

Authentication not working

I've been fighting authentication issues with the latest version of duplicati_client. I getting the error "Error getting salt from server", because the response from the requests.post is a 404. I'm not using basic auth. I've tried changing my password on duplicati to 1234, just in case one of special characters in my password were not getting escaped correctly. The problem has persisted.

        r = requests.post(baseurl, headers=headers, data=payload, verify=verify)
        if r.status_code != 200:
            common.log_output("Error getting salt from server", True, r.status_code)
            sys.exit(2)

Checking out out 1ef7646 resolves the issue.

HEAD is now at 1ef7646... added 'processed data' field to the get command to better display progress both in terms of number of processed files and in terms of how much data was actually processed
/duplicati_client # ./duplicati_client.py login
Loaded 2 parameters from file
Connecting to http://duplicati:8200...
Getting nonce and salt...
Hashing password...
Authenticating...
Connected
Code: 200
Login successful
/duplicati_client # git checkout master
Previous HEAD position was 1ef7646... added 'processed data' field to the get command to better display progress both in terms of number of processed files and in terms of how much data was actually processed
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
/duplicati_client # ./duplicati_client.py login
Loaded 2 parameters from file
Connecting to http://duplicati:8200...
Getting nonce and salt...
Error getting salt from server
Code: 404

doesn't validate config

Need to implement a config file validation step to the client so it will be able to tell the user if their config file is wrong. (e.g. bad customization or incompatible config file created by an old version)

Ability to login without pass on local machine

What do you think about it? I think it would be useful for me. I want to run DUC in my after Duplicati script and I don't want to store the password.

So I thought if GUI.Tray.Icon can login without pass may be DUC can? I think it might possible to get the password from MySQL connecting via default DB password or suggest non-standard one.

Parameter file not picking up password

I defined the password to connect to my duplicati server in /root/.config/duplicati-client/config.yml. When I used the command duc login I get prompted for a password. However, if I provide the password inline when running duc ( duc login --password=mysecretpassword) it connects without any problem.

I've run the command duc config and from the output it looks like it is reading the config file just fine.

[root@501edab9e2a2 duplicati-client]# duc config
last_login: 2018-03-28 21:45:58.830249
nonce: mjVXSSGrUswurNIWhXqOVBe+ii3R6N5GbMWeJxf+HP8=
parameters_file: /root/.config/duplicati_client/parameters.yml
password: mysecretpassword
server:
  port: '8200'
  protocol: http
  url: myserver.domain.net
  verify: true
session-auth: ZSKYaSx-xt9EvizWIucQ_J32L6sXB6hX3ZhPEuoT9b4
token: ORicSp0PRvj2EV0N1yEZvjUszNORhjKo3P1GnY9eXCM=
token_expires: 2018-03-28 21:56:04.389765
verbose: true

Quick and easy fix: backwards logic in build scripts

The platform-specific build scripts all contain the same error:

if [ ! -d "dist" ]; then
	rm -rf dist
fi

# Cleanup old build files
if [ ! -d "build" ]; then
	rm -rf build
fi

This only removes the directories when they already don't exist, so the negation operator shouldn't be there.

Set password question

Hi @Pectojin,

I've been stuck on other projects for the last 3 months but now I'm back working on a duplicati deployment. I'm glad to see that your command line client has continued to make progress in that time.

I've just reinstalled my duplicati application because it was no longer starting (it would die before fully starting up and I couldn't work out why), and as a result, when I first went to the duplicati web gui after the installation I saw the message about "if you have more than one person using this computer you should set a password, do you want to set a password now". (my paraphrase) I tried to find a way that your command line client might be able to respond to that message but I couldn't find anything. Do you know if it is possible?

That would be really helpful for doing automated deployments because then the commandline client could deal with that message as part of the installation process before a user ever had to be confused by the message.

Thanks,
Stephen

Add details about build scripts

Hello,

I tried to build the self-contained binary for windows today. And as a beginner, it took me a while to realize on how to do that.
To make it easier for people I would suggest to add some more detailed instructions on how to run the build script:

In detail, the issues I had, were:

  1. I ran the script from the main folder (./duplicati-client) instead of a sub folder (eg. ./duplicait-client/build).
  2. pyinstaller is a dependency for the build process, which is not covered in the requirements.txt. Adding a file specifying requirements for building the binary could help (e.g. build-requirements.txt) and adding a comment.

Run by Name

Please add this feature, I have some backups for photos by each year and my script run them step-by-step. I can't run it via built-in schedule for some reasons.
But after I create a new backup I should know the ID.
So please add this ability. May be I can make it by myself if you haven;t enough time, but I don't know neither your script well neither Python))))).

duplicati_client.exe - windows

The command:

duplicati_client.exe --help

returns:

Traceback (most recent call last):
File "duplicati_client.py", line 1111, in
AttributeError: module 'parser' has no attribute 'parser'
[20484] Failed to execute script duplicati_client

OS:

Windows 10 - no python or other components installed.

Unable to connect using https

I have Duplicati running on a mix of Windows and Linux (Raspbian, Fedora), and all their GUIs are connectable via https on port 8200. None of my instances can be logged into with duc:

"C:\Program Files\Duplicati 2\duplicati_client.exe" version
Duplicati client version 0.4.20

"C:\Program Files\Duplicati 2\duplicati_client.exe" login https://localhost:8200
Connecting to https://localhost:...
Server is not responding. Is it running?
Code: 503

I'm running Duplicati 2.0.4.22_canary_2019-06-30, I'm also using local CA signed certificates so they should be trusted on the machine I am running on - at least Firefox/IE seem to think so.

Doesn't handle a non-responsive server

@Pectojin
I'm guessing you've always had a working duplicati server when you run this. Below is the error you get if duplicati isn't running. I figured it might be helpful to document it for you.

Connecting to http://loopback:8200...
Traceback (most recent call last):
File "site-packages\urllib3\connection.py", line 141, in _new_conn
File "site-packages\urllib3\util\connection.py", line 83, in create_connection
File "site-packages\urllib3\util\connection.py", line 73, in create_connection
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "site-packages\urllib3\connectionpool.py", line 601, in urlopen
File "site-packages\urllib3\connectionpool.py", line 357, in _make_request
File "http\client.py", line 1239, in request
File "http\client.py", line 1285, in _send_request
File "http\client.py", line 1234, in endheaders
File "http\client.py", line 1026, in _send_output
File "http\client.py", line 964, in send
File "site-packages\urllib3\connection.py", line 166, in connect
File "site-packages\urllib3\connection.py", line 150, in _new_conn
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x059A1D30>: Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "site-packages\requests\adapters.py", line 440, in send
File "site-packages\urllib3\connectionpool.py", line 639, in urlopen
File "site-packages\urllib3\util\retry.py", line 388, in increment
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='loopback', port=8200): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x059A1D30>: Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it',))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "duplicati_client.py", line 1453, in
File "duplicati_client.py", line 89, in main
File "duplicati_client.py", line 744, in login
File "site-packages\requests\api.py", line 72, in get
File "site-packages\requests\api.py", line 58, in request
File "site-packages\requests\sessions.py", line 508, in request
File "site-packages\requests\sessions.py", line 618, in send
File "site-packages\requests\adapters.py", line 508, in send
requests.exceptions.ConnectionError: HTTPConnectionPool(host='loopback', port=8200): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x059A1D30>: Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it',))
[8380] Failed to execute script duplicati_client

Can't get duc to run from a Duplicati job's batch script

I'm trying to get duc to perform a specific backup at the end of my main backups (Windows) - basically it's a job to separately back up the Duplicati databases whenever a backup completes.

Currently I have simply exported the backup job and added it to the batch script that gets run at the end of the main jobs. This works well but has 2 draw backs, it's insecure as the credentials are all there and it doesn't update the job last run info in the GUI. Hence trying to use duc.

When it runs the batch script the process gets stuck, in fact there seems to be two processes spawned with the same command line parameters. Duplicati runs as a service using the local system account and if I use a tool like "psexec" to spawn a local systsem account cmd prompt, I can run my commands so I know the syntax is good.

I'm not sure if this is related but I did notice that like Duplicati, duc stores the config in the profile folder but for the local system account this is in a bad location under "system32" - it's better practice to use the "ProgramData" folder. I did however see that even with my test the folder in system32 never got created and I have no idea why.

Problem when importing a json file with unicode characters

Hello.
While trying to import a json file as a backup, I received the "Failed to load file as JSON" error.
The problem can be reproducing by importing a json backup file with any unicode text (backup name or source folder) such as "テスト".

I tested this small change and it fixes the problem for my use case. I didn't check the full source code so there might be other places that need a similar fix.
Onurtag@f22f409

Thanks for developing duplicati-client. I am using it with my small python script.
Stay safe.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.