mirror of
https://github.com/abraunegg/onedrive
synced 2024-06-08 00:42:13 +02:00
Update PR from 'master'
* Update PR from 'master' and fix conflicts
This commit is contained in:
commit
fb3986cb05
2
.github/FUNDING.yml
vendored
Normal file
2
.github/FUNDING.yml
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
github: abraunegg
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -8,3 +8,4 @@ config.log
|
|||
config.status
|
||||
autom4te.cache/
|
||||
contrib/pacman/PKGBUILD
|
||||
contrib/spec/onedrive.spec
|
||||
|
|
39
CHANGELOG.md
39
CHANGELOG.md
|
@ -2,6 +2,45 @@
|
|||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## 2.4.15 - 2021-12-31
|
||||
### Fixed
|
||||
* Fix unable to upload to OneDrive Business Shared Folders due to OneDrive API restricting quota information
|
||||
* Update fixing edge case with OneDrive Personal Shared Folders and --resync --upload-only
|
||||
|
||||
### Added
|
||||
* Add SystemD hardening
|
||||
* Add --operation-timeout argument
|
||||
|
||||
### Changed
|
||||
* Updated minimum compiler versions to dmd-2.087.0 and ldc-1.17.0
|
||||
|
||||
### Updated
|
||||
* Updated Dockerfile-alpine to use Apline 3.14
|
||||
* Updated documentation (various)
|
||||
|
||||
## 2.4.14 - 2021-11-24
|
||||
### Fixed
|
||||
* Support DMD 2.097.0 as compiler for Docker Builds
|
||||
* Fix getPathDetailsByDriveId query when using --dry-run and a nested path with --single-directory
|
||||
* Fix edge case when syncing OneDrive Personal Shared Folders
|
||||
* Catch unhandled API response errors when querying OneDrive Business Shared Folders
|
||||
* Catch unhandled API response errors when listing OneDrive Business Shared Folders
|
||||
* Fix error 'Key not found: remaining' with Business Shared Folders (OneDrive API change)
|
||||
* Fix overwriting local files with older versions from OneDrive when items.sqlite3 does not exist and --resync is not used
|
||||
|
||||
### Added
|
||||
* Added operation_timeout as a new configuration to assist in cases where operations take longer that 1h to complete
|
||||
* Add Real-Time syncing of remote updates via webhooks
|
||||
* Add --auth-response option and expose through entrypoint.sh for Docker
|
||||
* Add --disable-download-validation
|
||||
|
||||
### Changed
|
||||
* Always prompt for credentials for authentication rather than re-using cached browser details
|
||||
* Do not re-auth on --logout
|
||||
|
||||
### Updated
|
||||
* Updated documentation (various)
|
||||
|
||||
## 2.4.13 - 2021-7-14
|
||||
### Fixed
|
||||
* Support DMD 2.097.0 as compiler
|
||||
|
|
|
@ -79,6 +79,7 @@ SOURCES = \
|
|||
src/upload.d \
|
||||
src/util.d \
|
||||
src/progress.d \
|
||||
src/arsd/cgi.d \
|
||||
src/translations.d
|
||||
|
||||
ifeq ($(NOTIFICATIONS),yes)
|
||||
|
@ -124,7 +125,7 @@ else
|
|||
ifeq ($(RHEL_VERSION),6)
|
||||
install -D contrib/init.d/onedrive.init $(DESTDIR)/etc/init.d/onedrive
|
||||
install -D contrib/init.d/onedrive_service.sh $(DESTDIR)$(bindir)/onedrive_service.sh
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
ifeq ($(COMPLETIONS),yes)
|
||||
$(INSTALL) -D -m 644 contrib/completions/complete.zsh $(DESTDIR)$(ZSH_COMPLETION_DIR)/_onedrive
|
||||
|
@ -156,5 +157,3 @@ ifeq ($(COMPLETIONS),yes)
|
|||
rm -f $(DESTDIR)$(BASH_COMPLETION_DIR)/onedrive
|
||||
rm -f $(DESTDIR)$(FISH_COMPLETION_DIR)/onedrive.fish
|
||||
endif
|
||||
|
||||
|
||||
|
|
|
@ -13,7 +13,8 @@ This client is a 'fork' of the [skilion](https://github.com/skilion/onedrive) cl
|
|||
|
||||
## Features
|
||||
* State caching
|
||||
* Real-Time file monitoring with Inotify
|
||||
* Real-Time local file monitoring with inotify
|
||||
* Real-Time syncing of remote updates via webhooks
|
||||
* File upload / download validation to ensure data integrity
|
||||
* Resumable uploads
|
||||
* Support OneDrive for Business (part of Office 365)
|
||||
|
@ -27,7 +28,6 @@ This client is a 'fork' of the [skilion](https://github.com/skilion/onedrive) cl
|
|||
* 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
|
||||
* Ability to encrypt/decrypt files on-the-fly when uploading/downloading files from OneDrive
|
||||
* Support for Windows 'On-Demand' functionality so file is only downloaded when accessed locally
|
||||
* A GUI for configuration management
|
||||
|
|
10
config
10
config
|
@ -35,10 +35,18 @@
|
|||
# skip_dir_strict_match = "false"
|
||||
# application_id = ""
|
||||
# resync = "false"
|
||||
# resync_auth = "false"
|
||||
# bypass_data_preservation = "false"
|
||||
# azure_ad_endpoint = ""
|
||||
# azure_tenant_id = "common"
|
||||
# sync_business_shared_folders = "false"
|
||||
# sync_dir_permissions = "700"
|
||||
# sync_file_permissions = "600"
|
||||
# rate_limit = "131072"
|
||||
# rate_limit = "131072"
|
||||
# operation_timeout = "3600"
|
||||
# webhook_enabled = "false"
|
||||
# webhook_public_url = ""
|
||||
# webhook_listening_host = ""
|
||||
# webhook_listening_port = "8888"
|
||||
# webhook_expiration_interval = "86400"
|
||||
# webhook_renewal_interval = "43200"
|
||||
|
|
24
configure
vendored
24
configure
vendored
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.69 for onedrive v2.4.14-dev.
|
||||
# Generated by GNU Autoconf 2.69 for onedrive v2.4.16-dev.
|
||||
#
|
||||
# Report bugs to <https://github.com/abraunegg/onedrive>.
|
||||
#
|
||||
|
@ -579,8 +579,8 @@ MAKEFLAGS=
|
|||
# Identity of this package.
|
||||
PACKAGE_NAME='onedrive'
|
||||
PACKAGE_TARNAME='onedrive'
|
||||
PACKAGE_VERSION='v2.4.14-dev'
|
||||
PACKAGE_STRING='onedrive v2.4.14-dev'
|
||||
PACKAGE_VERSION='v2.4.16-dev'
|
||||
PACKAGE_STRING='onedrive v2.4.16-dev'
|
||||
PACKAGE_BUGREPORT='https://github.com/abraunegg/onedrive'
|
||||
PACKAGE_URL=''
|
||||
|
||||
|
@ -1219,7 +1219,7 @@ if test "$ac_init_help" = "long"; then
|
|||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures onedrive v2.4.14-dev to adapt to many kinds of systems.
|
||||
\`configure' configures onedrive v2.4.16-dev to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
|
@ -1280,7 +1280,7 @@ fi
|
|||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of onedrive v2.4.14-dev:";;
|
||||
short | recursive ) echo "Configuration of onedrive v2.4.16-dev:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
|
@ -1393,7 +1393,7 @@ fi
|
|||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
onedrive configure v2.4.14-dev
|
||||
onedrive configure v2.4.16-dev
|
||||
generated by GNU Autoconf 2.69
|
||||
|
||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
|
@ -1410,7 +1410,7 @@ cat >config.log <<_ACEOF
|
|||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by onedrive $as_me v2.4.14-dev, which was
|
||||
It was created by onedrive $as_me v2.4.16-dev, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
|
@ -2133,7 +2133,7 @@ case $(basename $DC) in
|
|||
# remove everthing after ):
|
||||
VERSION=${VERSION%%):*}
|
||||
# now version should be something like L.M.N
|
||||
MINVERSION=1.12.0
|
||||
MINVERSION=1.17.0
|
||||
;;
|
||||
dmd)
|
||||
# DMD64 D Compiler v2.085.1\n...
|
||||
|
@ -2141,7 +2141,7 @@ case $(basename $DC) in
|
|||
VERSION=${VERSION#*Compiler v}
|
||||
VERSION=${VERSION%% *}
|
||||
# now version should be something like L.M.N
|
||||
MINVERSION=2.083.1
|
||||
MINVERSION=2.087.0
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@ -2162,7 +2162,7 @@ fi
|
|||
|
||||
|
||||
|
||||
PACKAGE_DATE="July 2021"
|
||||
PACKAGE_DATE="January 2022"
|
||||
|
||||
|
||||
|
||||
|
@ -3159,7 +3159,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by onedrive $as_me v2.4.14-dev, which was
|
||||
This file was extended by onedrive $as_me v2.4.16-dev, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
|
@ -3212,7 +3212,7 @@ _ACEOF
|
|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
onedrive config.status v2.4.14-dev
|
||||
onedrive config.status v2.4.16-dev
|
||||
configured by $0, generated by GNU Autoconf 2.69,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ dnl - commit the changed files (configure.ac, configure)
|
|||
dnl - tag the release
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([onedrive],[v2.4.14-dev], [https://github.com/abraunegg/onedrive], [onedrive])
|
||||
AC_INIT([onedrive],[v2.4.16-dev], [https://github.com/abraunegg/onedrive], [onedrive])
|
||||
AC_CONFIG_SRCDIR([src/main.d])
|
||||
|
||||
|
||||
|
@ -104,7 +104,7 @@ case $(basename $DC) in
|
|||
# remove everthing after ):
|
||||
VERSION=${VERSION%%):*}
|
||||
# now version should be something like L.M.N
|
||||
MINVERSION=1.12.0
|
||||
MINVERSION=1.17.0
|
||||
;;
|
||||
dmd)
|
||||
# DMD64 D Compiler v2.085.1\n...
|
||||
|
@ -112,7 +112,7 @@ case $(basename $DC) in
|
|||
VERSION=${VERSION#*Compiler v}
|
||||
VERSION=${VERSION%% *}
|
||||
# now version should be something like L.M.N
|
||||
MINVERSION=2.083.1
|
||||
MINVERSION=2.087.0
|
||||
;;
|
||||
esac
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ _onedrive()
|
|||
prev=${COMP_WORDS[COMP_CWORD-1]}
|
||||
|
||||
options='--check-for-nomount --check-for-nosync --debug-https --disable-notifications --display-config --display-sync-status --download-only --disable-upload-validation --dry-run --enable-logging --force-http-1.1 --force-http-2 --local-first --logout -m --monitor --no-remote-delete --print-token --resync --skip-dot-files --skip-symlinks --synchronize --upload-only -v --verbose --version -h --help'
|
||||
argopts='--create-directory --get-O365-drive-id --remove-directory --single-directory --source-directory'
|
||||
argopts='--create-directory --get-O365-drive-id --operation-timeout --remove-directory --single-directory --source-directory'
|
||||
|
||||
# Loop on the arguments to manage conflicting options
|
||||
for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
|
||||
|
@ -27,7 +27,7 @@ _onedrive()
|
|||
_filedir
|
||||
return 0
|
||||
;;
|
||||
--create-directory|--get-O365-drive-id|--remove-directory|--single-directory|--source-directory)
|
||||
--create-directory|--get-O365-drive-id|--operation-timeout|--remove-directory|--single-directory|--source-directory)
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
|
@ -22,6 +22,7 @@ complete -c onedrive -l local-first -d 'Synchronize from the local directory sou
|
|||
complete -c onedrive -l logout -d 'Logout the current user.'
|
||||
complete -c onedrive -n "not __fish_seen_subcommand_from --synchronize" -a "-m --monitor" -d 'Keep monitoring for local and remote changes.'
|
||||
complete -c onedrive -l no-remote-delete -d 'Do not delete local file deletes from OneDrive when using --upload-only.'
|
||||
complete -c onedrive -l operation-timeout -d 'Specify the maximum amount of time (in seconds) an operation is allowed to take.'
|
||||
complete -c onedrive -l print-token -d 'Print the access token, useful for debugging.'
|
||||
complete -c onedrive -l remote-directory -d 'Remove a directory on OneDrive - no sync will be performed.'
|
||||
complete -c onedrive -l resync -d 'Forget the last saved state, perform a full sync.'
|
||||
|
|
|
@ -26,6 +26,7 @@ all_opts=(
|
|||
'--logout[Logout the current user]'
|
||||
'(-m --monitor)'{-m,--monitor}'[Keep monitoring for local and remote changes]'
|
||||
'--no-remote-delete[Do not delete local file deletes from OneDrive when using --upload-only]'
|
||||
'--operation-timeout[Specify the maximum amount of time (in seconds) an operation is allowed to take.]:seconds:'
|
||||
'--print-token[Print the access token, useful for debugging]'
|
||||
'--resync[Forget the last saved state, perform a full sync]'
|
||||
'--remove-directory[Remove a directory on OneDrive - no sync will be performed.]:directory name:'
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
FROM debian:stretch
|
||||
RUN apt update && \
|
||||
apt install -y build-essential curl libcurl4-openssl-dev libsqlite3-dev pkg-config wget git
|
||||
RUN wget https://github.com/ldc-developers/ldc/releases/download/v1.16.0/ldc2-1.16.0-linux-aarch64.tar.xz && \
|
||||
tar -xvf ldc2-1.16.0-linux-aarch64.tar.xz
|
||||
RUN wget https://github.com/ldc-developers/ldc/releases/download/v1.17.0/ldc2-1.17.0-linux-aarch64.tar.xz && \
|
||||
tar -xvf ldc2-1.17.0-linux-aarch64.tar.xz
|
||||
COPY . /usr/src/onedrive
|
||||
RUN cd /usr/src/onedrive/ && \
|
||||
./configure DC=/ldc2-1.16.0-linux-aarch64/bin/ldmd2 && \
|
||||
./configure DC=/ldc2-1.17.0-linux-aarch64/bin/ldmd2 && \
|
||||
make clean && \
|
||||
make && \
|
||||
make install
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# -*-Dockerfile-*-
|
||||
FROM alpine:3.13
|
||||
FROM alpine:3.14
|
||||
RUN apk add \
|
||||
alpine-sdk gnupg xz curl-dev sqlite-dev binutils-gold \
|
||||
autoconf automake ldc go
|
||||
|
@ -12,7 +12,7 @@ RUN cd /usr/src/onedrive/ && \
|
|||
make && \
|
||||
make install
|
||||
|
||||
FROM alpine:3.13
|
||||
FROM alpine:3.14
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
RUN apk add --no-cache \
|
||||
bash libcurl libgcc shadow sqlite-libs ldc-runtime && \
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
FROM debian:stretch
|
||||
RUN apt update && \
|
||||
apt install -y build-essential curl libcurl4-openssl-dev libsqlite3-dev pkg-config wget git
|
||||
RUN wget https://github.com/ldc-developers/ldc/releases/download/v1.16.0/ldc2-1.16.0-linux-armhf.tar.xz && \
|
||||
tar -xvf ldc2-1.16.0-linux-armhf.tar.xz
|
||||
RUN wget https://github.com/ldc-developers/ldc/releases/download/v1.17.0/ldc2-1.17.0-linux-armhf.tar.xz && \
|
||||
tar -xvf ldc2-1.17.0-linux-armhf.tar.xz
|
||||
COPY . /usr/src/onedrive
|
||||
RUN cd /usr/src/onedrive/ && \
|
||||
./configure DC=/ldc2-1.16.0-linux-armhf/bin/ldmd2 && \
|
||||
./configure DC=/ldc2-1.17.0-linux-armhf/bin/ldmd2 && \
|
||||
make clean && \
|
||||
make && \
|
||||
make install
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/bash -eu
|
||||
|
||||
set +H -xeuo pipefail
|
||||
set +H -euo pipefail
|
||||
|
||||
: ${ONEDRIVE_UID:=$(stat /onedrive/data -c '%u')}
|
||||
: ${ONEDRIVE_GID:=$(stat /onedrive/data -c '%g')}
|
||||
|
@ -27,46 +27,67 @@ chown "${oduser}:${odgroup}" /onedrive/ /onedrive/conf
|
|||
|
||||
# Default parameters
|
||||
ARGS=(--monitor --confdir /onedrive/conf --syncdir /onedrive/data)
|
||||
echo "Base Args: ${ARGS}"
|
||||
|
||||
# Make Verbose output optional, based on an environment variable
|
||||
if [ "${ONEDRIVE_VERBOSE:=0}" == "1" ]; then
|
||||
echo "# We are being verbose"
|
||||
echo "# Adding --verbose"
|
||||
ARGS=(--verbose ${ARGS[@]})
|
||||
fi
|
||||
|
||||
# Tell client to perform debug output, based on an environment variable
|
||||
if [ "${ONEDRIVE_DEBUG:=0}" == "1" ]; then
|
||||
echo "# We are performing debug output"
|
||||
echo "# Adding --verbose --verbose"
|
||||
ARGS=(--verbose --verbose ${ARGS[@]})
|
||||
fi
|
||||
|
||||
# Tell client to perform HTTPS debug output, based on an environment variable
|
||||
if [ "${ONEDRIVE_DEBUG_HTTPS:=0}" == "1" ]; then
|
||||
echo "# We are performing HTTPS debug output"
|
||||
echo "# Adding --debug-https"
|
||||
ARGS=(--debug-https ${ARGS[@]})
|
||||
fi
|
||||
|
||||
# Tell client to perform a resync based on environment variable
|
||||
if [ "${ONEDRIVE_RESYNC:=0}" == "1" ]; then
|
||||
echo "# We are performing a --resync"
|
||||
ARGS=(--resync ${ARGS[@]})
|
||||
echo "# Adding --resync --resync-auth"
|
||||
ARGS=(--resync --resync-auth ${ARGS[@]})
|
||||
fi
|
||||
|
||||
# Tell client to sync in download-only mode based on environment variable
|
||||
if [ "${ONEDRIVE_DOWNLOADONLY:=0}" == "1" ]; then
|
||||
echo "# We are synchronizing in download-only mode"
|
||||
echo "# Adding --download-only"
|
||||
ARGS=(--download-only ${ARGS[@]})
|
||||
fi
|
||||
|
||||
# Tell client to logout based on environment variable
|
||||
if [ "${ONEDRIVE_LOGOUT:=0}" == "1" ]; then
|
||||
echo "# We are logging out to perform a reauthentication"
|
||||
echo "# Adding --logout"
|
||||
ARGS=(--logout ${ARGS[@]})
|
||||
fi
|
||||
|
||||
# Tell client to utilize auth files at the provided locations based on environment variable
|
||||
if [ -n "${ONEDRIVE_AUTHFILES:=""}" ]; then
|
||||
echo "# We are using auth files to perform authentication"
|
||||
echo "# Adding --auth-files ARG"
|
||||
ARGS=(--auth-files ${ONEDRIVE_AUTHFILES} ${ARGS[@]})
|
||||
fi
|
||||
|
||||
# Tell client to utilize provided auth reponse based on environment variable
|
||||
if [ -n "${ONEDRIVE_AUTHRESPONSE:=""}" ]; then
|
||||
echo "# We are providing the auth response directly to perform authentication"
|
||||
echo "# Adding --auth-response ARG"
|
||||
ARGS=(--auth-response \"${ONEDRIVE_AUTHRESPONSE}\" ${ARGS[@]})
|
||||
fi
|
||||
|
||||
if [ ${#} -gt 0 ]; then
|
||||
ARGS=("${@}")
|
||||
fi
|
||||
|
||||
echo "# Launching onedrive"
|
||||
exec gosu "${oduser}" /usr/local/bin/onedrive "${ARGS[@]}"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
%endif
|
||||
|
||||
Name: onedrive
|
||||
Version: 2.4.13
|
||||
Version: 2.4.15
|
||||
Release: 1%{?dist}
|
||||
Summary: Microsoft OneDrive Client
|
||||
Group: System Environment/Network
|
||||
|
@ -15,7 +15,7 @@ URL: https://github.com/abraunegg/onedrive
|
|||
Source0: v%{version}.tar.gz
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
|
||||
BuildRequires: dmd >= 2.083.0
|
||||
BuildRequires: dmd >= 2.087.0
|
||||
BuildRequires: sqlite-devel >= 3.7.15
|
||||
BuildRequires: libcurl-devel
|
||||
Requires: sqlite >= 3.7.15
|
||||
|
|
|
@ -5,6 +5,17 @@ After=network-online.target
|
|||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
# Commented out hardenings are disabled because they don't work out of the box.
|
||||
# If you know what you are doing please try to enable them.
|
||||
ProtectSystem=full
|
||||
#PrivateDevices=true
|
||||
ProtectHostname=true
|
||||
#ProtectClock=true
|
||||
ProtectKernelTunables=true
|
||||
#ProtectKernelModules=true
|
||||
#ProtectKernelLogs=true
|
||||
ProtectControlGroups=true
|
||||
RestrictRealtime=true
|
||||
ExecStart=@prefix@/bin/onedrive --monitor
|
||||
Restart=on-failure
|
||||
RestartSec=3
|
||||
|
|
|
@ -5,6 +5,17 @@ After=network-online.target
|
|||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
# Commented out hardenings are disabled because they don't work out of the box.
|
||||
# If you know what you are doing please try to enable them.
|
||||
ProtectSystem=full
|
||||
#PrivateDevices=true
|
||||
ProtectHostname=true
|
||||
#ProtectClock=true
|
||||
ProtectKernelTunables=true
|
||||
#ProtectKernelModules=true
|
||||
#ProtectKernelLogs=true
|
||||
ProtectControlGroups=true
|
||||
RestrictRealtime=true
|
||||
ExecStart=@prefix@/bin/onedrive --monitor --confdir=/home/%i/.config/onedrive
|
||||
User=%i
|
||||
Group=users
|
||||
|
|
|
@ -195,6 +195,8 @@ docker run $firstRun --restart unless-stopped --name onedrive -v onedrive_conf:/
|
|||
| <B>ONEDRIVE_RESYNC</B> | Controls "--resync" switch on onedrive sync. Default is 0 | 1 |
|
||||
| <B>ONEDRIVE_DOWNLOADONLY</B> | Controls "--download-only" switch on onedrive sync. Default is 0 | 1 |
|
||||
| <B>ONEDRIVE_LOGOUT</B> | Controls "--logout" switch. Default is 0 | 1 |
|
||||
| <B>ONEDRIVE_AUTHFILES</B> | Controls "--auth-files" option. Default is "" | "authUrl:responseUrl" |
|
||||
| <B>ONEDRIVE_AUTHRESPONSE</B> | Controls "--auth-response" option. Default is "" | See [here](https://github.com/abraunegg/onedrive/blob/master/docs/USAGE.md#authorize-the-application-with-your-onedrive-account) |
|
||||
|
||||
### Usage Examples
|
||||
**Verbose Output:**
|
||||
|
|
|
@ -12,7 +12,7 @@ Distribution packages may be of an older release when compared to the latest rel
|
|||
|---------------------------------|------------------------------------------------------------------------------|:---------------:|:----:|:------:|:-----:|:-------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| Alpine Linux | [onedrive](https://pkgs.alpinelinux.org/packages?name=onedrive&branch=edge) |<a href="https://pkgs.alpinelinux.org/packages?name=onedrive&branch=edge"><img src="https://repology.org/badge/version-for-repo/alpine_edge/onedrive.svg?header=" alt="Alpine Linux Edge package" width="46" height="20"></a>|❌|✔|❌|✔ | |
|
||||
| Arch Linux<br><br>Manjaro Linux | [onedrive-abraunegg](https://aur.archlinux.org/packages/onedrive-abraunegg/) |<a href="https://aur.archlinux.org/packages/onedrive-abraunegg"><img src="https://repology.org/badge/version-for-repo/aur/onedrive-abraunegg.svg?header=" alt="AUR package" width="46" height="20"></a>|✔|✔|✔|✔ | Install via: `pamac build onedrive-abraunegg` from the Arch Linux User Repository (AUR)<br><br>**Note:** If asked regarding a provider for 'd-runtime' and 'd-compiler', select 'liblphobos' and 'ldc'<br><br>**Note:** System must have at least 1GB of memory & 1GB swap space
|
||||
| Debian | [onedrive](https://packages.debian.org/search?keywords=onedrive) |<a href="https://packages.debian.org/search?keywords=onedrive"><img src="https://repology.org/badge/version-for-repo/debian_testing/onedrive.svg?header=" alt="Debian Testing package" width="46" height="20"></a>|✔|✔|✔|✔| It is recommended that for Debian that you install from OpenSuSE Build Service using the Debian Package Install [Instructions](ubuntu-package-install.md) |
|
||||
| Debian | [onedrive](https://packages.debian.org/search?keywords=onedrive) |<a href="https://packages.debian.org/search?keywords=onedrive"><img src="https://repology.org/badge/version-for-repo/debian_11/onedrive.svg?header=" alt="Debian package" width="46" height="20"></a>|✔|✔|✔|✔| It is recommended that for Debian that you install from OpenSuSE Build Service using the Debian Package Install [Instructions](ubuntu-package-install.md) |
|
||||
| Fedora | [onedrive](https://koji.fedoraproject.org/koji/packageinfo?packageID=26044) |<a href="https://koji.fedoraproject.org/koji/packageinfo?packageID=26044"><img src="https://repology.org/badge/version-for-repo/fedora_rawhide/onedrive.svg?header=" alt="Fedora Rawhide package" width="46" height="20"></a>|✔|✔|✔|✔| |
|
||||
| Gentoo | [onedrive](https://gpo.zugaina.org/net-misc/onedrive) | No API Available |✔|✔|❌|❌| |
|
||||
| NixOS | [onedrive](https://search.nixos.org/packages?channel=20.09&from=0&size=50&sort=relevance&query=onedrive)|<a href="https://search.nixos.org/packages?channel=20.09&from=0&size=50&sort=relevance&query=onedrive"><img src="https://repology.org/badge/version-for-repo/nix_unstable/onedrive.svg?header=" alt="nixpkgs unstable package" width="46" height="20"></a>|❌|✔|❌|❌| Use package `onedrive` either by adding it to `configuration.nix` or by using the command `nix-env -iA <channel name>.onedrive`. This does not install a service. To install a service, use unstable channel (will stabilize in 20.09) and add `services.onedrive.enable=true` in `configuration.nix`. You can also add a custom package using the `services.onedrive.package` option (recommended since package lags upstream). Enabling the service installs a default package too (based on the channel). You can also add multiple onedrive accounts trivially, see [documentation](https://github.com/NixOS/nixpkgs/pull/77734#issuecomment-575874225). |
|
||||
|
@ -23,8 +23,9 @@ Distribution packages may be of an older release when compared to the latest rel
|
|||
| Solus | [onedrive](https://dev.getsol.us/search/query/FB7PIf1jG9Z9/#R) |<a href="https://dev.getsol.us/search/query/FB7PIf1jG9Z9/#R"><img src="https://repology.org/badge/version-for-repo/solus/onedrive.svg?header=" alt="Solus package" width="46" height="20"></a>|✔|✔|❌|❌| |
|
||||
| Ubuntu 18.04 | [onedrive](https://packages.ubuntu.com/bionic/onedrive) |<a href="https://packages.ubuntu.com/bionic/onedrive"><img src="https://repology.org/badge/version-for-repo/ubuntu_18_04/onedrive.svg?header=" alt="Ubuntu 18.04 package" width="88" height="20"></a> |✔|✔|✔|❌| **Note:** Do not install from Ubuntu Universe<br><br>You must compile from source for this version of Ubuntu |
|
||||
| Ubuntu 20.04 | [onedrive](https://packages.ubuntu.com/focal/onedrive) |<a href="https://packages.ubuntu.com/focal/onedrive"><img src="https://repology.org/badge/version-for-repo/ubuntu_20_04/onedrive.svg?header=" alt="Ubuntu 20.04 package" width="46" height="20"></a> |❌|✔|✔|✔| **Note:** Do not install from Ubuntu Universe<br><br>Install from OpenSuSE Build Service using the Ubuntu Package Install [Instructions](ubuntu-package-install.md) |
|
||||
| Ubuntu 20.10 | [onedrive](https://packages.ubuntu.com/groovy/onedrive) |<a href="https://packages.ubuntu.com/groovy/onedrive"><img src="https://repology.org/badge/version-for-repo/ubuntu_20_10/onedrive.svg?header=" alt="Ubuntu 20.10 package" width="46" height="20"></a> |❌|✔|✔|✔| **Note:** Do not install from Ubuntu Universe<br><br>Install from OpenSuSE Build Service using the Ubuntu Package Install [Instructions](ubuntu-package-install.md) |
|
||||
| Ubuntu 21.04 | [onedrive](https://packages.ubuntu.com/hirsute/onedrive) |<a href="https://packages.ubuntu.com/hirsute/onedrive"><img src="https://repology.org/badge/version-for-repo/ubuntu_21_04/onedrive.svg?header=" alt="Ubuntu 21.04 package" width="46" height="20"></a> |❌|✔|✔|✔| **Note:** Do not install from Ubuntu Universe<br><br>Install from OpenSuSE Build Service using the Ubuntu Package Install [Instructions](ubuntu-package-install.md) |
|
||||
| Ubuntu 21.10 | [onedrive](https://packages.ubuntu.com/impish/onedrive) |<a href="https://packages.ubuntu.com/impish/onedrive"><img src="https://repology.org/badge/version-for-repo/ubuntu_21_10/onedrive.svg?header=" alt="Ubuntu 21.10 package" width="46" height="20"></a> |❌|✔|✔|✔| **Note:** Do not install from Ubuntu Universe<br><br>Install from OpenSuSE Build Service using the Ubuntu Package Install [Instructions](ubuntu-package-install.md) |
|
||||
| Ubuntu 22.04 | [onedrive](https://packages.ubuntu.com/jammy/onedrive) |<a href="https://packages.ubuntu.com/jammy/onedrive"><img src="https://repology.org/badge/version-for-repo/ubuntu_22_04/onedrive.svg?header=" alt="Ubuntu 22.04 package" width="46" height="20"></a> |❌|✔|✔|✔| **Note:** Do not install from Ubuntu Universe<br><br>Install from OpenSuSE Build Service using the Ubuntu Package Install [Instructions](ubuntu-package-install.md) |
|
||||
| Void Linux | [onedrive](https://voidlinux.org/packages/?arch=x86_64&q=onedrive) |<a href="https://voidlinux.org/packages/?arch=x86_64&q=onedrive"><img src="https://repology.org/badge/version-for-repo/void_x86_64/onedrive.svg?header=" alt="Void Linux x86_64 package" width="46" height="20"></a>|✔|✔|❌|❌| |
|
||||
|
||||
#### Important information for all Ubuntu and Ubuntu based distribution users:
|
||||
|
@ -35,9 +36,9 @@ This information is specifically for the following platforms and distributions:
|
|||
* POP OS
|
||||
* Peppermint OS
|
||||
|
||||
Whilst there are [onedrive](https://packages.ubuntu.com/search?keywords=onedrive&searchon=names&suite=all§ion=all) packages available for Ubuntu, do not install 'onedrive' from these packages via `apt install onedrive`. The default Ubuntu Universe packages are out-of-date and are not supported and should not be used. If you wish to use a package, it is highly recommended that you utilise the [OpenSuSE Build Service](https://build.opensuse.org/project/show/home:npreining:debian-ubuntu-onedrive) to install packages for these platforms. If the OpenSuSE Build Service does not cater for your version, your only option is to build from source.
|
||||
Whilst there are [onedrive](https://packages.ubuntu.com/search?keywords=onedrive&searchon=names&suite=all§ion=all) Universe packages available for Ubuntu, do not install 'onedrive' from these Universe packages. The default Universe packages are out-of-date and are not supported and should not be used. If you wish to use a package, it is highly recommended that you utilise the [OpenSuSE Build Service](https://build.opensuse.org/project/show/home:npreining:debian-ubuntu-onedrive) to install packages for these platforms. If the OpenSuSE Build Service does not cater for your version, your only option is to build from source.
|
||||
|
||||
If you wish to change this situation so that you can just use 'apt install onedrive', consider becoming the Ubuntu package maintainer and contribute back to the community.
|
||||
If you wish to change this situation so that you can just use the Universe packages via 'apt install onedrive', consider becoming the Ubuntu package maintainer and contribute back to your community.
|
||||
|
||||
## Building from Source - High Level Requirements
|
||||
* Build environment must have at least 1GB of memory & 1GB swap space
|
||||
|
@ -46,7 +47,7 @@ If you wish to change this situation so that you can just use 'apt install onedr
|
|||
* [SQLite 3](https://www.sqlite.org/) >= 3.7.15
|
||||
* [Digital Mars D Compiler (DMD)](http://dlang.org/download.html) or [LDC – the LLVM-based D Compiler](https://github.com/ldc-developers/ldc)
|
||||
|
||||
**Note:** DMD version >= 2.083.1 or LDC version >= 1.12.0 is required to compile this application
|
||||
**Note:** DMD version >= 2.087.0 or LDC version >= 1.17.0 is required to compile this application
|
||||
|
||||
### Example for installing DMD Compiler
|
||||
```text
|
||||
|
@ -267,13 +268,13 @@ sudo zypper install libnotify-devel
|
|||
### Building using DMD Reference Compiler
|
||||
Before cloning and compiling, if you have installed DMD via curl for your OS, you will need to activate DMD as per example below:
|
||||
```text
|
||||
Run `source ~/dlang/dmd-2.081.1/activate` in your shell to use dmd-2.081.1.
|
||||
Run `source ~/dlang/dmd-2.087.0/activate` in your shell to use dmd-2.087.0.
|
||||
This will setup PATH, LIBRARY_PATH, LD_LIBRARY_PATH, DMD, DC, and PS1.
|
||||
Run `deactivate` later on to restore your environment.
|
||||
```
|
||||
Without performing this step, the compilation process will fail.
|
||||
|
||||
**Note:** Depending on your DMD version, substitute `2.081.1` above with your DMD version that is installed.
|
||||
**Note:** Depending on your DMD version, substitute `2.087.0` above with your DMD version that is installed.
|
||||
|
||||
```text
|
||||
git clone https://github.com/abraunegg/onedrive.git
|
||||
|
|
157
docs/USAGE.md
157
docs/USAGE.md
|
@ -26,7 +26,9 @@
|
|||
+ [skip_symlinks](#skip_symlinks)
|
||||
+ [monitor_interval](#monitor_interval)
|
||||
+ [min_notify_changes](#min_notify_changes)
|
||||
+ [Selective sync via 'sync_list' file](#selective-sync-via-sync_list-file)
|
||||
+ [operation_timeout](#operation_timeout)
|
||||
* [Performing a --resync](#performing-a---resync)
|
||||
* [Selective sync via 'sync_list' file](#selective-sync-via-sync_list-file)
|
||||
* [Configuring the client for 'single tenant application' use](#configuring-the-client-for-single-tenant-application-use)
|
||||
* [Configuring the client to use older 'skilion' application identifier](#configuring-the-client-to-use-older-skilion-application-identifier)
|
||||
* [How to 'skip' directories from syncing?](#how-to-skip-directories-from-syncing)
|
||||
|
@ -35,6 +37,10 @@
|
|||
* [Shared folders (OneDrive Business or Office 365)](#shared-folders-onedrive-business-or-office-365)
|
||||
* [SharePoint / Office 365 Shared Libraries](#sharepoint--office-365-shared-libraries)
|
||||
- [Running 'onedrive' in 'monitor' mode](#running-onedrive-in-monitor-mode)
|
||||
* [Use webhook to subscribe to remote updates in 'monitor' mode](#use-webhook-to-subscribe-to-remote-updates-in-monitor-mode)
|
||||
* [More webhook configuration options](#more-webhook-configuration-options)
|
||||
+ [webhook_listening_host and webhook_listening_port](#webhook_listening_host-and-webhook_listening_port)
|
||||
+ [webhook_expiration_interval and webhook_renewal_interval](#webhook_expiration_interval-and-webhook_renewal_interval)
|
||||
- [Running 'onedrive' as a system service](#running-onedrive-as-a-system-service)
|
||||
* [OneDrive service running as root user via init.d](#onedrive-service-running-as-root-user-via-initd)
|
||||
* [OneDrive service running as root user via systemd (Arch, Ubuntu, Debian, OpenSuSE, Fedora)](#onedrive-service-running-as-root-user-via-systemd-arch-ubuntu-debian-opensuse-fedora)
|
||||
|
@ -83,19 +89,19 @@ After installing the application you must authorize the application with your On
|
|||
|
||||
You will be asked to open a specific URL by using your web browser where you will have to login into your Microsoft Account and give the application the permission to access your files. After giving permission to the application, you will be redirected to a blank page. Copy the URI of the blank page into the application.
|
||||
```text
|
||||
[user@hostname ~]$ onedrive
|
||||
[user@hostname ~]$ onedrive
|
||||
|
||||
Authorize this app visiting:
|
||||
|
||||
https://.....
|
||||
|
||||
Enter the response uri:
|
||||
Enter the response uri:
|
||||
|
||||
```
|
||||
|
||||
**Example:**
|
||||
```
|
||||
[user@hostname ~]$ onedrive
|
||||
[user@hostname ~]$ onedrive
|
||||
Authorize this app visiting:
|
||||
|
||||
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=22c49a0d-d21c-4792-aed1-8f163c982546&scope=Files.ReadWrite%20Files.ReadWrite.all%20Sites.ReadWrite.All%20offline_access&response_type=code&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient
|
||||
|
@ -119,7 +125,7 @@ Config path = /home/alex/.config/onedrive
|
|||
Config file found in config path = false
|
||||
Config option 'check_nosync' = false
|
||||
Config option 'sync_dir' = /home/alex/OneDrive
|
||||
Config option 'skip_dir' =
|
||||
Config option 'skip_dir' =
|
||||
Config option 'skip_file' = ~*|.~*|*.tmp
|
||||
Config option 'skip_dotfiles' = false
|
||||
Config option 'skip_symlinks' = false
|
||||
|
@ -187,7 +193,7 @@ Example: If the full path is `~/OneDrive/mydir`, the command would be `onedrive
|
|||
### Performing a 'one-way' download sync
|
||||
In some cases it may be desirable to 'download only' from OneDrive. To do this use the following command:
|
||||
```text
|
||||
onedrive --synchronize --download-only
|
||||
onedrive --synchronize --download-only
|
||||
```
|
||||
|
||||
### Performing a 'one-way' upload sync
|
||||
|
@ -218,13 +224,26 @@ The requested client activity log will instead be located in the users home dire
|
|||
|
||||
On many systems this can be achieved by
|
||||
```text
|
||||
mkdir /var/log/onedrive
|
||||
chown root.users /var/log/onedrive
|
||||
chmod 0775 /var/log/onedrive
|
||||
sudo mkdir /var/log/onedrive
|
||||
sudo chown root.users /var/log/onedrive
|
||||
sudo chmod 0775 /var/log/onedrive
|
||||
```
|
||||
|
||||
All log files will be in the format of `%username%.onedrive.log`, where `%username%` represents the user who ran the client.
|
||||
|
||||
Additionally, you need to ensure that your user account is part of the 'users' group:
|
||||
```
|
||||
cat /etc/group | grep users
|
||||
```
|
||||
|
||||
If your user is not part of this group, then you need to add your user to this group:
|
||||
```
|
||||
sudo usermod -a -G users <your-user-name>
|
||||
```
|
||||
|
||||
You then need to 'logout' of all sessions / SSH sessions to login again to have the new group access applied.
|
||||
|
||||
|
||||
**Note:**
|
||||
To use a different log directory rather than the default above, add the following as a configuration option to `~/.config/onedrive/config`:
|
||||
```text
|
||||
|
@ -344,6 +363,7 @@ See the [config](https://raw.githubusercontent.com/abraunegg/onedrive/master/con
|
|||
# skip_dir_strict_match = "false"
|
||||
# application_id = ""
|
||||
# resync = "false"
|
||||
# resync_auth = "false"
|
||||
# bypass_data_preservation = "false"
|
||||
# azure_ad_endpoint = ""
|
||||
# azure_tenant_id = "common"
|
||||
|
@ -351,9 +371,15 @@ See the [config](https://raw.githubusercontent.com/abraunegg/onedrive/master/con
|
|||
# sync_dir_permissions = "700"
|
||||
# sync_file_permissions = "600"
|
||||
# rate_limit = "131072"
|
||||
# operation_timeout = "3600"
|
||||
# webhook_enabled = "false"
|
||||
# webhook_public_url = ""
|
||||
# webhook_listening_host = ""
|
||||
# webhook_listening_port = "8888"
|
||||
# webhook_expiration_interval = "86400"
|
||||
# webhook_renewal_interval = "43200"
|
||||
```
|
||||
|
||||
|
||||
### 'config' file configuration examples:
|
||||
The below are 'config' file examples to assist with configuration of the 'config' file:
|
||||
|
||||
|
@ -399,7 +425,7 @@ sync_file_permissions = "600"
|
|||
**Important:** Special permission bits (setuid, setgid, sticky bit) are not supported. Valid permission values are from `000` to `777` only.
|
||||
|
||||
#### skip_dir
|
||||
Example:
|
||||
Example:
|
||||
```text
|
||||
# When changing a config option below, remove the '#' from the start of the line
|
||||
# For explanations of all config options below see docs/USAGE.md or the man page.
|
||||
|
@ -510,14 +536,49 @@ min_notify_changes = "50"
|
|||
```
|
||||
This option defines the minimum number of pending incoming changes necessary to trigger a desktop notification. This allows controlling the frequency of notifications.
|
||||
|
||||
#### Selective sync via 'sync_list' file
|
||||
#### operation_timeout
|
||||
Example:
|
||||
```text
|
||||
# sync_file_permissions = "600"
|
||||
# rate_limit = "131072"
|
||||
operation_timeout = "3600"
|
||||
```
|
||||
Operation Timeout is the maximum amount of time (seconds) a file operation is allowed to take. This includes DNS resolution, connecting, data transfer, etc.
|
||||
|
||||
### Performing a --resync
|
||||
If you modify any of the following configuration items, you will be required to perform a `--resync` to ensure your client is syncing your data with the updated configuration:
|
||||
* sync_dir
|
||||
* skip_dir
|
||||
* skip_file
|
||||
* drive_id
|
||||
* Modifying sync_list
|
||||
* Modifying business_shared_folders
|
||||
|
||||
Additionally, you may choose to perform a `--resync` if you feel that this action needs to be taken to ensure your data is in sync. If you are using this switch simply because you dont know the sync status, you can query the actual sync status using `--display-sync-status`.
|
||||
|
||||
When using `--resync`, the following warning and advice will be presented:
|
||||
```text
|
||||
The use of --resync will remove your local 'onedrive' client state, thus no record will exist regarding your current 'sync status'
|
||||
This has the potential to overwrite local versions of files with potentially older versions downloaded from OneDrive which can lead to data loss
|
||||
If in-doubt, backup your local data first before proceeding with --resync
|
||||
|
||||
Are you sure you wish to proceed with --resync? [Y/N]
|
||||
```
|
||||
|
||||
To proceed with using `--resync`, you must type 'y' or 'Y' to allow the application to continue.
|
||||
|
||||
**Note:** It is highly recommended to only use `--resync` if the application advises you to use it. Do not just blindly set the application to start with `--resync` as the default option.
|
||||
|
||||
**Note:** In some automated environments (and it is 100% assumed you *know* what you are doing because of automation), in order to avoid this 'proceed with acknowledgement' requirement, add `--resync-auth` to automatically acknowledge the prompt.
|
||||
|
||||
### Selective sync via 'sync_list' file
|
||||
Selective sync allows you to sync only specific files and directories.
|
||||
To enable selective sync create a file named `sync_list` in `~/.config/onedrive`.
|
||||
Each line of the file represents a relative path from your `sync_dir`. All files and directories not matching any line of the file will be skipped during all operations.
|
||||
Here is an example of `sync_list`:
|
||||
```text
|
||||
# sync_list supports comments
|
||||
#
|
||||
#
|
||||
# The ordering of entries is highly recommended - exclusions before inclusions
|
||||
#
|
||||
# Exclude temp folders under Documents
|
||||
|
@ -551,7 +612,7 @@ The following are supported for pattern matching and exclusion rules:
|
|||
To simplify 'exclusions' and 'inclusions', the following is also possible:
|
||||
```text
|
||||
# sync_list supports comments
|
||||
#
|
||||
#
|
||||
# The ordering of entries is highly recommended - exclusions before inclusions
|
||||
#
|
||||
# Exclude temp folders under Documents
|
||||
|
@ -572,7 +633,7 @@ sync_root_files = "true"
|
|||
This will tell the application to sync any file that it finds in your 'sync_dir' root by default.
|
||||
|
||||
### Configuring the client for 'single tenant application' use
|
||||
In some instances when using OneDrive Business Accounts, depending on the Azure organisational configuration, it will be necessary to configure the client as a 'single tenant application'.
|
||||
In some instances when using OneDrive Business Accounts, depending on the Azure organisational configuration, it will be necessary to configure the client as a 'single tenant application'.
|
||||
To configure this, after creating the application on your Azure tenant, update the 'config' file with the tenant name (not the GUID) and the newly created Application ID, then this will be used for the authentication process.
|
||||
```text
|
||||
# skip_dir_strict_match = "false"
|
||||
|
@ -671,6 +732,59 @@ sudo sysctl fs.inotify.max_user_watches=<new_value>
|
|||
|
||||
To make these changes permanent, refer to your OS reference documentation.
|
||||
|
||||
### Use webhook to subscribe to remote updates in 'monitor' mode
|
||||
|
||||
A webhook can be optionally enabled in the monitor mode to allow the onedrive process to subscribe to remote updates. Remote changes can be synced to your local file system as soon as possible, without waiting for the next sync cycle.
|
||||
|
||||
To enable this feature, you need to configure the following options in the config file:
|
||||
|
||||
```
|
||||
webhook_enabled = "true"
|
||||
webhook_public_url = "<public-facing url to reach your webhook>"
|
||||
```
|
||||
|
||||
Setting `webhook_enabled` to `true` enables the webhook in 'monitor' mode. The onedrive process will listen for incoming updates at a configurable endpoint, which defaults to `0.0.0.0:8888`. The `webhook_public_url` must be set to an public-facing url for Microsoft to send updates to your webhook. If your host is directly exposed to the Internet, the `webhook_public_url` can be set to `http://<your_host>:8888/` to match the default endpoint. However, the recommended approach is to configure a reverse proxy like nginx.
|
||||
|
||||
For example, below is a nginx config snippet to proxy traffic into the webhook:
|
||||
|
||||
```
|
||||
http {
|
||||
server {
|
||||
listen 80;
|
||||
location /webhooks/onedrive {
|
||||
proxy_pass http://127.0.0.1:8888;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
With nginx running, you can configure `webhook_public_url` to `http://<your_host>/webhooks/onedrive`.
|
||||
|
||||
### More webhook configuration options
|
||||
|
||||
Below options can be optionally configured. The default is usually good enough.
|
||||
|
||||
#### webhook_listening_host and webhook_listening_port
|
||||
|
||||
Set `webhook_listening_host` and `webhook_listening_port` to change the webhook listening endpoint. If `webhook_listening_host` is left empty, which is the default, the webhook will bind to `0.0.0.0`. The default `webhook_listening_port` is `8888`.
|
||||
|
||||
```
|
||||
webhook_listening_host = ""
|
||||
webhook_listening_port = "8888"
|
||||
```
|
||||
|
||||
#### webhook_expiration_interval and webhook_renewal_interval
|
||||
|
||||
Set `webhook_expiration_interval` and `webhook_renewal_interval` to change the frequency of subscription renewal. By default, the webhook asks Microsoft to keep subscriptions alive for 24 hours, and it renews subscriptions when it is less than 12 hours before their expiration.
|
||||
|
||||
```
|
||||
# Default expiration interval is 24 hours
|
||||
webhook_expiration_interval = "86400"
|
||||
|
||||
# Default renewal interval is 12 hours
|
||||
webhook_renewal_interval = "43200"
|
||||
```
|
||||
|
||||
## Running 'onedrive' as a system service
|
||||
There are a few ways to use onedrive as a service
|
||||
* via init.d
|
||||
|
@ -857,7 +971,8 @@ for extra details.
|
|||
* 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
|
||||
|
||||
* Upload data from the local ~/OneDrive folder to a specific location on OneDrive
|
||||
|
||||
Refer to [./advanced-usage.md](advanced-usage.md) for configuration assistance.
|
||||
|
||||
### Access OneDrive service through a proxy
|
||||
|
@ -921,6 +1036,8 @@ Options:
|
|||
Perform authorization via two files passed in as ARG in the format `authUrl:responseUrl`
|
||||
The authorization URL is written to the `authUrl`, then onedrive waits for the file `responseUrl`
|
||||
to be present, and reads the response from that file.
|
||||
--auth-response ARG
|
||||
Perform authentication not via interactive dialog but via providing the reponse url directly.
|
||||
--check-for-nomount
|
||||
Check for the presence of .nosync in the syncdir root. If found, do not perform sync.
|
||||
--check-for-nosync
|
||||
|
@ -937,6 +1054,8 @@ Options:
|
|||
Debug OneDrive HTTPS communication.
|
||||
--destination-directory ARG
|
||||
Destination directory for renamed or move on OneDrive - no sync will be performed.
|
||||
--disable-download-validation
|
||||
Disable download validation when downloading from OneDrive
|
||||
--disable-notifications
|
||||
Do not use desktop notifications in monitor mode.
|
||||
--disable-upload-validation
|
||||
|
@ -953,8 +1072,6 @@ Options:
|
|||
Enable client activity to a separate log file
|
||||
--force
|
||||
Force the deletion of data when a 'big delete' is detected
|
||||
--force-http-1.1
|
||||
Force the use of HTTP/1.1 for all operations (DEPRECIATED)
|
||||
--force-http-2
|
||||
Force the use of HTTP/2 for all operations where applicable
|
||||
--get-O365-drive-id ARG
|
||||
|
@ -983,6 +1100,8 @@ Options:
|
|||
Frequency of logging in monitor mode
|
||||
--no-remote-delete
|
||||
Do not delete local file 'deletes' from OneDrive when using --upload-only
|
||||
--operation-timeout
|
||||
Maximum amount of time (in seconds) an operation is allowed to take
|
||||
--print-token
|
||||
Print the access token, useful for debugging
|
||||
--remove-directory ARG
|
||||
|
@ -991,6 +1110,8 @@ Options:
|
|||
Remove source file after successful transfer to OneDrive when using --upload-only
|
||||
--resync
|
||||
Forget the last saved state, perform a full sync
|
||||
--resync-auth
|
||||
Approve the use of performing a --resync action
|
||||
--single-directory ARG
|
||||
Specify a single local directory within the OneDrive root to sync.
|
||||
--skip-dir ARG
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
# Advanced Configuration of the OneDrive Free Client
|
||||
This document covers the following scenarios:
|
||||
* Configuring the client to use mulitple OneDrive accounts / configurations
|
||||
* Configuring the client to use multiple 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
|
||||
* Upload data from the local ~/OneDrive folder to a specific location on OneDrive
|
||||
|
||||
## Configuring the client to use mulitple OneDrive accounts / configurations
|
||||
## Configuring the client to use multiple 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:
|
||||
1. Create a unique configuration folder for each onedrive client configuration that you need
|
||||
2. Copy to this folder a copy of the default configuration file
|
||||
|
@ -169,3 +170,26 @@ Next, in your 'config' file, configure the following options: `check_nomount = "
|
|||
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.
|
||||
|
||||
|
||||
## Upload data from the local ~/OneDrive folder to a specific location on OneDrive
|
||||
In some environments, you may not want your local ~/OneDrive folder to be uploaded directly to the root of your OneDrive account online.
|
||||
|
||||
Unfortunatly, the OneDrive API lacks any facility to perform a re-direction of data during upload.
|
||||
|
||||
The workaround for this is to structure your local filesystem and reconfigure your client to achieve the desired goal.
|
||||
|
||||
### High level steps:
|
||||
1. Create a new folder, for example `/opt/OneDrive`
|
||||
2. Configure your application config 'sync_dir' to look at this folder
|
||||
3. Inside `/opt/OneDrive` create the folder you wish to sync the data online to, for example: `/opt/OneDrive/RemoteOnlineDestination`
|
||||
4. Configure the application to only sync `/opt/OneDrive/RemoteDestination` via 'sync_list'
|
||||
5. Symbolically link `~/OneDrive` -> `/opt/OneDrive/RemoteOnlineDestination`
|
||||
|
||||
### Outcome:
|
||||
* Your `~/OneDrive` will look / feel as per normal
|
||||
* The data will be stored online under `/RemoteOnlineDestination`
|
||||
|
||||
### Testing:
|
||||
* Validate your configuration with `onedrive --display-config`
|
||||
* Test your configuration with `onedrive --dry-run`
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
# RPM Package Build Process
|
||||
The instuctions below have been tested on the following systems:
|
||||
* CentOS 6 x86_64
|
||||
* CentOS 7 x86_64
|
||||
* CentOS 8 x86_64
|
||||
|
||||
These instructions should also be applicable for RedHat & Fedora platforms, or any other RedHat RPM based distribution.
|
||||
|
||||
## Prepare Package Development Environment (CentOS 6, 7, 8)
|
||||
## Prepare Package Development Environment (CentOS 7, 8)
|
||||
Install the following dependencies on your build system:
|
||||
```text
|
||||
sudo yum groupinstall -y 'Development Tools'
|
||||
|
@ -14,28 +13,14 @@ sudo yum install -y libcurl-devel
|
|||
sudo yum install -y sqlite-devel
|
||||
sudo yum install -y libnotify-devel
|
||||
sudo yum install -y wget
|
||||
sudo yum install -y http://downloads.dlang.org/releases/2.x/2.091.0/dmd-2.091.0-0.fedora.x86_64.rpm
|
||||
sudo yum install -y http://downloads.dlang.org/releases/2.x/2.087.0/dmd-2.087.0-0.fedora.x86_64.rpm
|
||||
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
|
||||
```
|
||||
|
||||
### CentOS 6 Only
|
||||
In addition to the above requirements, the `sqlite` version used on CentOS 6.x / RHEL 6.x needs to be upgraded. Use the following instructions to update your version of `sqlite` so that it can support this client:
|
||||
```text
|
||||
sudo yum -y install epel-release
|
||||
sudo yum -y install mock
|
||||
wget https://kojipkgs.fedoraproject.org//packages/sqlite/3.7.15.2/2.fc19/src/sqlite-3.7.15.2-2.fc19.src.rpm -O ~/rpmbuild/SRPMS/sqlite-3.7.15.2-2.fc19.src.rpm
|
||||
mock -r epel-6-x86_64 --rebuild ~/rpmbuild/SRPMS/sqlite-3.7.15.2-2.fc19.src.rpm
|
||||
mock -r epel-6-i386 --rebuild ~/rpmbuild/SRPMS/sqlite-3.7.15.2-2.fc19.src.rpm
|
||||
mkdir ~/sqlite-upgrade
|
||||
mv /var/lib/mock/epel-6-x86_64/result/sqlite-*.rpm ~/sqlite-upgrade/
|
||||
mv /var/lib/mock/epel-6-i386/result/sqlite-*.i686.rpm ~/sqlite-upgrade/
|
||||
sudo yum -y upgrade ~/sqlite-upgrade/sqlite-*
|
||||
```
|
||||
|
||||
## Build RPM from spec file
|
||||
Build the RPM from the provided spec file:
|
||||
```text
|
||||
wget https://github.com/abraunegg/onedrive/archive/v2.4.0.tar.gz -O ~/rpmbuild/SOURCES/v2.4.0.tar.gz
|
||||
wget https://github.com/abraunegg/onedrive/archive/refs/tags/v2.4.15.tar.gz -O ~/rpmbuild/SOURCES/v2.4.15.tar.gz
|
||||
wget https://raw.githubusercontent.com/abraunegg/onedrive/master/contrib/spec/onedrive.spec.in -O ~/rpmbuild/SPECS/onedrive.spec
|
||||
rpmbuild -ba ~/rpmbuild/SPECS/onedrive.spec
|
||||
```
|
||||
|
@ -43,197 +28,25 @@ rpmbuild -ba ~/rpmbuild/SPECS/onedrive.spec
|
|||
## RPM Build Results
|
||||
Below are output results of building, installing and running the RPM package on the respective platforms:
|
||||
|
||||
### CentOS 6
|
||||
```text
|
||||
[alex@localhost ~]$ rpmbuild -ba ~/rpmbuild/SPECS/onedrive.spec
|
||||
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Ve7WYf
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ LANG=C
|
||||
+ export LANG
|
||||
+ unset DISPLAY
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ rm -rf onedrive-2.4.0
|
||||
+ /bin/tar -xf -
|
||||
+ /usr/bin/gzip -dc /home/alex/rpmbuild/SOURCES/v2.4.0.tar.gz
|
||||
+ STATUS=0
|
||||
+ '[' 0 -ne 0 ']'
|
||||
+ cd onedrive-2.4.0
|
||||
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
|
||||
+ exit 0
|
||||
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.iB40rK
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd onedrive-2.4.0
|
||||
+ LANG=C
|
||||
+ export LANG
|
||||
+ unset DISPLAY
|
||||
+ CFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
|
||||
+ export CFLAGS
|
||||
+ CXXFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
|
||||
+ export CXXFLAGS
|
||||
+ FFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -I/usr/lib64/gfortran/modules'
|
||||
+ export FFLAGS
|
||||
+ ./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --target=x86_64-redhat-linux-gnu --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info
|
||||
checking for a BSD-compatible install... /usr/bin/install -c
|
||||
checking for x86_64-redhat-linux-gnu-pkg-config... no
|
||||
checking for pkg-config... /usr/bin/pkg-config
|
||||
checking pkg-config is at least version 0.9.0... yes
|
||||
checking for dmd... dmd
|
||||
checking version of D compiler... 2.091.0
|
||||
checking for curl... yes
|
||||
checking for sqlite... yes
|
||||
configure: creating ./config.status
|
||||
config.status: creating Makefile
|
||||
config.status: creating contrib/pacman/PKGBUILD
|
||||
config.status: creating contrib/spec/onedrive.spec
|
||||
config.status: creating onedrive.1
|
||||
config.status: creating contrib/systemd/onedrive.service
|
||||
config.status: creating contrib/systemd/onedrive@.service
|
||||
+ make
|
||||
if [ -f .git/HEAD ] ; then \
|
||||
git describe --tags > version ; \
|
||||
else \
|
||||
echo v2.4.0 > version ; \
|
||||
fi
|
||||
dmd -w -g -O -J. -L-lcurl -L-lsqlite3 -L-ldl src/config.d src/itemdb.d src/log.d src/main.d src/monitor.d src/onedrive.d src/qxor.d src/selective.d src/sqlite.d src/sync.d src/upload.d src/util.d src/progress.d -ofonedrive
|
||||
+ exit 0
|
||||
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.VP7LUb
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ '[' /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64 '!=' / ']'
|
||||
+ rm -rf /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64
|
||||
++ dirname /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64
|
||||
+ mkdir -p /home/alex/rpmbuild/BUILDROOT
|
||||
+ mkdir /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64
|
||||
+ cd onedrive-2.4.0
|
||||
+ LANG=C
|
||||
+ export LANG
|
||||
+ unset DISPLAY
|
||||
+ make install DESTDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64 PREFIX=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64
|
||||
/usr/bin/install -c -D onedrive /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/usr/bin/onedrive
|
||||
/usr/bin/install -c -D onedrive.1 /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/usr/share/man/man1/onedrive.1
|
||||
/usr/bin/install -c -D -m 644 contrib/logrotate/onedrive.logrotate /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/etc/logrotate.d/onedrive
|
||||
mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/usr/share/doc/onedrive
|
||||
/usr/bin/install -c -D -m 644 README.md config LICENSE CHANGELOG.md docs/Docker.md docs/INSTALL.md docs/SharePoint-Shared-Libraries.md docs/USAGE.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/usr/share/doc/onedrive
|
||||
install -D contrib/init.d/onedrive.init /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/etc/init.d/onedrive
|
||||
install -D contrib/init.d/onedrive_service.sh /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/usr/bin/onedrive_service.sh
|
||||
+ /usr/lib/rpm/check-buildroot
|
||||
+ /usr/lib/rpm/redhat/brp-compress
|
||||
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
|
||||
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
|
||||
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
|
||||
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python
|
||||
+ /usr/lib/rpm/redhat/brp-python-hardlink
|
||||
+ /usr/lib/rpm/redhat/brp-java-repack-jars
|
||||
Processing files: onedrive-2.4.0-1.el6.x86_64
|
||||
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.6wsc3O
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd onedrive-2.4.0
|
||||
+ DOCDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/usr/share/doc/onedrive-2.4.0
|
||||
+ export DOCDIR
|
||||
+ rm -rf /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/usr/share/doc/onedrive-2.4.0
|
||||
+ /bin/mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/usr/share/doc/onedrive-2.4.0
|
||||
+ cp -pr README.md LICENSE CHANGELOG.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64/usr/share/doc/onedrive-2.4.0
|
||||
+ exit 0
|
||||
Provides: config(onedrive) = 2.4.0-1.el6
|
||||
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
|
||||
Requires(post): chkconfig
|
||||
Requires(preun): chkconfig initscripts
|
||||
Requires(postun): initscripts
|
||||
Requires: /bin/bash /bin/sh ld-linux-x86-64.so.2()(64bit) ld-linux-x86-64.so.2(GLIBC_2.3)(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.6)(64bit) libcurl.so.4()(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libgcc_s.so.1(GCC_4.2.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) libpthread.so.0(GLIBC_2.3.2)(64bit) libpthread.so.0(GLIBC_2.3.3)(64bit) libpthread.so.0(GLIBC_2.3.4)(64bit) librt.so.1()(64bit) librt.so.1(GLIBC_2.2.5)(64bit) libsqlite3.so.0()(64bit) rtld(GNU_HASH)
|
||||
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el6.x86_64
|
||||
Wrote: /home/alex/rpmbuild/SRPMS/onedrive-2.4.0-1.el6.src.rpm
|
||||
Wrote: /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el6.x86_64.rpm
|
||||
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.MuVJDP
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd onedrive-2.4.0
|
||||
+ exit 0
|
||||
[alex@localhost ~]$ sudo yum -y install /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el6.x86_64.rpm
|
||||
Loaded plugins: fastestmirror
|
||||
Setting up Install Process
|
||||
Examining /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el6.x86_64.rpm: onedrive-2.4.0-1.el6.x86_64
|
||||
Marking /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el6.x86_64.rpm to be installed
|
||||
Loading mirror speeds from cached hostfile
|
||||
* base: mirror.internode.on.net
|
||||
* epel: fedora.mirror.serversaustralia.com.au
|
||||
* extras: mirror.internode.on.net
|
||||
* updates: mirror.colocity.com
|
||||
Resolving Dependencies
|
||||
--> Running transaction check
|
||||
---> Package onedrive.x86_64 0:2.4.0-1.el6 will be installed
|
||||
--> Finished Dependency Resolution
|
||||
|
||||
Dependencies Resolved
|
||||
|
||||
==============================================================================================================================================================================================
|
||||
Package Arch Version Repository Size
|
||||
==============================================================================================================================================================================================
|
||||
Installing:
|
||||
onedrive x86_64 2.4.0-1.el6 /onedrive-2.4.0-1.el6.x86_64 5.8 M
|
||||
|
||||
Transaction Summary
|
||||
==============================================================================================================================================================================================
|
||||
Install 1 Package(s)
|
||||
|
||||
Total size: 5.8 M
|
||||
Installed size: 5.8 M
|
||||
Downloading Packages:
|
||||
Running rpm_check_debug
|
||||
Running Transaction Test
|
||||
Transaction Test Succeeded
|
||||
Running Transaction
|
||||
Installing : onedrive-2.4.0-1.el6.x86_64 1/1
|
||||
Verifying : onedrive-2.4.0-1.el6.x86_64 1/1
|
||||
|
||||
Installed:
|
||||
onedrive.x86_64 0:2.4.0-1.el6
|
||||
|
||||
Complete!
|
||||
[alex@localhost ~]$ which onedrive
|
||||
/usr/bin/onedrive
|
||||
[alex@localhost ~]$ onedrive --version
|
||||
onedrive v2.4.0
|
||||
[alex@localhost ~]$ onedrive --display-config
|
||||
onedrive version = v2.4.0
|
||||
Config path = /home/alex/.config/onedrive
|
||||
Config file found in config path = false
|
||||
Config option 'check_nosync' = false
|
||||
Config option 'sync_dir' = /home/alex/OneDrive
|
||||
Config option 'skip_dir' =
|
||||
Config option 'skip_file' = ~*|.~*|*.tmp
|
||||
Config option 'skip_dotfiles' = false
|
||||
Config option 'skip_symlinks' = false
|
||||
Config option 'monitor_interval' = 45
|
||||
Config option 'min_notify_changes' = 5
|
||||
Config option 'log_dir' = /var/log/onedrive/
|
||||
Config option 'classify_as_big_delete' = 1000
|
||||
Config option 'sync_root_files' = false
|
||||
Selective sync configured = false
|
||||
[alex@localhost ~]$
|
||||
```
|
||||
|
||||
### CentOS 7
|
||||
```text
|
||||
[alex@localhost ~]$ rpmbuild -ba ~/rpmbuild/SPECS/onedrive.spec
|
||||
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.BEprc0
|
||||
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.wi6Tdz
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ rm -rf onedrive-2.4.0
|
||||
+ /usr/bin/gzip -dc /home/alex/rpmbuild/SOURCES/v2.4.0.tar.gz
|
||||
+ rm -rf onedrive-2.4.15
|
||||
+ /usr/bin/tar -xf -
|
||||
+ /usr/bin/gzip -dc /home/alex/rpmbuild/SOURCES/v2.4.15.tar.gz
|
||||
+ STATUS=0
|
||||
+ '[' 0 -ne 0 ']'
|
||||
+ cd onedrive-2.4.0
|
||||
+ cd onedrive-2.4.15
|
||||
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
|
||||
+ exit 0
|
||||
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.CSy74N
|
||||
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.dyeEuM
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd onedrive-2.4.0
|
||||
+ cd onedrive-2.4.15
|
||||
+ CFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'
|
||||
+ export CFLAGS
|
||||
+ CXXFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'
|
||||
|
@ -254,7 +67,7 @@ checking for x86_64-redhat-linux-gnu-pkg-config... no
|
|||
checking for pkg-config... /usr/bin/pkg-config
|
||||
checking pkg-config is at least version 0.9.0... yes
|
||||
checking for dmd... dmd
|
||||
checking version of D compiler... 2.091.0
|
||||
checking version of D compiler... 2.087.0
|
||||
checking for curl... yes
|
||||
checking for sqlite... yes
|
||||
configure: creating ./config.status
|
||||
|
@ -269,28 +82,28 @@ configure: WARNING: unrecognized options: --disable-dependency-tracking
|
|||
if [ -f .git/HEAD ] ; then \
|
||||
git describe --tags > version ; \
|
||||
else \
|
||||
echo v2.4.0 > version ; \
|
||||
echo v2.4.15 > version ; \
|
||||
fi
|
||||
dmd -w -g -O -J. -L-lcurl -L-lsqlite3 -L-ldl src/config.d src/itemdb.d src/log.d src/main.d src/monitor.d src/onedrive.d src/qxor.d src/selective.d src/sqlite.d src/sync.d src/upload.d src/util.d src/progress.d -ofonedrive
|
||||
dmd -w -g -O -J. -L-lcurl -L-lsqlite3 -L-ldl src/config.d src/itemdb.d src/log.d src/main.d src/monitor.d src/onedrive.d src/qxor.d src/selective.d src/sqlite.d src/sync.d src/upload.d src/util.d src/progress.d src/arsd/cgi.d -ofonedrive
|
||||
+ exit 0
|
||||
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.Ffintx
|
||||
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.L3JbHy
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ '[' /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64 '!=' / ']'
|
||||
+ rm -rf /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64
|
||||
++ dirname /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64
|
||||
+ '[' /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64 '!=' / ']'
|
||||
+ rm -rf /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64
|
||||
++ dirname /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64
|
||||
+ mkdir -p /home/alex/rpmbuild/BUILDROOT
|
||||
+ mkdir /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64
|
||||
+ cd onedrive-2.4.0
|
||||
+ /usr/bin/make install DESTDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64 PREFIX=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64
|
||||
/usr/bin/install -c -D onedrive /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/bin/onedrive
|
||||
/usr/bin/install -c -D onedrive.1 /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/share/man/man1/onedrive.1
|
||||
/usr/bin/install -c -D -m 644 contrib/logrotate/onedrive.logrotate /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/etc/logrotate.d/onedrive
|
||||
mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/share/doc/onedrive
|
||||
/usr/bin/install -c -D -m 644 README.md config LICENSE CHANGELOG.md docs/Docker.md docs/INSTALL.md docs/SharePoint-Shared-Libraries.md docs/USAGE.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/share/doc/onedrive
|
||||
/usr/bin/install -c -d -m 0755 /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/lib/systemd/user /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/lib/systemd/system
|
||||
/usr/bin/install -c -m 0644 contrib/systemd/onedrive@.service /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/lib/systemd/system
|
||||
/usr/bin/install -c -m 0644 contrib/systemd/onedrive.service /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/lib/systemd/system
|
||||
+ mkdir /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64
|
||||
+ cd onedrive-2.4.15
|
||||
+ /usr/bin/make install DESTDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64 PREFIX=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64
|
||||
/usr/bin/install -c -D onedrive /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/bin/onedrive
|
||||
/usr/bin/install -c -D onedrive.1 /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/share/man/man1/onedrive.1
|
||||
/usr/bin/install -c -D -m 644 contrib/logrotate/onedrive.logrotate /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/etc/logrotate.d/onedrive
|
||||
mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/share/doc/onedrive
|
||||
/usr/bin/install -c -D -m 644 README.md config LICENSE CHANGELOG.md docs/Docker.md docs/INSTALL.md docs/SharePoint-Shared-Libraries.md docs/USAGE.md docs/BusinessSharedFolders.md docs/advanced-usage.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/share/doc/onedrive
|
||||
/usr/bin/install -c -d -m 0755 /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/lib/systemd/user /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/lib/systemd/system
|
||||
/usr/bin/install -c -m 0644 contrib/systemd/onedrive@.service /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/lib/systemd/system
|
||||
/usr/bin/install -c -m 0644 contrib/systemd/onedrive.service /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/lib/systemd/system
|
||||
+ /usr/lib/rpm/check-buildroot
|
||||
+ /usr/lib/rpm/redhat/brp-compress
|
||||
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
|
||||
|
@ -299,73 +112,73 @@ mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/share/doc
|
|||
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
|
||||
+ /usr/lib/rpm/redhat/brp-python-hardlink
|
||||
+ /usr/lib/rpm/redhat/brp-java-repack-jars
|
||||
Processing files: onedrive-2.4.0-1.el7.x86_64
|
||||
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.EB5XJj
|
||||
Processing files: onedrive-2.4.15-1.el7.x86_64
|
||||
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.cpSXho
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd onedrive-2.4.0
|
||||
+ DOCDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/share/doc/onedrive-2.4.0
|
||||
+ cd onedrive-2.4.15
|
||||
+ DOCDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/share/doc/onedrive-2.4.15
|
||||
+ export DOCDIR
|
||||
+ /usr/bin/mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/share/doc/onedrive-2.4.0
|
||||
+ cp -pr README.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/share/doc/onedrive-2.4.0
|
||||
+ cp -pr LICENSE /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/share/doc/onedrive-2.4.0
|
||||
+ cp -pr CHANGELOG.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64/usr/share/doc/onedrive-2.4.0
|
||||
+ /usr/bin/mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/share/doc/onedrive-2.4.15
|
||||
+ cp -pr README.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/share/doc/onedrive-2.4.15
|
||||
+ cp -pr LICENSE /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/share/doc/onedrive-2.4.15
|
||||
+ cp -pr CHANGELOG.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64/usr/share/doc/onedrive-2.4.15
|
||||
+ exit 0
|
||||
Provides: config(onedrive) = 2.4.0-1.el7 onedrive = 2.4.0-1.el7 onedrive(x86-64) = 2.4.0-1.el7
|
||||
Provides: config(onedrive) = 2.4.15-1.el7 onedrive = 2.4.15-1.el7 onedrive(x86-64) = 2.4.15-1.el7
|
||||
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
|
||||
Requires(post): systemd
|
||||
Requires(preun): systemd
|
||||
Requires(postun): systemd
|
||||
Requires: ld-linux-x86-64.so.2()(64bit) ld-linux-x86-64.so.2(GLIBC_2.3)(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.6)(64bit) libcurl.so.4()(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libgcc_s.so.1(GCC_4.2.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) libpthread.so.0(GLIBC_2.3.2)(64bit) libpthread.so.0(GLIBC_2.3.3)(64bit) libpthread.so.0(GLIBC_2.3.4)(64bit) librt.so.1()(64bit) librt.so.1(GLIBC_2.2.5)(64bit) libsqlite3.so.0()(64bit) rtld(GNU_HASH)
|
||||
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el7.x86_64
|
||||
Wrote: /home/alex/rpmbuild/SRPMS/onedrive-2.4.0-1.el7.src.rpm
|
||||
Wrote: /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el7.x86_64.rpm
|
||||
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.2VzBVJ
|
||||
Requires: ld-linux-x86-64.so.2()(64bit) ld-linux-x86-64.so.2(GLIBC_2.3)(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.15)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.6)(64bit) libc.so.6(GLIBC_2.8)(64bit) libc.so.6(GLIBC_2.9)(64bit) libcurl.so.4()(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libgcc_s.so.1(GCC_4.2.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) libpthread.so.0(GLIBC_2.3.2)(64bit) libpthread.so.0(GLIBC_2.3.4)(64bit) librt.so.1()(64bit) librt.so.1(GLIBC_2.2.5)(64bit) libsqlite3.so.0()(64bit) rtld(GNU_HASH)
|
||||
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el7.x86_64
|
||||
Wrote: /home/alex/rpmbuild/SRPMS/onedrive-2.4.15-1.el7.src.rpm
|
||||
Wrote: /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.15-1.el7.x86_64.rpm
|
||||
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.nWoW33
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd onedrive-2.4.0
|
||||
+ cd onedrive-2.4.15
|
||||
+ exit 0
|
||||
[alex@localhost ~]$ sudo yum -y install /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el7.x86_64.rpm
|
||||
[alex@localhost ~]$ sudo yum -y install /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.15-1.el7.x86_64.rpm
|
||||
Loaded plugins: fastestmirror
|
||||
Examining /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el7.x86_64.rpm: onedrive-2.4.0-1.el7.x86_64
|
||||
Marking /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el7.x86_64.rpm to be installed
|
||||
Examining /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.15-1.el7.x86_64.rpm: onedrive-2.4.15-1.el7.x86_64
|
||||
Marking /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.15-1.el7.x86_64.rpm to be installed
|
||||
Resolving Dependencies
|
||||
--> Running transaction check
|
||||
---> Package onedrive.x86_64 0:2.4.0-1.el7 will be installed
|
||||
---> Package onedrive.x86_64 0:2.4.15-1.el7 will be installed
|
||||
--> Finished Dependency Resolution
|
||||
|
||||
Dependencies Resolved
|
||||
|
||||
==============================================================================================================================================================================================
|
||||
Package Arch Version Repository Size
|
||||
Package Arch Version Repository Size
|
||||
==============================================================================================================================================================================================
|
||||
Installing:
|
||||
onedrive x86_64 2.4.0-1.el7 /onedrive-2.4.0-1.el7.x86_64 5.8 M
|
||||
onedrive x86_64 2.4.15-1.el7 /onedrive-2.4.15-1.el7.x86_64 7.2 M
|
||||
|
||||
Transaction Summary
|
||||
==============================================================================================================================================================================================
|
||||
Install 1 Package
|
||||
|
||||
Total size: 5.8 M
|
||||
Installed size: 5.8 M
|
||||
Total size: 7.2 M
|
||||
Installed size: 7.2 M
|
||||
Downloading packages:
|
||||
Running transaction check
|
||||
Running transaction test
|
||||
Transaction test succeeded
|
||||
Running transaction
|
||||
Installing : onedrive-2.4.0-1.el7.x86_64 1/1
|
||||
Verifying : onedrive-2.4.0-1.el7.x86_64 1/1
|
||||
Installing : onedrive-2.4.15-1.el7.x86_64 1/1
|
||||
Verifying : onedrive-2.4.15-1.el7.x86_64 1/1
|
||||
|
||||
Installed:
|
||||
onedrive.x86_64 0:2.4.0-1.el7
|
||||
onedrive.x86_64 0:2.4.15-1.el7
|
||||
|
||||
Complete!
|
||||
[alex@localhost ~]$ which onedrive
|
||||
/usr/bin/onedrive
|
||||
[alex@localhost ~]$ onedrive --version
|
||||
onedrive v2.4.0
|
||||
onedrive v2.4.15
|
||||
[alex@localhost ~]$ onedrive --display-config
|
||||
onedrive version = v2.4.0
|
||||
onedrive version = v2.4.15
|
||||
Config path = /home/alex/.config/onedrive
|
||||
Config file found in config path = false
|
||||
Config option 'check_nosync' = false
|
||||
|
@ -374,34 +187,38 @@ Config option 'skip_dir' =
|
|||
Config option 'skip_file' = ~*|.~*|*.tmp
|
||||
Config option 'skip_dotfiles' = false
|
||||
Config option 'skip_symlinks' = false
|
||||
Config option 'monitor_interval' = 45
|
||||
Config option 'monitor_interval' = 300
|
||||
Config option 'min_notify_changes' = 5
|
||||
Config option 'log_dir' = /var/log/onedrive/
|
||||
Config option 'classify_as_big_delete' = 1000
|
||||
Config option 'upload_only' = false
|
||||
Config option 'no_remote_delete' = false
|
||||
Config option 'remove_source_files' = false
|
||||
Config option 'sync_root_files' = false
|
||||
Selective sync configured = false
|
||||
Selective sync 'sync_list' configured = false
|
||||
Business Shared Folders configured = false
|
||||
[alex@localhost ~]$
|
||||
```
|
||||
|
||||
### CentOS 8
|
||||
```text
|
||||
[alex@localhost ~]$ rpmbuild -ba ~/rpmbuild/SPECS/onedrive.spec
|
||||
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.5LOfYv
|
||||
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.UINFyE
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ rm -rf onedrive-2.4.0
|
||||
+ /usr/bin/gzip -dc /home/alex/rpmbuild/SOURCES/v2.4.0.tar.gz
|
||||
+ rm -rf onedrive-2.4.15
|
||||
+ /usr/bin/gzip -dc /home/alex/rpmbuild/SOURCES/v2.4.15.tar.gz
|
||||
+ /usr/bin/tar -xof -
|
||||
+ STATUS=0
|
||||
+ '[' 0 -ne 0 ']'
|
||||
+ cd onedrive-2.4.0
|
||||
+ cd onedrive-2.4.15
|
||||
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
|
||||
+ exit 0
|
||||
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.HRIOjX
|
||||
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.cX1WQa
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd onedrive-2.4.0
|
||||
+ cd onedrive-2.4.15
|
||||
+ CFLAGS='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection'
|
||||
+ export CFLAGS
|
||||
+ CXXFLAGS='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection'
|
||||
|
@ -424,7 +241,7 @@ checking for a BSD-compatible install... /usr/bin/install -c
|
|||
checking for x86_64-redhat-linux-gnu-pkg-config... /usr/bin/x86_64-redhat-linux-gnu-pkg-config
|
||||
checking pkg-config is at least version 0.9.0... yes
|
||||
checking for dmd... dmd
|
||||
checking version of D compiler... 2.091.0
|
||||
checking version of D compiler... 2.087.0
|
||||
checking for curl... yes
|
||||
checking for sqlite... yes
|
||||
configure: creating ./config.status
|
||||
|
@ -439,31 +256,31 @@ configure: WARNING: unrecognized options: --disable-dependency-tracking
|
|||
if [ -f .git/HEAD ] ; then \
|
||||
git describe --tags > version ; \
|
||||
else \
|
||||
echo v2.4.0 > version ; \
|
||||
echo v2.4.15 > version ; \
|
||||
fi
|
||||
dmd -w -g -O -J. -L-lcurl -L-lsqlite3 -L-ldl src/config.d src/itemdb.d src/log.d src/main.d src/monitor.d src/onedrive.d src/qxor.d src/selective.d src/sqlite.d src/sync.d src/upload.d src/util.d src/progress.d -ofonedrive
|
||||
dmd -w -g -O -J. -L-lcurl -L-lsqlite3 -L-ldl src/config.d src/itemdb.d src/log.d src/main.d src/monitor.d src/onedrive.d src/qxor.d src/selective.d src/sqlite.d src/sync.d src/upload.d src/util.d src/progress.d src/arsd/cgi.d -ofonedrive
|
||||
+ exit 0
|
||||
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.u9F8Hd
|
||||
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.dNFPdx
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ '[' /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64 '!=' / ']'
|
||||
+ rm -rf /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64
|
||||
++ dirname /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64
|
||||
+ '[' /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64 '!=' / ']'
|
||||
+ rm -rf /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64
|
||||
++ dirname /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64
|
||||
+ mkdir -p /home/alex/rpmbuild/BUILDROOT
|
||||
+ mkdir /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64
|
||||
+ cd onedrive-2.4.0
|
||||
+ /usr/bin/make install DESTDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64 'INSTALL=/usr/bin/install -p' PREFIX=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64
|
||||
/usr/bin/install -p -D onedrive /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/bin/onedrive
|
||||
/usr/bin/install -p -D onedrive.1 /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/share/man/man1/onedrive.1
|
||||
/usr/bin/install -p -D -m 644 contrib/logrotate/onedrive.logrotate /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/etc/logrotate.d/onedrive
|
||||
mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/share/doc/onedrive
|
||||
/usr/bin/install -p -D -m 644 README.md config LICENSE CHANGELOG.md docs/Docker.md docs/INSTALL.md docs/SharePoint-Shared-Libraries.md docs/USAGE.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/share/doc/onedrive
|
||||
/usr/bin/install -p -d -m 0755 /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/lib/systemd/user /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/lib/systemd/system
|
||||
/usr/bin/install -p -m 0644 contrib/systemd/onedrive@.service /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/lib/systemd/system
|
||||
/usr/bin/install -p -m 0644 contrib/systemd/onedrive.service /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/lib/systemd/system
|
||||
+ mkdir /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64
|
||||
+ cd onedrive-2.4.15
|
||||
+ /usr/bin/make install DESTDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64 'INSTALL=/usr/bin/install -p' PREFIX=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64
|
||||
/usr/bin/install -p -D onedrive /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/bin/onedrive
|
||||
/usr/bin/install -p -D onedrive.1 /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/share/man/man1/onedrive.1
|
||||
/usr/bin/install -p -D -m 644 contrib/logrotate/onedrive.logrotate /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/etc/logrotate.d/onedrive
|
||||
mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/share/doc/onedrive
|
||||
/usr/bin/install -p -D -m 644 README.md config LICENSE CHANGELOG.md docs/Docker.md docs/INSTALL.md docs/SharePoint-Shared-Libraries.md docs/USAGE.md docs/BusinessSharedFolders.md docs/advanced-usage.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/share/doc/onedrive
|
||||
/usr/bin/install -p -d -m 0755 /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/lib/systemd/user /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/lib/systemd/system
|
||||
/usr/bin/install -p -m 0644 contrib/systemd/onedrive@.service /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/lib/systemd/system
|
||||
/usr/bin/install -p -m 0644 contrib/systemd/onedrive.service /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/lib/systemd/system
|
||||
+ /usr/lib/rpm/check-buildroot
|
||||
+ /usr/lib/rpm/redhat/brp-ldconfig
|
||||
/sbin/ldconfig: Warning: ignoring configuration file that cannot be opened: /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/etc/ld.so.conf: No such file or directory
|
||||
/sbin/ldconfig: Warning: ignoring configuration file that cannot be opened: /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/etc/ld.so.conf: No such file or directory
|
||||
+ /usr/lib/rpm/brp-compress
|
||||
+ /usr/lib/rpm/brp-strip /usr/bin/strip
|
||||
+ /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
|
||||
|
@ -472,53 +289,53 @@ mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/share/doc
|
|||
+ /usr/lib/rpm/brp-python-hardlink
|
||||
+ PYTHON3=/usr/libexec/platform-python
|
||||
+ /usr/lib/rpm/redhat/brp-mangle-shebangs
|
||||
Processing files: onedrive-2.4.0-1.el8.x86_64
|
||||
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.zi889w
|
||||
Processing files: onedrive-2.4.15-1.el8.x86_64
|
||||
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.TnFKbZ
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd onedrive-2.4.0
|
||||
+ DOCDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ cd onedrive-2.4.15
|
||||
+ DOCDIR=/home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ export LC_ALL=C
|
||||
+ LC_ALL=C
|
||||
+ export DOCDIR
|
||||
+ /usr/bin/mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ cp -pr README.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ cp -pr LICENSE /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ cp -pr CHANGELOG.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ /usr/bin/mkdir -p /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ cp -pr README.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ cp -pr LICENSE /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ cp -pr CHANGELOG.md /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64/usr/share/doc/onedrive
|
||||
+ exit 0
|
||||
warning: File listed twice: /usr/share/doc/onedrive
|
||||
warning: File listed twice: /usr/share/doc/onedrive/CHANGELOG.md
|
||||
warning: File listed twice: /usr/share/doc/onedrive/LICENSE
|
||||
warning: File listed twice: /usr/share/doc/onedrive/README.md
|
||||
Provides: config(onedrive) = 2.4.0-1.el8 onedrive = 2.4.0-1.el8 onedrive(x86-64) = 2.4.0-1.el8
|
||||
Provides: config(onedrive) = 2.4.15-1.el8 onedrive = 2.4.15-1.el8 onedrive(x86-64) = 2.4.15-1.el8
|
||||
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
|
||||
Requires(post): systemd
|
||||
Requires(preun): systemd
|
||||
Requires(postun): systemd
|
||||
Requires: ld-linux-x86-64.so.2()(64bit) ld-linux-x86-64.so.2(GLIBC_2.3)(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.6)(64bit) libcurl.so.4()(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libgcc_s.so.1(GCC_4.2.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) libpthread.so.0(GLIBC_2.3.2)(64bit) libpthread.so.0(GLIBC_2.3.3)(64bit) libpthread.so.0(GLIBC_2.3.4)(64bit) librt.so.1()(64bit) librt.so.1(GLIBC_2.2.5)(64bit) libsqlite3.so.0()(64bit) rtld(GNU_HASH)
|
||||
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.0-1.el8.x86_64
|
||||
Wrote: /home/alex/rpmbuild/SRPMS/onedrive-2.4.0-1.el8.src.rpm
|
||||
Wrote: /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el8.x86_64.rpm
|
||||
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.XEoFDV
|
||||
Requires: ld-linux-x86-64.so.2()(64bit) ld-linux-x86-64.so.2(GLIBC_2.3)(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.15)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.6)(64bit) libc.so.6(GLIBC_2.8)(64bit) libc.so.6(GLIBC_2.9)(64bit) libcurl.so.4()(64bit) libdl.so.2()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libgcc_s.so.1(GCC_4.2.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) libpthread.so.0(GLIBC_2.3.2)(64bit) libpthread.so.0(GLIBC_2.3.4)(64bit) librt.so.1()(64bit) librt.so.1(GLIBC_2.2.5)(64bit) libsqlite3.so.0()(64bit) rtld(GNU_HASH)
|
||||
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/alex/rpmbuild/BUILDROOT/onedrive-2.4.15-1.el8.x86_64
|
||||
Wrote: /home/alex/rpmbuild/SRPMS/onedrive-2.4.15-1.el8.src.rpm
|
||||
Wrote: /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.15-1.el8.x86_64.rpm
|
||||
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.FAMTFz
|
||||
+ umask 022
|
||||
+ cd /home/alex/rpmbuild/BUILD
|
||||
+ cd onedrive-2.4.0
|
||||
+ cd onedrive-2.4.15
|
||||
+ exit 0
|
||||
[alex@localhost ~]$ sudo yum -y install /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.0-1.el8.x86_64.rpm
|
||||
Last metadata expiration check: 0:34:12 ago on Fri 17 Apr 2020 18:11:23 EDT.
|
||||
[alex@localhost ~]$ sudo yum -y install /home/alex/rpmbuild/RPMS/x86_64/onedrive-2.4.15-1.el8.x86_64.rpm
|
||||
Last metadata expiration check: 0:04:07 ago on Fri 14 Jan 2022 14:22:13 EST.
|
||||
Dependencies resolved.
|
||||
==============================================================================================================================================================================================
|
||||
Package Architecture Version Repository Size
|
||||
==============================================================================================================================================================================================
|
||||
Installing:
|
||||
onedrive x86_64 2.4.0-1.el8 @commandline 1.2 M
|
||||
onedrive x86_64 2.4.15-1.el8 @commandline 1.5 M
|
||||
|
||||
Transaction Summary
|
||||
==============================================================================================================================================================================================
|
||||
Install 1 Package
|
||||
|
||||
Total size: 1.2 M
|
||||
Installed size: 5.7 M
|
||||
Total size: 1.5 M
|
||||
Installed size: 7.1 M
|
||||
Downloading Packages:
|
||||
Running transaction check
|
||||
Transaction check succeeded.
|
||||
|
@ -526,20 +343,20 @@ Running transaction test
|
|||
Transaction test succeeded.
|
||||
Running transaction
|
||||
Preparing : 1/1
|
||||
Installing : onedrive-2.4.0-1.el8.x86_64 1/1
|
||||
Running scriptlet: onedrive-2.4.0-1.el8.x86_64 1/1
|
||||
Verifying : onedrive-2.4.0-1.el8.x86_64 1/1
|
||||
Installing : onedrive-2.4.15-1.el8.x86_64 1/1
|
||||
Running scriptlet: onedrive-2.4.15-1.el8.x86_64 1/1
|
||||
Verifying : onedrive-2.4.15-1.el8.x86_64 1/1
|
||||
|
||||
Installed:
|
||||
onedrive-2.4.0-1.el8.x86_64
|
||||
onedrive-2.4.15-1.el8.x86_64
|
||||
|
||||
Complete!
|
||||
[alex@localhost ~]$ which onedrive
|
||||
/usr/bin/onedrive
|
||||
[alex@localhost ~]$ onedrive --version
|
||||
onedrive v2.4.0
|
||||
onedrive v2.4.15
|
||||
[alex@localhost ~]$ onedrive --display-config
|
||||
onedrive version = v2.4.0
|
||||
onedrive version = v2.4.15
|
||||
Config path = /home/alex/.config/onedrive
|
||||
Config file found in config path = false
|
||||
Config option 'check_nosync' = false
|
||||
|
@ -548,11 +365,15 @@ Config option 'skip_dir' =
|
|||
Config option 'skip_file' = ~*|.~*|*.tmp
|
||||
Config option 'skip_dotfiles' = false
|
||||
Config option 'skip_symlinks' = false
|
||||
Config option 'monitor_interval' = 45
|
||||
Config option 'monitor_interval' = 300
|
||||
Config option 'min_notify_changes' = 5
|
||||
Config option 'log_dir' = /var/log/onedrive/
|
||||
Config option 'classify_as_big_delete' = 1000
|
||||
Config option 'upload_only' = false
|
||||
Config option 'no_remote_delete' = false
|
||||
Config option 'remove_source_files' = false
|
||||
Config option 'sync_root_files' = false
|
||||
Selective sync configured = false
|
||||
[alex@localhost ~]$
|
||||
Selective sync 'sync_list' configured = false
|
||||
Business Shared Folders configured = false
|
||||
[alex@localhost ~]$
|
||||
```
|
|
@ -10,7 +10,103 @@ This information is specifically for the following platforms and distributions:
|
|||
* POP OS
|
||||
* Peppermint OS
|
||||
|
||||
Whilst there are [onedrive](https://packages.ubuntu.com/search?keywords=onedrive&searchon=names&suite=all§ion=all) Universe packages available for Ubuntu, do not install 'onedrive' from these packages via `apt install onedrive`. The default Ubuntu Universe packages are out-of-date and are not supported and should not be used.
|
||||
Whilst there are [onedrive](https://packages.ubuntu.com/search?keywords=onedrive&searchon=names&suite=all§ion=all) Universe packages available for Ubuntu, do not install 'onedrive' from these Universe packages. The default Ubuntu Universe packages are out-of-date and are not supported and should not be used.
|
||||
|
||||
## Determine which instructions to use
|
||||
Ubuntu and its clones are based on various different releases, thus, you must use the correct instructions below, otherwise you may run into package dependancy issues and will be unable to install the client.
|
||||
|
||||
### Step 1: Ensure your systen is up-to-date
|
||||
Use a script, simalar to the following to ensure your system is updated correctly:
|
||||
```text
|
||||
#!/bin/bash
|
||||
rm -rf /var/lib/dpkg/lock-frontend
|
||||
rm -rf /var/lib/dpkg/lock
|
||||
apt-get update
|
||||
apt-get upgrade -y
|
||||
apt-get dist-upgrade -y
|
||||
apt-get autoremove -y
|
||||
apt-get autoclean -y
|
||||
```
|
||||
|
||||
Run this script as 'root' by using `su -` to elevate to 'root'. Example below:
|
||||
```text
|
||||
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-48-generic x86_64)
|
||||
|
||||
* Documentation: https://help.ubuntu.com
|
||||
* Management: https://landscape.canonical.com
|
||||
* Support: https://ubuntu.com/advantage
|
||||
|
||||
425 updates can be installed immediately.
|
||||
208 of these updates are security updates.
|
||||
To see these additional updates run: apt list --upgradable
|
||||
|
||||
Your Hardware Enablement Stack (HWE) is supported until April 2025.
|
||||
Last login: Thu Jan 20 14:21:48 2022 from my.ip.address
|
||||
alex@ubuntu-20-LTS:~$ su -
|
||||
Password:
|
||||
root@ubuntu-20-LTS:~# ls -la
|
||||
total 28
|
||||
drwx------ 3 root root 4096 Oct 10 2020 .
|
||||
drwxr-xr-x 20 root root 4096 Oct 10 2020 ..
|
||||
-rw------- 1 root root 175 Jan 20 14:23 .bash_history
|
||||
-rw-r--r-- 1 root root 3106 Dec 6 2019 .bashrc
|
||||
drwx------ 2 root root 4096 Apr 23 2020 .cache
|
||||
-rw-r--r-- 1 root root 161 Dec 6 2019 .profile
|
||||
-rwxr-xr-x 1 root root 174 Oct 10 2020 update-os.sh
|
||||
root@ubuntu-20-LTS:~# cat update-os.sh
|
||||
#!/bin/bash
|
||||
rm -rf /var/lib/dpkg/lock-frontend
|
||||
rm -rf /var/lib/dpkg/lock
|
||||
apt-get update
|
||||
apt-get upgrade -y
|
||||
apt-get dist-upgrade -y
|
||||
apt-get autoremove -y
|
||||
apt-get autoclean -y
|
||||
root@ubuntu-20-LTS:~# ./update-os.sh
|
||||
Hit:1 http://au.archive.ubuntu.com/ubuntu focal InRelease
|
||||
Hit:2 http://au.archive.ubuntu.com/ubuntu focal-updates InRelease
|
||||
Hit:3 http://au.archive.ubuntu.com/ubuntu focal-backports InRelease
|
||||
Hit:4 http://security.ubuntu.com/ubuntu focal-security InRelease
|
||||
Reading package lists... 96%
|
||||
...
|
||||
Sourcing file `/etc/default/grub'
|
||||
Sourcing file `/etc/default/grub.d/init-select.cfg'
|
||||
Generating grub configuration file ...
|
||||
Found linux image: /boot/vmlinuz-5.13.0-27-generic
|
||||
Found initrd image: /boot/initrd.img-5.13.0-27-generic
|
||||
Found linux image: /boot/vmlinuz-5.4.0-48-generic
|
||||
Found initrd image: /boot/initrd.img-5.4.0-48-generic
|
||||
Found memtest86+ image: /boot/memtest86+.elf
|
||||
Found memtest86+ image: /boot/memtest86+.bin
|
||||
done
|
||||
Removing linux-modules-5.4.0-26-generic (5.4.0-26.30) ...
|
||||
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
root@ubuntu-20-LTS:~#
|
||||
```
|
||||
|
||||
Reboot your system after running this process before continuing with Step 2.
|
||||
```text
|
||||
reboot
|
||||
```
|
||||
|
||||
|
||||
### Step 2: Determine what your OS is based on
|
||||
Determine what your OS is based on. To do this, run the following command:
|
||||
```text
|
||||
lsb_release -a
|
||||
```
|
||||
|
||||
### Step 3: Pick the correct instructions to use
|
||||
If required, review the table below based on your 'lsb_release' information to pick the appropriate instructions to use:
|
||||
|
||||
| Release & Codename | Instructions to use |
|
||||
|--------------------|---------------------|
|
||||
| 18.x / bionic | You must build from source or upgrade your Operating System Ubuntu 20.x |
|
||||
| Linux Mint 19.x / tina | You must build from source or upgrade your Operating System Linux Mint 20.x |
|
||||
| Linux Mint 20.x / ulyana | Use Ubuntu 20.04 instructions below |
|
||||
|
||||
## Distribution Package Install Instructions
|
||||
|
||||
|
@ -20,21 +116,50 @@ The packages support the following platform architectures:
|
|||
|:----:|:------:|:-----:|:-------:|
|
||||
|✔|✔|✔|✔| |
|
||||
|
||||
#### Step 1: Update /etc/apt/sources.list
|
||||
Add the following to the end of your `/etc/apt/sources.list` file:
|
||||
#### Step 1: Add the OpenSuSE Build Service repository
|
||||
Add the OpenSuSE Build Service repository using the following command:
|
||||
```text
|
||||
deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/Debian_10/ ./
|
||||
echo 'deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/Debian_10/ ./' | sudo tee /etc/apt/sources.list.d/onedrive.list
|
||||
```
|
||||
|
||||
#### Step 2: Download and add the release key
|
||||
1. Download the 'Release.key' file: `wget https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/Debian_10/Release.key`
|
||||
2. Add the 'Release.key' file to your apt key repository: `apt-key add ./Release.key`
|
||||
#### Step 2: Add the OpenSuSE Build Service repository release key
|
||||
Add the OpenSuSE Build Service repository release key using the following command:
|
||||
```text
|
||||
wget -qO - https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/Debian_10/Release.key | sudo apt-key add -
|
||||
```
|
||||
|
||||
#### Step 3: Update your apt package cache
|
||||
1. Run: `apt-get update`
|
||||
1. Run: `sudo apt-get update`
|
||||
|
||||
#### Step 4: Install 'onedrive'
|
||||
1. Run: `apt install onedrive`
|
||||
1. Run: `sudo apt install onedrive`
|
||||
|
||||
#### Step 5: Read 'Known Issues' with these packages
|
||||
1. Read and understand the known issues with these packages below, taking any action that is needed.
|
||||
|
||||
### Distribution: Debian 11
|
||||
The packages support the following platform architectures:
|
||||
| i686 | x86_64 | ARMHF | AARCH64 |
|
||||
|:----:|:------:|:-----:|:-------:|
|
||||
|✔|✔|✔|✔| |
|
||||
|
||||
#### Step 1: Add the OpenSuSE Build Service repository
|
||||
Add the OpenSuSE Build Service repository using the following command:
|
||||
```text
|
||||
echo 'deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/Debian_11/ ./' | sudo tee /etc/apt/sources.list.d/onedrive.list
|
||||
```
|
||||
|
||||
#### Step 2: Add the OpenSuSE Build Service repository release key
|
||||
Add the OpenSuSE Build Service repository release key using the following command:
|
||||
```text
|
||||
wget -qO - https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/Debian_11/Release.key | sudo apt-key add -
|
||||
```
|
||||
|
||||
#### Step 3: Update your apt package cache
|
||||
1. Run: `sudo apt-get update`
|
||||
|
||||
#### Step 4: Install 'onedrive'
|
||||
1. Run: `sudo apt install onedrive`
|
||||
|
||||
#### Step 5: Read 'Known Issues' with these packages
|
||||
1. Read and understand the known issues with these packages below, taking any action that is needed.
|
||||
|
@ -45,46 +170,23 @@ The packages support the following platform architectures:
|
|||
|:----:|:------:|:-----:|:-------:|
|
||||
❌|✔|✔|✔| |
|
||||
|
||||
#### Step 1: Update /etc/apt/sources.list
|
||||
Add the following to the end of your `/etc/apt/sources.list` file:
|
||||
#### Step 1: Add the OpenSuSE Build Service repository
|
||||
Add the OpenSuSE Build Service repository using the following command:
|
||||
```text
|
||||
deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.04/ ./
|
||||
echo 'deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.04/ ./' | sudo tee /etc/apt/sources.list.d/onedrive.list
|
||||
```
|
||||
|
||||
#### Step 2: Download and add the release key
|
||||
1. Download the 'Release.key' file: `wget https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.04/Release.key`
|
||||
2. Add the 'Release.key' file to your apt key repository: `apt-key add ./Release.key`
|
||||
|
||||
#### Step 3: Update your apt package cache
|
||||
1. Run: `apt-get update`
|
||||
|
||||
#### Step 4: Install 'onedrive'
|
||||
1. Run: `apt install onedrive`
|
||||
|
||||
#### Step 5: Read 'Known Issues' with these packages
|
||||
1. Read and understand the known issues with these packages below, taking any action that is needed.
|
||||
|
||||
### Distribution: Ubuntu 20.10
|
||||
The packages support the following platform architectures:
|
||||
| i686 | x86_64 | ARMHF | AARCH64 |
|
||||
|:----:|:------:|:-----:|:-------:|
|
||||
❌|✔|✔|✔| |
|
||||
|
||||
#### Step 1: Update /etc/apt/sources.list
|
||||
Add the following to the end of your `/etc/apt/sources.list` file:
|
||||
#### Step 2: Add the OpenSuSE Build Service repository release key
|
||||
Add the OpenSuSE Build Service repository release key using the following command:
|
||||
```text
|
||||
deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.10/ ./
|
||||
wget -qO - https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.04/Release.key | sudo apt-key add -
|
||||
```
|
||||
|
||||
#### Step 2: Download and add the release key
|
||||
1. Download the 'Release.key' file: `wget https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.10/Release.key`
|
||||
2. Add the 'Release.key' file to your apt key repository: `apt-key add ./Release.key`
|
||||
|
||||
#### Step 3: Update your apt package cache
|
||||
1. Run: `apt-get update`
|
||||
1. Run: `sudo apt-get update`
|
||||
|
||||
#### Step 4: Install 'onedrive'
|
||||
1. Run: `apt install onedrive`
|
||||
1. Run: `sudo apt install onedrive`
|
||||
|
||||
#### Step 5: Read 'Known Issues' with these packages
|
||||
1. Read and understand the known issues with these packages below, taking any action that is needed.
|
||||
|
@ -95,15 +197,44 @@ The packages support the following platform architectures:
|
|||
|:----:|:------:|:-----:|:-------:|
|
||||
❌|✔|✔|✔| |
|
||||
|
||||
#### Step 1: Update /etc/apt/sources.list
|
||||
Add the following to the end of your `/etc/apt/sources.list` file:
|
||||
#### Step 1: Add the OpenSuSE Build Service repository
|
||||
Add the OpenSuSE Build Service repository using the following command:
|
||||
```text
|
||||
deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_21.04/ ./
|
||||
echo 'deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_21.04/ ./' | sudo tee /etc/apt/sources.list.d/onedrive.list
|
||||
```
|
||||
|
||||
#### Step 2: Download and add the release key
|
||||
1. Download the 'Release.key' file: `wget https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_21.04/Release.key`
|
||||
2. Add the 'Release.key' file to your apt key repository: `apt-key add ./Release.key`
|
||||
#### Step 2: Add the OpenSuSE Build Service repository release key
|
||||
Add the OpenSuSE Build Service repository release key using the following command:
|
||||
```text
|
||||
wget -qO - https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_21.04/Release.key | sudo apt-key add -
|
||||
```
|
||||
|
||||
#### Step 3: Update your apt package cache
|
||||
1. Run: `sudo apt-get update`
|
||||
|
||||
#### Step 4: Install 'onedrive'
|
||||
1. Run: `sudo apt install onedrive`
|
||||
|
||||
#### Step 5: Read 'Known Issues' with these packages
|
||||
1. Read and understand the known issues with these packages below, taking any action that is needed.
|
||||
|
||||
### Distribution: Ubuntu 21.10
|
||||
The packages support the following platform architectures:
|
||||
| i686 | x86_64 | ARMHF | AARCH64 |
|
||||
|:----:|:------:|:-----:|:-------:|
|
||||
❌|✔|✔|✔| |
|
||||
|
||||
#### Step 1: Add the OpenSuSE Build Service repository
|
||||
Add the OpenSuSE Build Service repository using the following command:
|
||||
```text
|
||||
echo 'deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_21.10/ ./' | sudo tee /etc/apt/sources.list.d/onedrive.list
|
||||
```
|
||||
|
||||
#### Step 2: Add the OpenSuSE Build Service repository release key
|
||||
Add the OpenSuSE Build Service repository release key using the following command:
|
||||
```text
|
||||
wget -qO - https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_21.10/Release.key | sudo apt-key add -
|
||||
```
|
||||
|
||||
#### Step 3: Update your apt package cache
|
||||
1. Run: `apt-get update`
|
||||
|
@ -130,7 +261,6 @@ This issue is being tracked by: [#1274](https://github.com/abraunegg/onedrive/is
|
|||
|
||||
Do not rely on this symbolic link for your systemd configuration to automatically start your onedrive client - refer to [Running 'onedrive' as a system service](https://github.com/abraunegg/onedrive/blob/master/docs/USAGE.md#running-onedrive-as-a-system-service) on how to configure this correctly.
|
||||
|
||||
|
||||
### 2. The client will segfault | core-dump when exiting
|
||||
When the client is being run in `--monitor` mode manually, or when using the systemd service, the client will segfault on exit.
|
||||
|
||||
|
|
|
@ -146,6 +146,11 @@ Do not delete local file 'deletes' from OneDrive when using \fB\-\-upload\-only\
|
|||
.br
|
||||
Configuration file key: \fBno_remote_delete\fP (default: \fBfalse\fP)
|
||||
.TP
|
||||
\fB\-\-operation\-timeout\fP ARG
|
||||
Set the maximum amount of time (seconds) a file operation is allowed to take. This includes DNS resolution, connecting, data transfer, etc.
|
||||
.br
|
||||
Configuration file key: \fBoperation_timeout\fP (default: \fB3600\fP)
|
||||
.TP
|
||||
\fB\-\-print\-token\fP
|
||||
Print the access token, useful for debugging
|
||||
.TP
|
||||
|
|
8
src/arsd/README.md
Normal file
8
src/arsd/README.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
The files in this directory have been obtained form the following places:
|
||||
|
||||
cgi.d
|
||||
https://github.com/adamdruppe/arsd/blob/a870179988b8881b04126856105f0fad2cc0018d/cgi.d
|
||||
License: Boost Software License - Version 1.0
|
||||
|
||||
Copyright 2008-2021, Adam D. Ruppe
|
||||
see https://github.com/adamdruppe/arsd/blob/a870179988b8881b04126856105f0fad2cc0018d/LICENSE
|
10481
src/arsd/cgi.d
Normal file
10481
src/arsd/cgi.d
Normal file
File diff suppressed because it is too large
Load diff
80
src/config.d
80
src/config.d
|
@ -44,7 +44,7 @@ final class Config
|
|||
// Default file permission mode
|
||||
public long defaultFilePermissionMode = 600;
|
||||
public int configuredFilePermissionMode;
|
||||
|
||||
|
||||
this(string confdirOption)
|
||||
{
|
||||
// default configuration - entries in config file ~/.config/onedrive/config
|
||||
|
@ -60,6 +60,7 @@ final class Config
|
|||
boolValues["check_nosync"] = false;
|
||||
boolValues["download_only"] = false;
|
||||
boolValues["disable_notifications"] = false;
|
||||
boolValues["disable_download_validation"] = false;
|
||||
boolValues["disable_upload_validation"] = false;
|
||||
boolValues["enable_logging"] = false;
|
||||
boolValues["force_http_2"] = false;
|
||||
|
@ -90,6 +91,8 @@ final class Config
|
|||
stringValues["application_id"] = "";
|
||||
// allow for resync to be set via config file
|
||||
boolValues["resync"] = false;
|
||||
// resync now needs to be acknowledged based on the 'risk' of using it
|
||||
boolValues["resync_auth"] = false;
|
||||
// Ignore data safety checks and overwrite local data rather than preserve & rename
|
||||
// This is a config file option ONLY
|
||||
boolValues["bypass_data_preservation"] = false;
|
||||
|
@ -119,9 +122,19 @@ final class Config
|
|||
longValues["sync_file_permissions"] = defaultFilePermissionMode;
|
||||
// Configure download / upload rate limits
|
||||
longValues["rate_limit"] = 0;
|
||||
// maximum time an operation is allowed to take
|
||||
// This includes dns resolution, connecting, data transfer, etc.
|
||||
longValues["operation_timeout"] = 3600;
|
||||
// Webhook options
|
||||
boolValues["webhook_enabled"] = false;
|
||||
stringValues["webhook_public_url"] = "";
|
||||
stringValues["webhook_listening_host"] = "";
|
||||
longValues["webhook_listening_port"] = 8888;
|
||||
longValues["webhook_expiration_interval"] = 3600 * 24;
|
||||
longValues["webhook_renewal_interval"] = 3600 * 12;
|
||||
// What language will be used for application output messaging - default EN-AU
|
||||
stringValues["language_identifier"] = "EN-AU";
|
||||
|
||||
|
||||
// DEVELOPER OPTIONS
|
||||
// display_memory = true | false
|
||||
// - It may be desirable to display the memory usage of the application to assist with diagnosing memory issues with the application
|
||||
|
@ -134,7 +147,7 @@ final class Config
|
|||
// display_sync_options = true | false
|
||||
// - It may be desirable to see what options are being passed in to performSync() without enabling the full verbose debug logging
|
||||
boolValues["display_sync_options"] = false;
|
||||
|
||||
|
||||
// Determine the users home directory.
|
||||
// Need to avoid using ~ here as expandTilde() below does not interpret correctly when running under init.d or systemd scripts
|
||||
// Check for HOME environment variable
|
||||
|
@ -155,10 +168,10 @@ final class Config
|
|||
homePath = "~";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Output homePath calculation
|
||||
log.vdebug("homePath: ", homePath);
|
||||
|
||||
|
||||
// Determine the correct configuration directory to use
|
||||
string configDirBase;
|
||||
string systemConfigDirBase;
|
||||
|
@ -184,7 +197,7 @@ final class Config
|
|||
// Also set up a path to pre-shipped shared configs (which can be overridden by supplying a config file in userspace)
|
||||
systemConfigDirBase = "/etc";
|
||||
}
|
||||
|
||||
|
||||
// Output configDirBase calculation
|
||||
log.vdebug("configDirBase: ", configDirBase);
|
||||
// Set the default application configuration directory
|
||||
|
@ -194,7 +207,7 @@ final class Config
|
|||
// systemConfigDirBase contains the correct path so we do not need to check for presence of '~'
|
||||
systemConfigDirName = systemConfigDirBase ~ "/onedrive";
|
||||
}
|
||||
|
||||
|
||||
// Config directory options all determined
|
||||
if (!exists(configDirName)) {
|
||||
// create the directory
|
||||
|
@ -205,11 +218,11 @@ final class Config
|
|||
|
||||
// Initialise the default language output as early as possible
|
||||
translations.initialize();
|
||||
|
||||
|
||||
// What has been determined as the 'user' and 'system' config directories?
|
||||
log.vdebug("Using this 'user' Config Dir: ", configDirName);
|
||||
log.vdebug("Using this 'system' Config Dir: ", systemConfigDirName);
|
||||
|
||||
if (!configDirName.empty) log.vlog("Using 'user' Config Dir: ", configDirName);
|
||||
if (!systemConfigDirName.empty) log.vlog("Using 'system' Config Dir: ", systemConfigDirName);
|
||||
|
||||
// Update application set variables based on configDirName
|
||||
refreshTokenFilePath = buildNormalizedPath(configDirName ~ "/refresh_token");
|
||||
deltaLinkFilePath = buildNormalizedPath(configDirName ~ "/delta_link");
|
||||
|
@ -220,7 +233,7 @@ final class Config
|
|||
syncListFilePath = buildNormalizedPath(configDirName ~ "/sync_list");
|
||||
systemConfigFilePath = buildNormalizedPath(systemConfigDirName ~ "/config");
|
||||
businessSharedFolderFilePath = buildNormalizedPath(configDirName ~ "/business_shared_folders");
|
||||
|
||||
|
||||
// Debug Output for application set variables based on configDirName
|
||||
log.vdebug("refreshTokenFilePath = ", refreshTokenFilePath);
|
||||
log.vdebug("deltaLinkFilePath = ", deltaLinkFilePath);
|
||||
|
@ -296,6 +309,7 @@ final class Config
|
|||
stringValues["single_directory"] = "";
|
||||
stringValues["source_directory"] = "";
|
||||
stringValues["auth_files"] = "";
|
||||
stringValues["auth_response"] = "";
|
||||
boolValues["display_config"] = false;
|
||||
boolValues["display_sync_status"] = false;
|
||||
boolValues["print_token"] = false;
|
||||
|
@ -304,7 +318,7 @@ final class Config
|
|||
boolValues["synchronize"] = false;
|
||||
boolValues["force"] = false;
|
||||
boolValues["list_business_shared_folders"] = false;
|
||||
|
||||
|
||||
// Application Startup option validation
|
||||
try {
|
||||
string tmpStr;
|
||||
|
@ -312,15 +326,18 @@ final class Config
|
|||
long tmpVerb;
|
||||
// duplicated from main.d to get full help output!
|
||||
auto opt = getopt(
|
||||
|
||||
|
||||
args,
|
||||
std.getopt.config.bundling,
|
||||
std.getopt.config.caseSensitive,
|
||||
"auth-files",
|
||||
"Perform authentication not via interactive dialog but via files read/writes to these files.",
|
||||
&stringValues["auth_files"],
|
||||
"auth-response",
|
||||
"Perform authentication not via interactive dialog but via providing the reponse url directly.",
|
||||
&stringValues["auth_response"],
|
||||
"check-for-nomount",
|
||||
"Check for the presence of .nosync in the syncdir root. If found, do not perform sync.",
|
||||
"Check for the presence of .nosync in the syncdir root. If found, do not perform sync.",
|
||||
&boolValues["check_nomount"],
|
||||
"check-for-nosync",
|
||||
"Check for the presence of .nosync in each directory. If found, skip directory from sync.",
|
||||
|
@ -334,8 +351,8 @@ final class Config
|
|||
"create-share-link",
|
||||
"Create a shareable link for an existing file on OneDrive",
|
||||
&stringValues["create_share_link"],
|
||||
"debug-https",
|
||||
"Debug OneDrive HTTPS communication.",
|
||||
"debug-https",
|
||||
"Debug OneDrive HTTPS communication.",
|
||||
&boolValues["debug_https"],
|
||||
"destination-directory",
|
||||
"Destination directory for renamed or move on OneDrive - no sync will be performed.",
|
||||
|
@ -343,6 +360,9 @@ final class Config
|
|||
"disable-notifications",
|
||||
"Do not use desktop notifications in monitor mode.",
|
||||
&boolValues["disable_notifications"],
|
||||
"disable-download-validation",
|
||||
"Disable download validation when downloading from OneDrive",
|
||||
&boolValues["disable_download_validation"],
|
||||
"disable-upload-validation",
|
||||
"Disable upload validation when uploading to OneDrive",
|
||||
&boolValues["disable_upload_validation"],
|
||||
|
@ -400,12 +420,18 @@ final class Config
|
|||
"no-remote-delete",
|
||||
"Do not delete local file 'deletes' from OneDrive when using --upload-only",
|
||||
&boolValues["no_remote_delete"],
|
||||
"operation-timeout",
|
||||
"Maximum amount of time (in seconds) an operation is allowed to take",
|
||||
&longValues["operation_timeout"],
|
||||
"print-token",
|
||||
"Print the access token, useful for debugging",
|
||||
&boolValues["print_token"],
|
||||
"resync",
|
||||
"Forget the last saved state, perform a full sync",
|
||||
&boolValues["resync"],
|
||||
"resync-auth",
|
||||
"Approve the use of performing a --resync action",
|
||||
&boolValues["resync_auth"],
|
||||
"remove-directory",
|
||||
"Remove a directory on OneDrive - no sync will be performed.",
|
||||
&stringValues["remove_directory"],
|
||||
|
@ -540,7 +566,7 @@ final class Config
|
|||
// configure function variables
|
||||
auto file = File(filename, "r");
|
||||
string lineBuffer;
|
||||
|
||||
|
||||
// configure scopes
|
||||
// - failure
|
||||
scope(failure) {
|
||||
|
@ -559,7 +585,7 @@ final class Config
|
|||
file.close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// read file line by line
|
||||
auto range = file.byLine();
|
||||
foreach (line; range) {
|
||||
|
@ -606,7 +632,7 @@ final class Config
|
|||
setValueString("skip_dir", configFileSkipDir);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Azure AD Configuration
|
||||
if (key == "azure_ad_endpoint") {
|
||||
string azureConfigValue = c.front.dup;
|
||||
|
@ -631,7 +657,7 @@ final class Config
|
|||
// "Using config option for Azure AD China operated by 21Vianet"
|
||||
log.log(provideLanguageTranslation(getValueString("language_identifier"),10));
|
||||
break;
|
||||
// Default - all other entries
|
||||
// Default - all other entries
|
||||
default:
|
||||
// "Unknown Azure AD Endpoint - using Global Azure AD Endpoints"
|
||||
log.log(provideLanguageTranslation(getValueString("language_identifier"),11));
|
||||
|
@ -657,10 +683,10 @@ final class Config
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void configureRequiredDirectoryPermisions() {
|
||||
// return the directory permission mode required
|
||||
// - return octal!defaultDirectoryPermissionMode; ... cant be used .. which is odd
|
||||
// - return octal!defaultDirectoryPermissionMode; ... cant be used .. which is odd
|
||||
// Error: variable defaultDirectoryPermissionMode cannot be read at compile time
|
||||
if (getValueLong("sync_dir_permissions") != defaultDirectoryPermissionMode) {
|
||||
// return user configured permissions as octal integer
|
||||
|
@ -674,10 +700,10 @@ final class Config
|
|||
configuredDirectoryPermissionMode = to!int(convertedValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void configureRequiredFilePermisions() {
|
||||
// return the file permission mode required
|
||||
// - return octal!defaultFilePermissionMode; ... cant be used .. which is odd
|
||||
// - return octal!defaultFilePermissionMode; ... cant be used .. which is odd
|
||||
// Error: variable defaultFilePermissionMode cannot be read at compile time
|
||||
if (getValueLong("sync_file_permissions") != defaultFilePermissionMode) {
|
||||
// return user configured permissions as octal integer
|
||||
|
@ -691,7 +717,7 @@ final class Config
|
|||
configuredFilePermissionMode = to!int(convertedValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int returnRequiredDirectoryPermisions() {
|
||||
// read the configuredDirectoryPermissionMode and return
|
||||
if (configuredDirectoryPermissionMode == 0) {
|
||||
|
@ -701,7 +727,7 @@ final class Config
|
|||
}
|
||||
return configuredDirectoryPermissionMode;
|
||||
}
|
||||
|
||||
|
||||
int returnRequiredFilePermisions() {
|
||||
// read the configuredFilePermissionMode and return
|
||||
if (configuredFilePermissionMode == 0) {
|
||||
|
|
14
src/log.d
14
src/log.d
|
@ -13,6 +13,7 @@ version(Notifications) {
|
|||
// enable verbose logging
|
||||
long verbose;
|
||||
bool writeLogFile = false;
|
||||
bool logFileWriteFailFlag = false;
|
||||
|
||||
private bool doNotifications;
|
||||
|
||||
|
@ -35,7 +36,7 @@ void init(string logDir)
|
|||
// we got an error ..
|
||||
writeln("\nUnable to access ", logFilePath);
|
||||
writeln("Please manually create '",logFilePath, "' and set appropriate permissions to allow write access");
|
||||
writeln("The requested client activity log will instead be located in the users home directory\n");
|
||||
writeln("The requested client activity log will instead be located in your users home directory\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -169,6 +170,17 @@ private void logfileWriteLine(T...)(T args)
|
|||
// We cannot open the log file in logFilePath location for writing
|
||||
// The user is not part of the standard 'users' group (GID 100)
|
||||
// Change logfile to ~/onedrive.log putting the log file in the users home directory
|
||||
|
||||
if (!logFileWriteFailFlag) {
|
||||
// write out error message that we cant log to the requested file
|
||||
writeln("\nUnable to write activity log to ", logFileName);
|
||||
writeln("Please set appropriate permissions to allow write access to the logging directory for your user account");
|
||||
writeln("The requested client activity log will instead be located in your users home directory\n");
|
||||
|
||||
// set the flag so we dont keep printing this error message
|
||||
logFileWriteFailFlag = true;
|
||||
}
|
||||
|
||||
string homePath = environment.get("HOME");
|
||||
string logFileNameAlternate = homePath ~ "/onedrive.log";
|
||||
logFile = File(logFileNameAlternate, "a");
|
||||
|
|
339
src/main.d
339
src/main.d
|
@ -5,11 +5,13 @@ import config, itemdb, monitor, onedrive, selective, sync, util, translations;
|
|||
import std.net.curl: CurlException;
|
||||
import core.stdc.signal;
|
||||
import std.traits;
|
||||
import std.concurrency: receiveTimeout;
|
||||
static import log;
|
||||
|
||||
OneDriveApi oneDrive;
|
||||
ItemDatabase itemDb;
|
||||
|
||||
bool onedriveInitialised = false;
|
||||
const int EXIT_UNAUTHORIZED = 3;
|
||||
enum MONITOR_LOG_SILENT = 2;
|
||||
enum MONITOR_LOG_QUIET = 1;
|
||||
|
@ -22,7 +24,7 @@ int main(string[] args)
|
|||
{
|
||||
// Disable buffering on stdout
|
||||
stdout.setvbuf(0, _IONBF);
|
||||
|
||||
|
||||
// main function variables
|
||||
string confdirOption;
|
||||
string configFilePath;
|
||||
|
@ -50,10 +52,9 @@ int main(string[] args)
|
|||
bool skipDirDifferent = false;
|
||||
bool online = false;
|
||||
bool performSyncOK = false;
|
||||
bool onedriveInitialised = false;
|
||||
bool displayMemoryUsage = false;
|
||||
bool displaySyncOptions = false;
|
||||
|
||||
|
||||
// Define scopes
|
||||
scope(exit) {
|
||||
// Display memory details
|
||||
|
@ -81,7 +82,7 @@ int main(string[] args)
|
|||
log.displayMemoryUsagePostGC();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
scope(failure) {
|
||||
// Display memory details
|
||||
if (displayMemoryUsage) {
|
||||
|
@ -127,6 +128,7 @@ int main(string[] args)
|
|||
"verbose|v+", "Print more details, useful for debugging (repeat for extra debugging)", &log.verbose,
|
||||
"version", "Print the version and exit", &printVersion
|
||||
);
|
||||
|
||||
// print help and exit
|
||||
if (opt.helpWanted) {
|
||||
args ~= "--help";
|
||||
|
@ -160,7 +162,7 @@ int main(string[] args)
|
|||
log.error(helpMessage);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
// load configuration file if available
|
||||
auto cfg = new config.Config(confdirOption);
|
||||
// initialise config options
|
||||
|
@ -181,21 +183,66 @@ int main(string[] args)
|
|||
setConfigLanguageIdentifier(languageIdentifier);
|
||||
log.log("Application Language set to: ", languageIdentifier);
|
||||
|
||||
// How was this application started - what options were passed in
|
||||
log.vdebug("passed in options: ", args);
|
||||
log.vdebug("note --confdir and --verbose not listed in args");
|
||||
|
||||
// set memory display
|
||||
displayMemoryUsage = cfg.getValueBool("display_memory");
|
||||
|
||||
|
||||
// set display sync options
|
||||
displaySyncOptions = cfg.getValueBool("display_sync_options");
|
||||
|
||||
|
||||
// update configuration from command line args
|
||||
cfg.update_from_args(args);
|
||||
|
||||
// --resync should be a 'last resort item' .. the user needs to 'accept' to proceed
|
||||
if (cfg.getValueBool("resync")) {
|
||||
// what is the risk acceptance?
|
||||
bool resyncRiskAcceptance = false;
|
||||
|
||||
if (!cfg.getValueBool("resync_auth")) {
|
||||
// need to prompt user
|
||||
char response;
|
||||
// warning message
|
||||
writeln("\nThe use of --resync will remove your local 'onedrive' client state, thus no record will exist regarding your current 'sync status'");
|
||||
writeln("This has the potential to overwrite local versions of files with potentially older versions downloaded from OneDrive which can lead to data loss");
|
||||
writeln("If in-doubt, backup your local data first before proceeding with --resync");
|
||||
write("\nAre you sure you wish to proceed with --resync? [Y/N] ");
|
||||
|
||||
try {
|
||||
// Attempt to read user response
|
||||
readf(" %c\n", &response);
|
||||
} catch (std.format.FormatException e) {
|
||||
// Caught an error
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Evaluate user repsonse
|
||||
if ((to!string(response) == "y") || (to!string(response) == "Y")) {
|
||||
// User has accepted --resync risk to proceed
|
||||
resyncRiskAcceptance = true;
|
||||
// Are you sure you wish .. does not use writeln();
|
||||
write("\n");
|
||||
}
|
||||
} else {
|
||||
// resync_auth is true
|
||||
resyncRiskAcceptance = true;
|
||||
}
|
||||
|
||||
// Action based on response
|
||||
if (!resyncRiskAcceptance){
|
||||
// --resync risk not accepted
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
// Initialise normalised file paths
|
||||
configFilePath = buildNormalizedPath(cfg.configDirName ~ "/config");
|
||||
syncListFilePath = buildNormalizedPath(cfg.configDirName ~ "/sync_list");
|
||||
databaseFilePath = buildNormalizedPath(cfg.configDirName ~ "/items.db");
|
||||
businessSharedFolderFilePath = buildNormalizedPath(cfg.configDirName ~ "/business_shared_folders");
|
||||
|
||||
|
||||
// Has any of our configuration that would require a --resync been changed?
|
||||
// 1. sync_list file modification
|
||||
// 2. config file modification - but only if sync_dir, skip_dir, skip_file or drive_id was modified
|
||||
|
@ -204,25 +251,25 @@ int main(string[] args)
|
|||
syncListHashFile = buildNormalizedPath(cfg.configDirName ~ "/.sync_list.hash");
|
||||
configBackupFile = buildNormalizedPath(cfg.configDirName ~ "/.config.backup");
|
||||
businessSharedFoldersHashFile = buildNormalizedPath(cfg.configDirName ~ "/.business_shared_folders.hash");
|
||||
|
||||
|
||||
// Does a config file exist with a valid hash file
|
||||
if ((exists(configFilePath)) && (!exists(configHashFile))) {
|
||||
// Hash of config file needs to be created
|
||||
std.file.write(configHashFile, computeQuickXorHash(configFilePath));
|
||||
}
|
||||
|
||||
|
||||
// Does a sync_list file exist with a valid hash file
|
||||
if ((exists(syncListFilePath)) && (!exists(syncListHashFile))) {
|
||||
// Hash of sync_list file needs to be created
|
||||
std.file.write(syncListHashFile, computeQuickXorHash(syncListFilePath));
|
||||
}
|
||||
|
||||
|
||||
// check if business_shared_folders & business_shared_folders hash exists
|
||||
if ((exists(businessSharedFolderFilePath)) && (!exists(businessSharedFoldersHashFile))) {
|
||||
// Hash of business_shared_folders file needs to be created
|
||||
std.file.write(businessSharedFoldersHashFile, computeQuickXorHash(businessSharedFolderFilePath));
|
||||
}
|
||||
|
||||
|
||||
// If hash files exist, but config files do not ... remove the hash, but only if --resync was issued as now the application will use 'defaults' which 'may' be different
|
||||
if ((!exists(configFilePath)) && (exists(configHashFile))) {
|
||||
// if --resync safe remove config.hash and config.backup
|
||||
|
@ -231,18 +278,18 @@ int main(string[] args)
|
|||
safeRemove(configBackupFile);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// If sync_list hash file exists, but sync_list file does not ... remove the hash, but only if --resync was issued as now the application will use 'defaults' which 'may' be different
|
||||
if ((!exists(syncListFilePath)) && (exists(syncListHashFile))) {
|
||||
// if --resync safe remove sync_list.hash
|
||||
if (cfg.getValueBool("resync")) safeRemove(syncListHashFile);
|
||||
}
|
||||
|
||||
|
||||
if ((!exists(businessSharedFolderFilePath)) && (exists(businessSharedFoldersHashFile))) {
|
||||
// if --resync safe remove business_shared_folders.hash
|
||||
if (cfg.getValueBool("resync")) safeRemove(businessSharedFoldersHashFile);
|
||||
}
|
||||
|
||||
|
||||
// Read config hashes if they exist
|
||||
if (exists(configFilePath)) currentConfigHash = computeQuickXorHash(configFilePath);
|
||||
if (exists(syncListFilePath)) currentSyncListHash = computeQuickXorHash(syncListFilePath);
|
||||
|
@ -250,21 +297,21 @@ int main(string[] args)
|
|||
if (exists(configHashFile)) previousConfigHash = readText(configHashFile);
|
||||
if (exists(syncListHashFile)) previousSyncListHash = readText(syncListHashFile);
|
||||
if (exists(businessSharedFoldersHashFile)) previousBusinessSharedFoldersHash = readText(businessSharedFoldersHashFile);
|
||||
|
||||
|
||||
// Was sync_list file updated?
|
||||
if (currentSyncListHash != previousSyncListHash) {
|
||||
// Debugging output to assist what changed
|
||||
log.vdebug("sync_list file has been updated, --resync needed");
|
||||
syncListDifferent = true;
|
||||
}
|
||||
|
||||
|
||||
// Was business_shared_folders updated?
|
||||
if (currentBusinessSharedFoldersHash != previousBusinessSharedFoldersHash) {
|
||||
// Debugging output to assist what changed
|
||||
log.vdebug("business_shared_folders file has been updated, --resync needed");
|
||||
businessSharedFoldersDifferent = true;
|
||||
}
|
||||
|
||||
|
||||
// Was config file updated between last execution ang this execution?
|
||||
if (currentConfigHash != previousConfigHash) {
|
||||
// config file was updated, however we only want to trigger a --resync requirement if sync_dir, skip_dir, skip_file or drive_id was modified
|
||||
|
@ -300,7 +347,7 @@ int main(string[] args)
|
|||
log.vdebug(key, " was modified since the last time the application was successfully run, --resync needed");
|
||||
configOptionsDifferent = true;
|
||||
}
|
||||
|
||||
|
||||
if ((key == "skip_file") && (c.front.dup != cfg.getValueString("skip_file"))){
|
||||
log.vdebug(key, " was modified since the last time the application was successfully run, --resync needed");
|
||||
configOptionsDifferent = true;
|
||||
|
@ -325,7 +372,7 @@ int main(string[] args)
|
|||
// no backup to check
|
||||
log.vdebug("WARNING: no backup config file was found, unable to validate if any changes made");
|
||||
}
|
||||
|
||||
|
||||
// If there was a backup, any modified values we need to worry about would been detected
|
||||
if (!cfg.getValueBool("display_config")) {
|
||||
// we are not testing the configuration
|
||||
|
@ -343,13 +390,13 @@ int main(string[] args)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Is there a backup of the config file if the config file exists?
|
||||
if ((exists(configFilePath)) && (!exists(configBackupFile))) {
|
||||
// create backup copy of current config file
|
||||
std.file.copy(configFilePath, configBackupFile);
|
||||
}
|
||||
|
||||
|
||||
// config file set options can be changed via CLI input, specifically these will impact sync and --resync will be needed:
|
||||
// --syncdir ARG
|
||||
// --skip-file ARG
|
||||
|
@ -365,7 +412,7 @@ int main(string[] args)
|
|||
syncDirDifferent = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// was the skip_file updated by CLI?
|
||||
if (cfg.configFileSkipFile != "") {
|
||||
// skip_file was set in config file
|
||||
|
@ -374,8 +421,8 @@ int main(string[] args)
|
|||
log.vdebug("skip_file: CLI override of config file option, --resync needed");
|
||||
skipFileDifferent = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// was the skip_dir updated by CLI?
|
||||
if (cfg.configFileSkipDir != "") {
|
||||
// skip_dir was set in config file
|
||||
|
@ -386,7 +433,7 @@ int main(string[] args)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Has anything triggered a --resync requirement?
|
||||
if (configOptionsDifferent || syncListDifferent || syncDirDifferent || skipFileDifferent || skipDirDifferent || businessSharedFoldersDifferent) {
|
||||
// --resync needed, is the user just testing configuration changes?
|
||||
|
@ -423,7 +470,7 @@ int main(string[] args)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// dry-run notification and database setup
|
||||
if (cfg.getValueBool("dry_run")) {
|
||||
// "DRY-RUN Configured. Output below shows what 'would' have occurred"
|
||||
|
@ -434,18 +481,18 @@ int main(string[] args)
|
|||
if (exists(cfg.databaseFilePathDryRun)) {
|
||||
// remove the existing file
|
||||
log.vdebug("Removing items-dryrun.sqlite3 as it still exists for some reason");
|
||||
safeRemove(cfg.databaseFilePathDryRun);
|
||||
safeRemove(cfg.databaseFilePathDryRun);
|
||||
}
|
||||
// silent cleanup of shm and wal files if they exist
|
||||
if (exists(dryRunShmFile)) {
|
||||
// remove items-dryrun.sqlite3-shm
|
||||
safeRemove(dryRunShmFile);
|
||||
safeRemove(dryRunShmFile);
|
||||
}
|
||||
if (exists(dryRunWalFile)) {
|
||||
// remove items-dryrun.sqlite3-wal
|
||||
safeRemove(dryRunWalFile);
|
||||
safeRemove(dryRunWalFile);
|
||||
}
|
||||
|
||||
|
||||
// Make a copy of the original items.sqlite3 for use as the dry run copy if it exists
|
||||
if (exists(cfg.databaseFilePath)) {
|
||||
// in a --dry-run --resync scenario, we should not copy the existing database file
|
||||
|
@ -459,7 +506,7 @@ int main(string[] args)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// sync_dir environment handling to handle ~ expansion properly
|
||||
bool shellEnvSet = false;
|
||||
if ((environment.get("SHELL") == "") && (environment.get("USER") == "")){
|
||||
|
@ -486,10 +533,10 @@ int main(string[] args)
|
|||
syncDir = cfg.getValueString("sync_dir");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// vdebug syncDir as set and calculated
|
||||
log.vdebug("syncDir: ", syncDir);
|
||||
|
||||
|
||||
// Configure the logging directory if different from application default
|
||||
// log_dir environment handling to handle ~ expansion properly
|
||||
string logDir = cfg.getValueString("log_dir");
|
||||
|
@ -514,7 +561,7 @@ int main(string[] args)
|
|||
// update log_dir with normalised path, with '~' expanded correctly
|
||||
cfg.setValueString("log_dir", logDir);
|
||||
}
|
||||
|
||||
|
||||
// Configure logging only if enabled
|
||||
if (cfg.getValueBool("enable_logging")){
|
||||
// Initialise using the configured logging directory
|
||||
|
@ -525,7 +572,7 @@ int main(string[] args)
|
|||
|
||||
// Configure whether notifications are used
|
||||
log.setNotifications(cfg.getValueBool("monitor") && !cfg.getValueBool("disable_notifications"));
|
||||
|
||||
|
||||
// Application upgrades - skilion version etc
|
||||
if (exists(databaseFilePath)) {
|
||||
if (!cfg.getValueBool("dry_run")) {
|
||||
|
@ -538,18 +585,19 @@ int main(string[] args)
|
|||
|
||||
// Handle --logout as separate item, do not 'resync' on a --logout / reauth
|
||||
if (cfg.getValueBool("logout")) {
|
||||
// log action
|
||||
log.vdebug("--logout requested");
|
||||
log.log("Deleting the saved authentication status ...");
|
||||
if (!cfg.getValueBool("dry_run")) {
|
||||
safeRemove(cfg.refreshTokenFilePath);
|
||||
}
|
||||
// Exit
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
// Handle --resync to remove local files
|
||||
if (cfg.getValueBool("resync")) {
|
||||
// log action
|
||||
log.vdebug("--resync requested");
|
||||
// "Deleting the saved status ..."
|
||||
// "Deleting the saved application sync status ..."
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,19));
|
||||
if (!cfg.getValueBool("dry_run")) {
|
||||
safeRemove(cfg.databaseFilePath);
|
||||
|
@ -557,7 +605,7 @@ int main(string[] args)
|
|||
safeRemove(cfg.uploadStateFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Display current application configuration, no application initialisation
|
||||
if (cfg.getValueBool("display_config")){
|
||||
// Display application version
|
||||
|
@ -566,7 +614,7 @@ int main(string[] args)
|
|||
writeln("Config path = ", cfg.configDirName);
|
||||
// Does a config file exist or are we using application defaults
|
||||
writeln("Config file found in config path = ", exists(configFilePath));
|
||||
|
||||
|
||||
// Config Options
|
||||
writeln("Config option 'language_identifier' = ", languageIdentifier);
|
||||
writeln("Config option 'check_nosync' = ", cfg.getValueBool("check_nosync"));
|
||||
|
@ -582,12 +630,12 @@ int main(string[] args)
|
|||
writeln("Config option 'upload_only' = ", cfg.getValueBool("upload_only"));
|
||||
writeln("Config option 'no_remote_delete' = ", cfg.getValueBool("no_remote_delete"));
|
||||
writeln("Config option 'remove_source_files' = ", cfg.getValueBool("remove_source_files"));
|
||||
|
||||
|
||||
// Is config option drive_id configured?
|
||||
if (cfg.getValueString("drive_id") != ""){
|
||||
writeln("Config option 'drive_id' = ", cfg.getValueString("drive_id"));
|
||||
}
|
||||
|
||||
|
||||
// Is sync_list configured?
|
||||
if (exists(syncListFilePath)){
|
||||
writeln("Config option 'sync_root_files' = ", cfg.getValueBool("sync_root_files"));
|
||||
|
@ -604,7 +652,7 @@ int main(string[] args)
|
|||
writeln("Config option 'sync_root_files' = ", cfg.getValueBool("sync_root_files"));
|
||||
writeln("Selective sync 'sync_list' configured = false");
|
||||
}
|
||||
|
||||
|
||||
// Is business_shared_folders configured
|
||||
if (exists(businessSharedFolderFilePath)){
|
||||
writeln("Business Shared Folders configured = true");
|
||||
|
@ -619,11 +667,11 @@ int main(string[] args)
|
|||
} else {
|
||||
writeln("Business Shared Folders configured = false");
|
||||
}
|
||||
|
||||
|
||||
// Exit
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
// Test if OneDrive service can be reached, exit if it cant be reached
|
||||
log.vdebug("Testing network to ensure network connectivity to Microsoft OneDrive Service");
|
||||
online = testNetwork();
|
||||
|
@ -636,9 +684,10 @@ int main(string[] args)
|
|||
return EXIT_FAILURE;
|
||||
} else {
|
||||
// Running as --monitor
|
||||
|
||||
// "Unable to reach Microsoft OneDrive API service at this point in time, re-trying network tests"
|
||||
log.error(provideLanguageTranslation(languageIdentifier,21),"\n");
|
||||
|
||||
|
||||
// re-try network connection to OneDrive
|
||||
// https://github.com/abraunegg/onedrive/issues/1184
|
||||
// Back off & retry with incremental delay
|
||||
|
@ -646,13 +695,13 @@ int main(string[] args)
|
|||
int retryAttempts = 1;
|
||||
int backoffInterval = 1;
|
||||
int maxBackoffInterval = 3600;
|
||||
|
||||
|
||||
bool retrySuccess = false;
|
||||
while (!retrySuccess){
|
||||
// retry to access OneDrive API
|
||||
backoffInterval++;
|
||||
int thisBackOffInterval = retryAttempts*backoffInterval;
|
||||
log.vdebug(" Retry Attempt: ", retryAttempts);
|
||||
log.vdebug(" Retry Attempt: ", retryAttempts);
|
||||
if (thisBackOffInterval <= maxBackoffInterval) {
|
||||
log.vdebug(" Retry In (seconds): ", thisBackOffInterval);
|
||||
Thread.sleep(dur!"seconds"(thisBackOffInterval));
|
||||
|
@ -673,7 +722,7 @@ int main(string[] args)
|
|||
// we have attempted to re-connect X number of times
|
||||
// false set this to true to break out of while loop
|
||||
retrySuccess = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Increment & loop around
|
||||
retryAttempts++;
|
||||
|
@ -686,7 +735,7 @@ int main(string[] args)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Initialize OneDrive, check for authorization
|
||||
if (online) {
|
||||
// we can only initialise if we are online
|
||||
|
@ -696,25 +745,25 @@ int main(string[] args)
|
|||
onedriveInitialised = oneDrive.init();
|
||||
oneDrive.printAccessToken = cfg.getValueBool("print_token");
|
||||
}
|
||||
|
||||
|
||||
if (!onedriveInitialised) {
|
||||
// "Could not initialise the OneDrive API"
|
||||
log.error(provideLanguageTranslation(languageIdentifier,25));
|
||||
// Use exit scopes to shutdown API
|
||||
return EXIT_UNAUTHORIZED;
|
||||
}
|
||||
|
||||
|
||||
// if --synchronize or --monitor not passed in, configure the flag to display help & exit
|
||||
if (cfg.getValueBool("synchronize") || cfg.getValueBool("monitor")) {
|
||||
performSyncOK = true;
|
||||
}
|
||||
|
||||
|
||||
// create-directory, remove-directory, source-directory, destination-directory
|
||||
// these are activities that dont perform a sync, so to not generate an error message for these items either
|
||||
if (((cfg.getValueString("create_directory") != "") || (cfg.getValueString("remove_directory") != "")) || ((cfg.getValueString("source_directory") != "") && (cfg.getValueString("destination_directory") != "")) || (cfg.getValueString("get_file_link") != "") || (cfg.getValueString("create_share_link") != "") || (cfg.getValueString("get_o365_drive_id") != "") || cfg.getValueBool("display_sync_status") || cfg.getValueBool("list_business_shared_folders")) {
|
||||
performSyncOK = true;
|
||||
}
|
||||
|
||||
|
||||
// Were acceptable sync operations provided? Was --synchronize or --monitor passed in
|
||||
if (!performSyncOK) {
|
||||
// was the application just authorised?
|
||||
|
@ -746,7 +795,7 @@ int main(string[] args)
|
|||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if --synchronize && --monitor passed in, exit & display help as these conflict with each other
|
||||
if (cfg.getValueBool("synchronize") && cfg.getValueBool("monitor")) {
|
||||
// "ERROR: --synchronize and --monitor cannot be used together"
|
||||
|
@ -756,7 +805,7 @@ int main(string[] args)
|
|||
// Use exit scopes to shutdown API
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
// Initialize the item database
|
||||
// "Opening the item database ..."
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,32));
|
||||
|
@ -769,7 +818,7 @@ int main(string[] args)
|
|||
log.vdebug("Using database file: ", asNormalizedPath(cfg.databaseFilePathDryRun));
|
||||
itemDb = new ItemDatabase(cfg.databaseFilePathDryRun);
|
||||
}
|
||||
|
||||
|
||||
// What are the permission that have been set for the application?
|
||||
// These are relevant for:
|
||||
// - The ~/OneDrive parent folder or 'sync_dir' configured item
|
||||
|
@ -787,7 +836,7 @@ int main(string[] args)
|
|||
log.vdebug("Configuring default new file permissions as: ", cfg.getValueLong("sync_file_permissions"));
|
||||
cfg.configureRequiredFilePermisions();
|
||||
}
|
||||
|
||||
|
||||
// configure the sync direcory based on syncDir config option
|
||||
// "All operations will be performed in: "
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,34), syncDir);
|
||||
|
@ -807,13 +856,13 @@ int main(string[] args)
|
|||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Change the working directory to the 'sync_dir' configured item
|
||||
chdir(syncDir);
|
||||
|
||||
|
||||
// Configure selective sync by parsing and getting a regex for skip_file config component
|
||||
auto selectiveSync = new SelectiveSync();
|
||||
|
||||
|
||||
// load sync_list if it exists
|
||||
if (exists(syncListFilePath)){
|
||||
log.vdebug("Loading user configured sync_list file ...");
|
||||
|
@ -832,7 +881,7 @@ int main(string[] args)
|
|||
}
|
||||
}
|
||||
selectiveSync.load(syncListFilePath);
|
||||
|
||||
|
||||
// load business_shared_folders if it exists
|
||||
if (exists(businessSharedFolderFilePath)){
|
||||
log.vdebug("Loading user configured business_shared_folders file ...");
|
||||
|
@ -845,27 +894,27 @@ int main(string[] args)
|
|||
}
|
||||
}
|
||||
selectiveSync.loadSharedFolders(businessSharedFolderFilePath);
|
||||
|
||||
|
||||
// Configure skip_dir, skip_file, skip-dir-strict-match & skip_dotfiles from config entries
|
||||
// Handle skip_dir configuration in config file
|
||||
log.vdebug("Configuring skip_dir ...");
|
||||
log.vdebug("skip_dir: ", cfg.getValueString("skip_dir"));
|
||||
selectiveSync.setDirMask(cfg.getValueString("skip_dir"));
|
||||
|
||||
|
||||
// Was --skip-dir-strict-match configured?
|
||||
log.vdebug("Configuring skip_dir_strict_match ...");
|
||||
log.vdebug("skip_dir_strict_match: ", cfg.getValueBool("skip_dir_strict_match"));
|
||||
if (cfg.getValueBool("skip_dir_strict_match")) {
|
||||
selectiveSync.setSkipDirStrictMatch();
|
||||
}
|
||||
|
||||
|
||||
// Was --skip-dot-files configured?
|
||||
log.vdebug("Configuring skip_dotfiles ...");
|
||||
log.vdebug("skip_dotfiles: ", cfg.getValueBool("skip_dotfiles"));
|
||||
if (cfg.getValueBool("skip_dotfiles")) {
|
||||
selectiveSync.setSkipDotfiles();
|
||||
}
|
||||
|
||||
|
||||
// Handle skip_file configuration in config file
|
||||
log.vdebug("Configuring skip_file ...");
|
||||
// Validate skip_file to ensure that this does not contain an invalid configuration
|
||||
|
@ -881,7 +930,7 @@ int main(string[] args)
|
|||
// All skip_file entries are valid
|
||||
log.vdebug("skip_file: ", cfg.getValueString("skip_file"));
|
||||
selectiveSync.setFileMask(cfg.getValueString("skip_file"));
|
||||
|
||||
|
||||
// Initialize the sync engine
|
||||
auto sync = new SyncEngine(cfg, oneDrive, itemDb, selectiveSync);
|
||||
try {
|
||||
|
@ -908,7 +957,7 @@ int main(string[] args)
|
|||
if (syncListConfigured) {
|
||||
sync.setSyncListConfigured();
|
||||
}
|
||||
|
||||
|
||||
// Do we need to configure specific --upload-only options?
|
||||
if (cfg.getValueBool("upload_only")) {
|
||||
// --upload-only was passed in or configured
|
||||
|
@ -927,10 +976,13 @@ int main(string[] args)
|
|||
sync.setLocalDeleteAfterUpload();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Do we configure to disable the upload validation routine
|
||||
if (cfg.getValueBool("disable_upload_validation")) sync.setDisableUploadValidation();
|
||||
|
||||
|
||||
// Do we configure to disable the download validation routine
|
||||
if (cfg.getValueBool("disable_download_validation")) sync.setDisableDownloadValidation();
|
||||
|
||||
// Has the user enabled to bypass data preservation of renaming local files when there is a conflict?
|
||||
if (cfg.getValueBool("bypass_data_preservation")) {
|
||||
// "WARNING: Application has been configured to bypass local data preservation in the event of file conflict"
|
||||
|
@ -939,7 +991,7 @@ int main(string[] args)
|
|||
log.log(provideLanguageTranslation(languageIdentifier,40));
|
||||
sync.setBypassDataPreservation();
|
||||
}
|
||||
|
||||
|
||||
// Are we configured to use a National Cloud Deployment
|
||||
if (cfg.getValueString("azure_ad_endpoint") != "") {
|
||||
// value is configured, is it a valid value?
|
||||
|
@ -948,7 +1000,7 @@ int main(string[] args)
|
|||
sync.setNationalCloudDeployment();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Do we need to validate the syncDir to check for the presence of a '.nosync' file
|
||||
if (cfg.getValueBool("check_nomount")) {
|
||||
// we were asked to check the mounts
|
||||
|
@ -959,53 +1011,53 @@ int main(string[] args)
|
|||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Do we need to create or remove a directory?
|
||||
if ((cfg.getValueString("create_directory") != "") || (cfg.getValueString("remove_directory") != "")) {
|
||||
|
||||
|
||||
if (cfg.getValueString("create_directory") != "") {
|
||||
// create a directory on OneDrive
|
||||
sync.createDirectoryNoSync(cfg.getValueString("create_directory"));
|
||||
}
|
||||
|
||||
|
||||
if (cfg.getValueString("remove_directory") != "") {
|
||||
// remove a directory on OneDrive
|
||||
sync.deleteDirectoryNoSync(cfg.getValueString("remove_directory"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Are we renaming or moving a directory?
|
||||
if ((cfg.getValueString("source_directory") != "") && (cfg.getValueString("destination_directory") != "")) {
|
||||
// We are renaming or moving a directory
|
||||
sync.renameDirectoryNoSync(cfg.getValueString("source_directory"), cfg.getValueString("destination_directory"));
|
||||
}
|
||||
|
||||
|
||||
// Are we obtaining the Office 365 Drive ID for a given Office 365 SharePoint Shared Library?
|
||||
if (cfg.getValueString("get_o365_drive_id") != "") {
|
||||
sync.querySiteCollectionForDriveID(cfg.getValueString("get_o365_drive_id"));
|
||||
// Exit application
|
||||
// Exit application
|
||||
// Use exit scopes to shutdown API
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
// Are we createing an anonymous read-only shareable link for an existing file on OneDrive?
|
||||
if (cfg.getValueString("create_share_link") != "") {
|
||||
// Query OneDrive for the file, and if valid, create a shareable link for the file
|
||||
sync.createShareableLinkForFile(cfg.getValueString("create_share_link"));
|
||||
// Exit application
|
||||
// Exit application
|
||||
// Use exit scopes to shutdown API
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
// Are we obtaining the URL path for a synced file?
|
||||
if (cfg.getValueString("get_file_link") != "") {
|
||||
// Query OneDrive for the file link
|
||||
sync.queryOneDriveForFileURL(cfg.getValueString("get_file_link"), syncDir);
|
||||
// Exit application
|
||||
// Exit application
|
||||
// Use exit scopes to shutdown API
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
// Are we listing OneDrive Business Shared Folders
|
||||
if (cfg.getValueBool("list_business_shared_folders")) {
|
||||
// Is this a business account type?
|
||||
|
@ -1016,11 +1068,11 @@ int main(string[] args)
|
|||
// "ERROR: Unsupported account type for listing OneDrive Business Shared Folders"
|
||||
log.error(provideLanguageTranslation(languageIdentifier,42));
|
||||
}
|
||||
// Exit application
|
||||
// Exit application
|
||||
// Use exit scopes to shutdown API
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
// Are we going to sync OneDrive Business Shared Folders
|
||||
if (cfg.getValueBool("sync_business_shared_folders")) {
|
||||
// Is this a business account type?
|
||||
|
@ -1032,7 +1084,7 @@ int main(string[] args)
|
|||
log.error(provideLanguageTranslation(languageIdentifier,43));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Are we displaying the sync status of the client?
|
||||
if (cfg.getValueBool("display_sync_status")) {
|
||||
string remotePath = "/";
|
||||
|
@ -1043,7 +1095,7 @@ int main(string[] args)
|
|||
}
|
||||
sync.queryDriveForChanges(remotePath);
|
||||
}
|
||||
|
||||
|
||||
// Are we performing a sync, or monitor operation?
|
||||
if ((cfg.getValueBool("synchronize")) || (cfg.getValueBool("monitor"))) {
|
||||
// Initialise the monitor class, so that we can do more granular inotify handling when performing the actual sync
|
||||
|
@ -1071,19 +1123,19 @@ int main(string[] args)
|
|||
// fullScanRequired = false, for final true-up
|
||||
// but if we have sync_list configured, use syncListConfigured which = true
|
||||
performSync(sync, cfg.getValueString("single_directory"), cfg.getValueBool("download_only"), cfg.getValueBool("local_first"), cfg.getValueBool("upload_only"), LOG_NORMAL, false, syncListConfigured, displaySyncOptions, cfg.getValueBool("monitor"), m);
|
||||
|
||||
|
||||
// Write WAL and SHM data to file for this sync
|
||||
log.vdebug("Merge contents of WAL and SHM files into main database file");
|
||||
itemDb.performVacuum();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (cfg.getValueBool("monitor")) {
|
||||
// "Initialising monitor ..."
|
||||
log.logAndNotify(provideLanguageTranslation(languageIdentifier,45));
|
||||
// "OneDrive monitor interval (seconds): "
|
||||
log.log(provideLanguageTranslation(languageIdentifier,46), cfg.getValueLong("monitor_interval"));
|
||||
|
||||
log.log(provideLanguageTranslation(languageIdentifier,46), cfg.getValueLong("monitor_interval"));
|
||||
|
||||
m.onDirCreated = delegate(string path) {
|
||||
// Handle .folder creation if skip_dotfiles is enabled
|
||||
if ((cfg.getValueBool("skip_dotfiles")) && (selectiveSync.isDotFile(path))) {
|
||||
|
@ -1189,7 +1241,8 @@ int main(string[] args)
|
|||
// sync list is configured
|
||||
syncListConfiguredFullScanOverride = true;
|
||||
}
|
||||
|
||||
immutable bool webhookEnabled = cfg.getValueBool("webhook_enabled");
|
||||
|
||||
while (performMonitor) {
|
||||
if (!cfg.getValueBool("download_only")) {
|
||||
try {
|
||||
|
@ -1200,7 +1253,35 @@ int main(string[] args)
|
|||
log.error(provideLanguageTranslation(languageIdentifier,62), e.msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Check for notifications pushed from Microsoft to the webhook
|
||||
bool notificationReceived = false;
|
||||
if (webhookEnabled) {
|
||||
// Create a subscription on the first run, or renew the subscription
|
||||
// on subsequent runs when it is about to expire.
|
||||
oneDrive.createOrRenewSubscription();
|
||||
|
||||
// Process incoming notifications if any.
|
||||
|
||||
// Empirical evidence shows that Microsoft often sends multiple
|
||||
// notifications for one single change, so we need a loop to exhaust
|
||||
// all signals that were queued up by the webhook. The notifications
|
||||
// do not contain any actual changes, and we will always rely do the
|
||||
// delta endpoint to sync to latest. Therefore, only one sync run is
|
||||
// good enough to catch up for multiple notifications.
|
||||
for (int signalCount = 0;; signalCount++) {
|
||||
const auto signalExists = receiveTimeout(dur!"seconds"(-1), (ulong _) {});
|
||||
if (signalExists) {
|
||||
notificationReceived = true;
|
||||
} else {
|
||||
if (notificationReceived) {
|
||||
log.log("Received ", signalCount," refresh signals from the webhook");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto currTime = MonoTime.currTime();
|
||||
// has monitor_interval elapsed or are we at application startup / monitor startup?
|
||||
// in a --resync scenario, if we have not 're-populated' the database, valid changes will get skipped:
|
||||
|
@ -1210,7 +1291,7 @@ int main(string[] args)
|
|||
// Moving random_files/2eVPInOMTFNXzRXeNMEoJch5OR9XpGby to target/2eVPInOMTFNXzRXeNMEoJch5OR9XpGby
|
||||
// Skipping uploading this new file as parent path is not in the database: target/2eVPInOMTFNXzRXeNMEoJch5OR9XpGby
|
||||
// 'target' should be in the DB, it should also exist online, but because of --resync, it does not exist in the database thus parent check fails
|
||||
if ((currTime - lastCheckTime > checkInterval) || (monitorLoopFullCount == 0)) {
|
||||
if (notificationReceived || (currTime - lastCheckTime > checkInterval) || (monitorLoopFullCount == 0)) {
|
||||
// monitor sync loop
|
||||
logOutputMessage = "################################################## NEW LOOP ##################################################";
|
||||
if (displaySyncOptions) {
|
||||
|
@ -1224,7 +1305,7 @@ int main(string[] args)
|
|||
if (displayMemoryUsage) {
|
||||
log.displayMemoryUsagePreGC();
|
||||
}
|
||||
|
||||
|
||||
// log monitor output suppression
|
||||
logMonitorCounter += 1;
|
||||
if (logMonitorCounter > logInterval) {
|
||||
|
@ -1246,7 +1327,7 @@ int main(string[] args)
|
|||
fullScanRequired = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (displaySyncOptions) {
|
||||
// sync option handling per sync loop
|
||||
log.log("fullScanCounter = ", fullScanCounter);
|
||||
|
@ -1311,14 +1392,14 @@ int main(string[] args)
|
|||
if (displayMemoryUsage) {
|
||||
log.displayMemoryUsagePostGC();
|
||||
}
|
||||
|
||||
|
||||
// Write WAL and SHM data to file for this loop
|
||||
log.vdebug("Merge contents of WAL and SHM files into main database file");
|
||||
itemDb.performVacuum();
|
||||
|
||||
|
||||
// monitor loop complete
|
||||
logOutputMessage = "################################################ LOOP COMPLETE ###############################################";
|
||||
|
||||
|
||||
// Handle display options
|
||||
if (displaySyncOptions) {
|
||||
log.log(logOutputMessage);
|
||||
|
@ -1348,20 +1429,20 @@ int main(string[] args)
|
|||
// remove the file
|
||||
log.vdebug("Removing items-dryrun.sqlite3 as dry run operations complete");
|
||||
// remove items-dryrun.sqlite3
|
||||
safeRemove(cfg.databaseFilePathDryRun);
|
||||
safeRemove(cfg.databaseFilePathDryRun);
|
||||
}
|
||||
// silent cleanup of shm and wal files if they exist
|
||||
if (exists(dryRunShmFile)) {
|
||||
// remove items-dryrun.sqlite3-shm
|
||||
safeRemove(dryRunShmFile);
|
||||
safeRemove(dryRunShmFile);
|
||||
}
|
||||
if (exists(dryRunWalFile)) {
|
||||
// remove items-dryrun.sqlite3-wal
|
||||
safeRemove(dryRunWalFile);
|
||||
safeRemove(dryRunWalFile);
|
||||
}
|
||||
}
|
||||
|
||||
// Exit application
|
||||
|
||||
// Exit application
|
||||
// Use exit scopes to shutdown API
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
@ -1393,14 +1474,14 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
string remotePath = "/";
|
||||
string localPath = ".";
|
||||
string logOutputMessage;
|
||||
|
||||
|
||||
// performSync API scan triggers
|
||||
log.vdebug("performSync API scan triggers");
|
||||
log.vdebug("-----------------------------");
|
||||
log.vdebug("fullScanRequired = ", fullScanRequired);
|
||||
log.vdebug("syncListConfiguredFullScanOverride = ", syncListConfiguredFullScanOverride);
|
||||
log.vdebug("-----------------------------");
|
||||
|
||||
|
||||
// Are we doing a single directory sync?
|
||||
if (singleDirectory != ""){
|
||||
// Need two different path strings here
|
||||
|
@ -1409,12 +1490,12 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
// Set flag for singleDirectoryScope for change handling
|
||||
sync.setSingleDirectoryScope();
|
||||
}
|
||||
|
||||
|
||||
// Due to Microsoft Sharepoint 'enrichment' of files, we try to download the Microsoft modified file automatically
|
||||
// Set flag if we are in upload only state to handle this differently
|
||||
// See: https://github.com/OneDrive/onedrive-api-docs/issues/935 for further details
|
||||
// See: https://github.com/OneDrive/onedrive-api-docs/issues/935 for further details
|
||||
if (uploadOnly) sync.setUploadOnly();
|
||||
|
||||
|
||||
do {
|
||||
try {
|
||||
// starting a sync
|
||||
|
@ -1500,8 +1581,8 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
// "Syncing changes from OneDrive only - NOT syncing local data changes to OneDrive ..."
|
||||
if (downloadOnly) log.log(provideLanguageTranslation(languageIdentifier,77));
|
||||
sync.applyDifferences(false);
|
||||
|
||||
// is this a download only request?
|
||||
|
||||
// is this a download only request?
|
||||
if (!downloadOnly) {
|
||||
// process local changes walking the entire path checking for changes
|
||||
// in monitor mode all local changes are captured via inotify
|
||||
|
@ -1515,7 +1596,7 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
log.vdebug(logOutputMessage);
|
||||
log.vdebug(syncCallLogOutput);
|
||||
}
|
||||
|
||||
|
||||
// What sort of local scan do we want to do?
|
||||
// In --monitor mode, when performing the DB scan, a race condition occurs where by if a file or folder is moved during this process
|
||||
// the inotify event is discarded once performSync() is finished (see m.update(false) above), so these events need to be handled
|
||||
|
@ -1536,20 +1617,20 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
// handle any inotify events that occured 'whilst' we were scanning the local filesystem
|
||||
m.update(true);
|
||||
}
|
||||
|
||||
|
||||
// At this point, all OneDrive changes / local changes should be uploaded and in sync
|
||||
// This MAY not be the case when using sync_list, thus a full walk of OneDrive ojects is required
|
||||
|
||||
|
||||
// --synchronize & no sync_list : fullScanRequired = false, syncListConfiguredFullScanOverride = false
|
||||
// --synchronize & sync_list in use : fullScanRequired = false, syncListConfiguredFullScanOverride = true
|
||||
|
||||
|
||||
// --monitor loops around 10 iterations. On the 1st loop, sets fullScanRequired = false, syncListConfiguredFullScanOverride = true if requried
|
||||
|
||||
|
||||
// --monitor & no sync_list (loop #1) : fullScanRequired = true, syncListConfiguredFullScanOverride = false
|
||||
// --monitor & no sync_list (loop #2 - #10) : fullScanRequired = false, syncListConfiguredFullScanOverride = false
|
||||
// --monitor & sync_list in use (loop #1) : fullScanRequired = true, syncListConfiguredFullScanOverride = true
|
||||
// --monitor & sync_list in use (loop #2 - #10) : fullScanRequired = false, syncListConfiguredFullScanOverride = false
|
||||
|
||||
|
||||
// Do not perform a full walk of the OneDrive objects
|
||||
if ((!fullScanRequired) && (!syncListConfiguredFullScanOverride)){
|
||||
logOutputMessage = "Final True-Up: Do not perform a full walk of the OneDrive objects - not required";
|
||||
|
@ -1563,7 +1644,7 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
}
|
||||
sync.applyDifferences(false);
|
||||
}
|
||||
|
||||
|
||||
// Perform a full walk of OneDrive objects because sync_list is in use / or trigger was set in --monitor loop
|
||||
if ((!fullScanRequired) && (syncListConfiguredFullScanOverride)){
|
||||
logOutputMessage = "Final True-Up: Perform a full walk of OneDrive objects because sync_list is in use / or trigger was set in --monitor loop";
|
||||
|
@ -1577,7 +1658,7 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
}
|
||||
sync.applyDifferences(true);
|
||||
}
|
||||
|
||||
|
||||
// Perform a full walk of OneDrive objects because a full scan was required
|
||||
if ((fullScanRequired) && (!syncListConfiguredFullScanOverride)){
|
||||
logOutputMessage = "Final True-Up: Perform a full walk of OneDrive objects because a full scan was required";
|
||||
|
@ -1588,10 +1669,10 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
} else {
|
||||
log.vdebug(logOutputMessage);
|
||||
log.vdebug(syncCallLogOutput);
|
||||
}
|
||||
}
|
||||
sync.applyDifferences(true);
|
||||
}
|
||||
|
||||
|
||||
// Perform a full walk of OneDrive objects because a full scan was required and sync_list is in use and trigger was set in --monitor loop
|
||||
if ((fullScanRequired) && (syncListConfiguredFullScanOverride)){
|
||||
logOutputMessage = "Final True-Up: Perform a full walk of OneDrive objects because a full scan was required and sync_list is in use and trigger was set in --monitor loop";
|
||||
|
@ -1609,7 +1690,7 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// sync is complete
|
||||
logOutputMessage = "################################################ SYNC COMPLETE ###############################################";
|
||||
if (displaySyncOptions) {
|
||||
|
@ -1617,7 +1698,7 @@ void performSync(SyncEngine sync, string singleDirectory, bool downloadOnly, boo
|
|||
} else {
|
||||
log.vdebug(logOutputMessage);
|
||||
}
|
||||
|
||||
|
||||
count = -1;
|
||||
} catch (Exception e) {
|
||||
if (++count == 3) {
|
||||
|
@ -1643,16 +1724,22 @@ auto assumeNoGC(T) (T t) if (isFunctionPointer!T || isDelegate!T)
|
|||
extern(C) nothrow @nogc @system void exitHandler(int value) {
|
||||
try {
|
||||
assumeNoGC ( () {
|
||||
|
||||
// Generate log message
|
||||
// " Got termination signal, shutting down DB connection"
|
||||
log.log(provideLanguageTranslation(languageIdentifier,76));
|
||||
// if initialised, shut down the HTTP instance
|
||||
if (onedriveInitialised) {
|
||||
log.vdebug("Shutting down the HTTP instance");
|
||||
oneDrive.shutdown();
|
||||
}
|
||||
// was itemDb initialised?
|
||||
if (itemDb !is null) {
|
||||
// Make sure the .wal file is incorporated into the main db before we exit
|
||||
log.vdebug("Shutting down db connection");
|
||||
itemDb.performVacuum();
|
||||
destroy(itemDb);
|
||||
}
|
||||
// Use exit scopes to shutdown OneDrive API
|
||||
})();
|
||||
} catch(Exception e) {}
|
||||
exit(0);
|
||||
|
|
467
src/onedrive.d
467
src/onedrive.d
File diff suppressed because it is too large
Load diff
275
src/sync.d
275
src/sync.d
|
@ -30,6 +30,9 @@ private bool uploadOnly = false;
|
|||
// Do we configure to disable the upload validation routine
|
||||
private bool disableUploadValidation = false;
|
||||
|
||||
// Do we configure to disable the download validation routine
|
||||
private bool disableDownloadValidation = false;
|
||||
|
||||
private bool isItemFolder(const ref JSONValue item)
|
||||
{
|
||||
return ("folder" in item) != null;
|
||||
|
@ -400,7 +403,15 @@ final class SyncEngine
|
|||
accountType = oneDriveDetails["driveType"].str;
|
||||
defaultDriveId = oneDriveDetails["id"].str;
|
||||
defaultRootId = oneDriveRootDetails["id"].str;
|
||||
remainingFreeSpace = oneDriveDetails["quota"]["remaining"].integer;
|
||||
|
||||
// get the remaining size from OneDrive API
|
||||
if ("remaining" in oneDriveDetails["quota"]){
|
||||
// use the value provided
|
||||
remainingFreeSpace = oneDriveDetails["quota"]["remaining"].integer;
|
||||
} else {
|
||||
// set at zero
|
||||
remainingFreeSpace = 0;
|
||||
}
|
||||
|
||||
// Make sure that defaultDriveId is in our driveIDs array to use when checking if item is in database
|
||||
// Keep the driveIDsArray with unique entries only
|
||||
|
@ -430,10 +441,12 @@ final class SyncEngine
|
|||
if (accountType == "personal"){
|
||||
// "ERROR: OneDrive quota information is missing. Potentially your OneDrive account currently has zero space available. Please free up some space online."
|
||||
log.error(provideLanguageTranslation(languageIdentifier,83));
|
||||
quotaAvailable = false;
|
||||
} else {
|
||||
// quota details not available
|
||||
// "ERROR: OneDrive quota information is being restricted. Please fix by speaking to your OneDrive / Office 365 Administrator."
|
||||
log.error(provideLanguageTranslation(languageIdentifier,84));
|
||||
quotaRestricted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -465,6 +478,7 @@ final class SyncEngine
|
|||
// If account type is documentLibrary - then most likely this is a SharePoint repository
|
||||
// and files 'may' be modified after upload. See: https://github.com/abraunegg/onedrive/issues/205
|
||||
if(accountType == "documentLibrary") {
|
||||
// set this flag for SharePoint regardless of --disable-upload-validation being used
|
||||
setDisableUploadValidation();
|
||||
}
|
||||
|
||||
|
@ -574,6 +588,18 @@ final class SyncEngine
|
|||
log.vdebug("documentLibrary account type - flagging to disable upload validation checks due to Microsoft SharePoint file modification enrichments");
|
||||
}
|
||||
|
||||
// Configure disableDownloadValidation if function is called
|
||||
// By default, disableDownloadValidation = false;
|
||||
// Meaning we will always validate our downloads
|
||||
// However, when downloading files from SharePoint, the OneDrive API will not advise the correct file size
|
||||
// which means that the application thinks the file download has failed as the size is different / hash is different
|
||||
// See: https://github.com/abraunegg/onedrive/discussions/1667
|
||||
void setDisableDownloadValidation()
|
||||
{
|
||||
disableDownloadValidation = true;
|
||||
log.vdebug("Flagging to disable download validation checks due to user request");
|
||||
}
|
||||
|
||||
// Issue #658 Handling
|
||||
// If an existing folder is moved into a sync_list valid path (where it previously was out of scope due to sync_list),
|
||||
// then set this flag to true, so that on the second 'true-up' sync, we force a rescan of the OneDrive path to capture any 'files'
|
||||
|
@ -666,7 +692,33 @@ final class SyncEngine
|
|||
// query OneDrive Business Shared Folders shared with me
|
||||
// "Attempting to sync OneDrive Business Shared Folders"
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,95));
|
||||
JSONValue graphQuery = onedrive.getSharedWithMe();
|
||||
JSONValue graphQuery;
|
||||
try {
|
||||
graphQuery = onedrive.getSharedWithMe();
|
||||
} catch (OneDriveException e) {
|
||||
if (e.httpStatusCode == 401) {
|
||||
// HTTP request returned status code 401 (Unauthorized)
|
||||
displayOneDriveErrorMessage(e.msg, getFunctionName!({}));
|
||||
log.errorAndNotify("\nERROR: Check your configuration as your refresh_token may be empty or invalid. You may need to issue a --logout and re-authorise this client.\n");
|
||||
// Must exit here
|
||||
exit(-1);
|
||||
}
|
||||
if (e.httpStatusCode == 429) {
|
||||
// HTTP request returned status code 429 (Too Many Requests). We need to leverage the response Retry-After HTTP header to ensure minimum delay until the throttle is removed.
|
||||
handleOneDriveThrottleRequest();
|
||||
// Retry original request by calling function again to avoid replicating any further error handling
|
||||
log.vdebug("Retrying original request that generated the OneDrive HTTP 429 Response Code (Too Many Requests) - graphQuery = onedrive.getSharedWithMe();");
|
||||
graphQuery = onedrive.getSharedWithMe();
|
||||
}
|
||||
if (e.httpStatusCode >= 500) {
|
||||
// There was a HTTP 5xx Server Side Error
|
||||
displayOneDriveErrorMessage(e.msg, getFunctionName!({}));
|
||||
// Must exit here
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (graphQuery.type() == JSONType.object) {
|
||||
string sharedFolderName;
|
||||
foreach (searchResult; graphQuery["value"].array) {
|
||||
|
@ -847,7 +899,32 @@ final class SyncEngine
|
|||
// "Attempting to sync OneDrive Business Shared Folders"
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,95));
|
||||
// query OneDrive Business Shared Folders shared with me
|
||||
JSONValue graphQuery = onedrive.getSharedWithMe();
|
||||
JSONValue graphQuery;
|
||||
try {
|
||||
graphQuery = onedrive.getSharedWithMe();
|
||||
} catch (OneDriveException e) {
|
||||
if (e.httpStatusCode == 401) {
|
||||
// HTTP request returned status code 401 (Unauthorized)
|
||||
displayOneDriveErrorMessage(e.msg, getFunctionName!({}));
|
||||
log.errorAndNotify("\nERROR: Check your configuration as your refresh_token may be empty or invalid. You may need to issue a --logout and re-authorise this client.\n");
|
||||
// Must exit here
|
||||
exit(-1);
|
||||
}
|
||||
if (e.httpStatusCode == 429) {
|
||||
// HTTP request returned status code 429 (Too Many Requests). We need to leverage the response Retry-After HTTP header to ensure minimum delay until the throttle is removed.
|
||||
handleOneDriveThrottleRequest();
|
||||
// Retry original request by calling function again to avoid replicating any further error handling
|
||||
log.vdebug("Retrying original request that generated the OneDrive HTTP 429 Response Code (Too Many Requests) - graphQuery = onedrive.getSharedWithMe();");
|
||||
graphQuery = onedrive.getSharedWithMe();
|
||||
}
|
||||
if (e.httpStatusCode >= 500) {
|
||||
// There was a HTTP 5xx Server Side Error
|
||||
displayOneDriveErrorMessage(e.msg, getFunctionName!({}));
|
||||
// Must exit here
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
if (graphQuery.type() == JSONType.object) {
|
||||
// valid response from OneDrive
|
||||
string sharedFolderName;
|
||||
|
@ -1235,10 +1312,13 @@ final class SyncEngine
|
|||
}
|
||||
} else {
|
||||
// quota details returned, but for a drive id that is not ours
|
||||
if (currentDriveQuota["quota"]["remaining"].integer <= 0) {
|
||||
// value returned is 0 or less than 0
|
||||
// "OneDrive quota information is set at zero, as this is not our drive id, ignoring"
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,121));
|
||||
if ("remaining" in currentDriveQuota["quota"]){
|
||||
// remaining is in the quota JSON response
|
||||
if (currentDriveQuota["quota"]["remaining"].integer <= 0) {
|
||||
// value returned is 0 or less than 0
|
||||
// "OneDrive quota information is set at zero, as this is not our drive id, ignoring"
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,121));
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -2544,32 +2624,29 @@ final class SyncEngine
|
|||
// "Local item does not exist in local database - replacing with file from OneDrive - failed download?"
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,155));
|
||||
|
||||
// was --resync issued?
|
||||
if (cfg.getValueBool("resync")) {
|
||||
// in a --resync scenario we have zero way of knowing IF the local file is meant to be the right file
|
||||
// we have passed the following checks:
|
||||
// 1. file exists locally
|
||||
// 2. local modified time > remote modified time
|
||||
// 3. id is not in the database
|
||||
// 4. --resync was issued
|
||||
auto ext = extension(path);
|
||||
auto newPath = path.chomp(ext) ~ "-" ~ deviceName ~ ext;
|
||||
// has the user configured to IGNORE local data protection rules?
|
||||
if (bypassDataPreservation) {
|
||||
// The user has configured to ignore data safety checks and overwrite local data rather than preserve & rename
|
||||
// "WARNING: Local Data Protection has been disabled by your configuration. You may experience data loss on this file: "
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,149), path);
|
||||
// in a --resync scenario or if items.sqlite3 was deleted before startup we have zero way of knowing IF the local file is meant to be the right file
|
||||
// we have passed the following checks:
|
||||
// 1. file exists locally
|
||||
// 2. local modified time > remote modified time
|
||||
// 3. id is not in the database
|
||||
|
||||
auto ext = extension(path);
|
||||
auto newPath = path.chomp(ext) ~ "-" ~ deviceName ~ ext;
|
||||
// has the user configured to IGNORE local data protection rules?
|
||||
if (bypassDataPreservation) {
|
||||
// The user has configured to ignore data safety checks and overwrite local data rather than preserve & rename
|
||||
// "WARNING: Local Data Protection has been disabled by your configuration. You may experience data loss on this file: "
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,149), path);
|
||||
} else {
|
||||
// local data protection is configured, renaming local file
|
||||
// "The local item is out-of-sync with OneDrive, renaming to preserve existing file and prevent data loss due to --resync: "
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,156), path, " -> ", newPath);
|
||||
// perform the rename action of the local file
|
||||
if (!dryRun) {
|
||||
safeRename(path);
|
||||
} else {
|
||||
// local data protection is configured, renaming local file
|
||||
// "The local item is out-of-sync with OneDrive, renaming to preserve existing file and prevent data loss due to --resync: "
|
||||
log.vlog(provideLanguageTranslation(languageIdentifier,156), path, " -> ", newPath);
|
||||
// perform the rename action of the local file
|
||||
if (!dryRun) {
|
||||
safeRename(path);
|
||||
} else {
|
||||
// Expectation here is that there is a new file locally (newPath) however as we don't create this, the "new file" will not be uploaded as it does not exist
|
||||
log.vdebug("DRY-RUN: Skipping local file rename");
|
||||
}
|
||||
// Expectation here is that there is a new file locally (newPath) however as we don't create this, the "new file" will not be uploaded as it does not exist
|
||||
log.vdebug("DRY-RUN: Skipping local file rename");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2939,38 +3016,62 @@ final class SyncEngine
|
|||
}
|
||||
// file has to have downloaded in order to set the times / data for the file
|
||||
if (exists(path)) {
|
||||
// A 'file' was downloaded - does what we downloaded = reported fileSize or if there is some sort of funky local disk compression going on
|
||||
// does the file hash OneDrive reports match what we have locally?
|
||||
string quickXorHash = computeQuickXorHash(path);
|
||||
string sha1Hash = computeSha1Hash(path);
|
||||
// When downloading some files from SharePoint, the OneDrive API reports one file size, but the SharePoint HTTP Server sends a totally different byte count
|
||||
// for the same file
|
||||
// we have implemented --disable-download-validation to disable these checks
|
||||
|
||||
if ((getSize(path) == fileSize) || (OneDriveFileHash == quickXorHash) || (OneDriveFileHash == sha1Hash)) {
|
||||
// downloaded matches either size or hash
|
||||
log.vdebug("Downloaded file matches reported size and or reported file hash");
|
||||
try {
|
||||
log.vdebug("Calling setTimes() for this file: ", path);
|
||||
setTimes(path, item.mtime, item.mtime);
|
||||
} catch (FileException e) {
|
||||
// display the error message
|
||||
displayFileSystemErrorMessage(e.msg, getFunctionName!({}));
|
||||
if (!disableDownloadValidation) {
|
||||
// A 'file' was downloaded - does what we downloaded = reported fileSize or if there is some sort of funky local disk compression going on
|
||||
// does the file hash OneDrive reports match what we have locally?
|
||||
string quickXorHash = computeQuickXorHash(path);
|
||||
string sha1Hash = computeSha1Hash(path);
|
||||
|
||||
if ((getSize(path) == fileSize) || (OneDriveFileHash == quickXorHash) || (OneDriveFileHash == sha1Hash)) {
|
||||
// downloaded matches either size or hash
|
||||
log.vdebug("Downloaded file matches reported size and or reported file hash");
|
||||
try {
|
||||
log.vdebug("Calling setTimes() for this file: ", path);
|
||||
setTimes(path, item.mtime, item.mtime);
|
||||
} catch (FileException e) {
|
||||
// display the error message
|
||||
displayFileSystemErrorMessage(e.msg, getFunctionName!({}));
|
||||
}
|
||||
} else {
|
||||
// size error?
|
||||
if (getSize(path) != fileSize) {
|
||||
// downloaded file size does not match
|
||||
log.vdebug("File size on disk: ", getSize(path));
|
||||
log.vdebug("OneDrive API reported size: ", fileSize);
|
||||
log.error("ERROR: File download size mis-match. Increase logging verbosity to determine why.");
|
||||
}
|
||||
// hash error?
|
||||
if ((OneDriveFileHash != quickXorHash) || (OneDriveFileHash != sha1Hash)) {
|
||||
// downloaded file hash does not match
|
||||
log.vdebug("Actual file hash: ", OneDriveFileHash);
|
||||
log.vdebug("OneDrive API reported hash: ", quickXorHash);
|
||||
log.error("ERROR: File download hash mis-match. Increase logging verbosity to determine why.");
|
||||
}
|
||||
// add some workaround messaging
|
||||
if (accountType == "documentLibrary"){
|
||||
// It has been seen where SharePoint / OneDrive API reports one size via the JSON
|
||||
// but the content length and file size written to disk is totally different - example:
|
||||
// From JSON: "size": 17133
|
||||
// From HTTPS Server: < Content-Length: 19340
|
||||
// with no logical reason for the difference, except for a 302 redirect before file download
|
||||
log.error("INFO: It is most likely that a SharePoint OneDrive API issue is the root cause. Add --disable-download-validation to work around this issue but downloaded data integrity cannot be guaranteed.");
|
||||
} else {
|
||||
// other account types
|
||||
log.error("INFO: Potentially add --disable-download-validation to work around this issue but downloaded data integrity cannot be guaranteed.");
|
||||
}
|
||||
|
||||
// we do not want this local file to remain on the local file system
|
||||
safeRemove(path);
|
||||
downloadFailed = true;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// size error?
|
||||
if (getSize(path) != fileSize) {
|
||||
// downloaded file size does not match
|
||||
// "ERROR: File download size mis-match. Increase logging verbosity to determine why."
|
||||
log.error(provideLanguageTranslation(languageIdentifier,167));
|
||||
}
|
||||
// hash error?
|
||||
if ((OneDriveFileHash != quickXorHash) || (OneDriveFileHash != sha1Hash)) {
|
||||
// downloaded file hash does not match
|
||||
// "ERROR: File download hash mis-match. Increase logging verbosity to determine why."
|
||||
log.error(provideLanguageTranslation(languageIdentifier,168));
|
||||
}
|
||||
// we do not want this local file to remain on the local file system
|
||||
safeRemove(path);
|
||||
downloadFailed = true;
|
||||
return;
|
||||
// download checks have been disabled
|
||||
log.vdebug("Downloaded file validation disabled due to --disable-download-validation ");
|
||||
}
|
||||
} else {
|
||||
// "ERROR: File failed to download. Increase logging verbosity to determine why."
|
||||
|
@ -4668,11 +4769,16 @@ final class SyncEngine
|
|||
saveItem(pathDetails);
|
||||
|
||||
// OneDrive Personal Shared Folder edgecase handling
|
||||
// In a --resync --upload-only --single-directory 'dir' scenario, and where the root 'dir' for --single-directory is a 'shared folder'
|
||||
// we will not have the 'tie' DB entry created because of --upload-only because we do not download the folder structure from OneDrive
|
||||
// In a:
|
||||
// --resync --upload-only --single-directory 'dir' scenario, and where the root 'dir' for --single-directory is a 'shared folder'
|
||||
// OR
|
||||
// --resync --upload-only scenario, and where the root 'dir' to upload is a 'shared folder'
|
||||
//
|
||||
// We will not have the 'tie' DB entry created because of --upload-only because we do not download the folder structure from OneDrive
|
||||
// to know what the remoteDriveId actually is
|
||||
if (accountType == "personal"){
|
||||
// are we in a --resync --upload-only --single-directory scenario ?
|
||||
if ((cfg.getValueBool("resync")) && (cfg.getValueBool("upload_only")) && (singleDirectoryScope)) {
|
||||
// are we in a --resync --upload-only scenario ?
|
||||
if ((cfg.getValueBool("resync")) && (cfg.getValueBool("upload_only"))) {
|
||||
// Create a temp item
|
||||
// Takes a JSON input and formats to an item which can be used by the database
|
||||
Item tempItem = makeItem(pathDetails);
|
||||
|
@ -4687,12 +4793,12 @@ final class SyncEngine
|
|||
// set the right elements
|
||||
tieDBItem.driveId = tempItem.remoteDriveId;
|
||||
tieDBItem.id = tempItem.remoteId;
|
||||
}
|
||||
// Set the correct mtime
|
||||
tieDBItem.mtime = tempItem.mtime;
|
||||
// Add tie DB record to the local database
|
||||
log.vdebug("Adding tie DB record to database: ", tieDBItem);
|
||||
itemdb.upsert(tieDBItem);
|
||||
// Set the correct mtime
|
||||
tieDBItem.mtime = tempItem.mtime;
|
||||
// Add tie DB record to the local database
|
||||
log.vdebug("Adding tie DB record to database: ", tieDBItem);
|
||||
itemdb.upsert(tieDBItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -7071,7 +7177,32 @@ final class SyncEngine
|
|||
// "\nListing available OneDrive Business Shared Folders:"
|
||||
log.log(provideLanguageTranslation(languageIdentifier,308));
|
||||
// Query the GET /me/drive/sharedWithMe API
|
||||
JSONValue graphQuery = onedrive.getSharedWithMe();
|
||||
JSONValue graphQuery;
|
||||
try {
|
||||
graphQuery = onedrive.getSharedWithMe();
|
||||
} catch (OneDriveException e) {
|
||||
if (e.httpStatusCode == 401) {
|
||||
// HTTP request returned status code 401 (Unauthorized)
|
||||
displayOneDriveErrorMessage(e.msg, getFunctionName!({}));
|
||||
log.errorAndNotify("\nERROR: Check your configuration as your refresh_token may be empty or invalid. You may need to issue a --logout and re-authorise this client.\n");
|
||||
// Must exit here
|
||||
exit(-1);
|
||||
}
|
||||
if (e.httpStatusCode == 429) {
|
||||
// HTTP request returned status code 429 (Too Many Requests). We need to leverage the response Retry-After HTTP header to ensure minimum delay until the throttle is removed.
|
||||
handleOneDriveThrottleRequest();
|
||||
// Retry original request by calling function again to avoid replicating any further error handling
|
||||
log.vdebug("Retrying original request that generated the OneDrive HTTP 429 Response Code (Too Many Requests) - graphQuery = onedrive.getSharedWithMe();");
|
||||
graphQuery = onedrive.getSharedWithMe();
|
||||
}
|
||||
if (e.httpStatusCode >= 500) {
|
||||
// There was a HTTP 5xx Server Side Error
|
||||
displayOneDriveErrorMessage(e.msg, getFunctionName!({}));
|
||||
// Must exit here
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
if (graphQuery.type() == JSONType.object) {
|
||||
if (count(graphQuery["value"].array) == 0) {
|
||||
// no shared folders returned
|
||||
|
|
|
@ -191,7 +191,7 @@ void initialise_defaults(){
|
|||
JSONValue([ "16": "DRY-RUN Configured. Output below shows what 'would' have occurred" ]),
|
||||
JSONValue([ "17": "Using logfile dir: " ]),
|
||||
JSONValue([ "18": "Database schema changed, resync needed" ]),
|
||||
JSONValue([ "19": "Deleting the saved status ..." ]),
|
||||
JSONValue([ "19": "Deleting the saved application sync status ..." ]),
|
||||
JSONValue([ "20": "ERROR: Unable to reach Microsoft OneDrive API service, unable to initialise application" ]),
|
||||
JSONValue([ "21": "ERROR: Unable to reach Microsoft OneDrive API service at this point in time, re-trying network tests" ]),
|
||||
JSONValue([ "22": "Internet connectivity to Microsoft OneDrive service has been restored" ]),
|
||||
|
|
Loading…
Reference in a new issue