diff --git a/README.md b/README.md index f9b4b1c8..cdb9a499 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ This client is a 'fork' of the [skilion](https://github.com/skilion/onedrive) cl * Dry-run capability to test configuration changes * Prevent major OneDrive accidental data deletion after configuration change * Support for National cloud deployments (Microsoft Cloud for US Government, Microsoft Cloud Germany, Azure and Office 365 operated by 21Vianet in China) +* Supports single & multi-tenanted applications +* Supports rate limiting of traffic ## What's missing * While local changes are uploaded right away, remote changes are delayed until next automated sync cycle when using --monitor diff --git a/docs/Docker.md b/docs/Docker.md index c060864e..fa6f711a 100644 --- a/docs/Docker.md +++ b/docs/Docker.md @@ -61,24 +61,26 @@ export ONEDRIVE_DATA_DIR="${HOME}/OneDrive" mkdir -p ${ONEDRIVE_DATA_DIR} docker run -it --name onedrive -v onedrive_conf:/onedrive/conf \ -v "${ONEDRIVE_DATA_DIR}:/onedrive/data" \ - -e "ONEDRIVE_UID:${ONEDRIVE_UID}" \ - -e "ONEDRIVE_GID:${ONEDRIVE_GID}" \ + -e "ONEDRIVE_UID=${ONEDRIVE_UID}" \ + -e "ONEDRIVE_GID=${ONEDRIVE_GID}" \ driveone/onedrive:latest ``` -**NOTE:** It is also highly advisable for you to replace `${ONEDRIVE_UID}` and `${ONEDRIVE_GID}` with your actual UID and GID as specified by your `id` command output to avoid any any potential user or group conflicts. - **Important:** The 'target' folder of `ONEDRIVE_DATA_DIR` must exist before running the Docker container, otherwise, Docker will create the target folder, and the folder will be given 'root' permissions, which then causes the Docker container to fail upon startup with the following error message: ```bash ROOT level privileges prohibited! ``` +**NOTE:** It is also highly advisable for you to replace `${ONEDRIVE_UID}` and `${ONEDRIVE_GID}` with your actual UID and GID as specified by your `id` command output to avoid any any potential user or group conflicts. **Example:** -``` +```bash export ONEDRIVE_UID=`id -u` export ONEDRIVE_GID=`id -g` -docker run -it --name onedrive -v onedrive_conf:/onedrive/conf -v "${ONEDRIVE_DATA_DIR}:/onedrive/data" \ - -e "ONEDRIVE_UID:${ONEDRIVE_UID}" \ - -e "ONEDRIVE_GID:${ONEDRIVE_GID}" \ +export ONEDRIVE_DATA_DIR="${HOME}/OneDrive" +mkdir -p ${ONEDRIVE_DATA_DIR} +docker run -it --name onedrive -v onedrive_conf:/onedrive/conf \ + -v "${ONEDRIVE_DATA_DIR}:/onedrive/data" \ + -e "ONEDRIVE_UID=${ONEDRIVE_UID}" \ + -e "ONEDRIVE_GID=${ONEDRIVE_GID}" \ driveone/onedrive:latest ``` diff --git a/docs/USAGE.md b/docs/USAGE.md index e74b94da..56ad6d01 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -43,7 +43,7 @@ * [OneDrive service running as a non-root user via systemd (with notifications enabled) (Arch, Ubuntu, Debian, OpenSuSE, Fedora)](#onedrive-service-running-as-a-non-root-user-via-systemd-with-notifications-enabled-arch-ubuntu-debian-opensuse-fedora) * [OneDrive service running as a non-root user via runit (antiX, Devuan, Artix, Void)](#onedrive-service-running-as-a-non-root-user-via-runit-antix-devuan-artix-void) - [Additional Configuration](#additional-configuration) - * [Using multiple OneDrive accounts](#using-multiple-onedrive-accounts) + * [Advanced Configuration of the OneDrive Free Client](#advanced-configuration-of-the-onedrive-free-client) * [Access OneDrive service through a proxy](#access-onedrive-service-through-a-proxy) * [Setup selinux for a sync folder outside of the home folder](#setup-selinux-for-a-sync-folder-outside-of-the-home-folder) - [All available commands](#all-available-commands) @@ -853,7 +853,11 @@ You may refer to Void's documentation regarding for extra details. ## Additional Configuration -### Using multiple OneDrive accounts +### Advanced Configuration of the OneDrive Free Client +* Configuring the client to use mulitple OneDrive accounts / configurations +* Configuring the client for use in dual-boot (Windows / Linux) situations +* Configuring the client for use when 'sync_dir' is a mounted directory + Refer to [./advanced-usage.md](advanced-usage.md) for configuration assistance. ### Access OneDrive service through a proxy diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index fa58d690..1cab65c8 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -2,6 +2,7 @@ This document covers the following scenarios: * Configuring the client to use mulitple OneDrive accounts / configurations * Configuring the client for use in dual-boot (Windows / Linux) situations +* Configuring the client for use when 'sync_dir' is a mounted directory ## Configuring the client to use mulitple OneDrive accounts / configurations Essentially, each OneDrive account or SharePoint Shared Library which you require to be synced needs to have its own and unique configuration, local sync directory and service files. To do this, the following steps are needed: @@ -137,3 +138,34 @@ After unchecking the option and clicking "OK", the Windows OneDrive client shoul | OneDrive Personal | Onedrive Business
SharePoint | |---|---| | ![Uncheck-Personal](./images/personal-files-on-demand.png) | ![Uncheck-Business](./images/business-files-on-demand.png) | + +## Configuring the client for use when 'sync_dir' is a mounted directory +In some environments, your setup might be that your configured 'sync_dir' is pointing to another mounted file system - a NFS|CIFS location, an external drive (USB stuc, eSATA etc). As such, you configure your 'sync_dir' as follows: +```text +sync_dir = "/path/to/mountpoint/OneDrive" +``` + +The issue here is - how does the client react if the mount point gets removed - network loss, device removal? + +The client has zero knowledge of any event that causes a mountpoint to become unavailable, thus, the client (if you are running as a service) will assume that you deleted the files, thus, will go ahead and delete all your files on OneDrive. This is most certainly an undesirable action. + +There are a few options here which you can configure in your 'config' file to assist you to prevent this sort of item from occuring: +1. classify_as_big_delete +2. check_nomount +3. check_nosync + +**Note:** Before making any change to your configuration, stop any sync process & stop any onedrive systemd service from running. + +### classify_as_big_delete +By default, this uses a value of 1000 files|folders. An undesirable unmount if you have more than 1000 files, this default level will prevent the client from executing the online delete. Modify this value up or down as desired + +### check_nomount & check_nosync +These two options are really the right safe guards to use. + +In your 'mount point', *before* you mount your external folder|device, create empty `.nosync` file, so that this is the *only* file present in the mount location before you mount your data to your mount point. When you mount your data, this '.nosync' file will not be visible, but, if the device you are mounting goes away - this '.nosync' file is the only file visible. + +Next, in your 'config' file, configure the following options: `check_nomount = "true"` and `check_nosync = "true"` + +What this will do is tell the client, if at *any* point you see this file - stop syncing - thus, protecting your online data from being deleted by the mounted device being suddenly unavailable. + +After making this sort of change - test with `--dry-run` so you can see the impacts of your mount point being unavailable, and how the client is now reacting. Once you are happy with how the system will react, restart your sync processes. diff --git a/src/onedrive.d b/src/onedrive.d index 64ec162f..46f82f07 100644 --- a/src/onedrive.d +++ b/src/onedrive.d @@ -433,7 +433,7 @@ final class OneDriveApi { import std.stdio, std.regex; char[] response; - string url = authUrl ~ "?client_id=" ~ clientId ~ "&scope=Files.ReadWrite%20Files.ReadWrite.all%20Sites.Read.All%20Sites.ReadWrite.All%20offline_access&response_type=code&redirect_uri=" ~ redirectUrl; + string url = authUrl ~ "?client_id=" ~ clientId ~ "&scope=Files.ReadWrite%20Files.ReadWrite.all%20Sites.Read.All%20Sites.ReadWrite.All%20offline_access&response_type=code&prompt=login&redirect_uri=" ~ redirectUrl; string authFilesString = cfg.getValueString("auth_files"); if (authFilesString == "") { log.log("Authorize this app visiting:\n");