From 772f20e1ce015b7385748475ffc83c6876b38205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=C3=A4tzold?= Date: Wed, 8 Apr 2026 14:52:11 +0200 Subject: [PATCH] Nextcloud client: Support multi sync folders and move to userspace --- .../0020_nextcloud_desktopclient/install.sh | 80 ------------ .../0020_nextcloud_desktopclient/user_run.sh | 116 ++++++++++++++++++ system_setup/setup_system.conf.dist | 20 ++- 3 files changed, 133 insertions(+), 83 deletions(-) delete mode 100755 client_software/0020_nextcloud_desktopclient/install.sh create mode 100755 client_software/0020_nextcloud_desktopclient/user_run.sh diff --git a/client_software/0020_nextcloud_desktopclient/install.sh b/client_software/0020_nextcloud_desktopclient/install.sh deleted file mode 100755 index 5b3392c..0000000 --- a/client_software/0020_nextcloud_desktopclient/install.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env sh -# SPDX-FileCopyrightText: Daniel Pätzold -# SPDX-License-Identifier: AGPL-3.0-or-later -# -# Sofwareinstallation script for Nextcloud Desktop -# -echo "Setup Nextcloud- Sync" - -#Check for root -if [ "$EUID" -ne 0 ]; then - echo "Error: Script requires root. Please check if ${SCRIPTPATH}/${SCRIPTNAME} is in sudoers rules and if you are a member. And if executed via sudo." - exit 1 -fi - -#Check Token -if [ "${DAVTOKEN_USER}." == "." ]; then - echo "Error: Script cannot be executed standalone and needs a prereserved Environment. Quit." - exit 1 -fi - -#Check if Option is Configured to use Nextcloud Desktop Data- Sync -if [ "${CLIENT_DATA_DST}." == "." ]; then - echo "CLIENT_DATA_DST not set, skipping setup of Nextcloud Desktop sync of Data-Directory" - exit 0 -fi - -#Local Vars -BASECMD="/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=nextcloud com.nextcloud.desktopclient.nextcloud" -SYNCCMD="$BASECMD --userid ${DAVTOKEN_USER} --apppassword ${DAVTOKEN_PASS} --localdirpath ${CLIENT_DATA_DST} --remotedirpath ${CLIENT_DATA_SRC} --serverurl https://${SERVERFQDN_NC}" -SYNCCMD_HIDDENPW=$( echo "${SYNCCMD/${DAVTOKEN_PASS}/***HIDDEN***}" ) - -#Check if Nextcloud was already setup -if grep -q "localPath=${CLIENT_DATA_DST}" "/${SUDO_HOME}/.var/app/com.nextcloud.desktopclient.nextcloud/config/Nextcloud/nextcloud.cfg"; then - SETUP_NEEDED="0" -else - SETUP_NEEDED="1" -fi - -#Remove Nextcloud from autostart anyway! Must be started by this script manually, because if it was started befor the ecrypted mount, -# it will never sync and always throw an error that the local dir is missing -if [ -f "$SUDO_HOME/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop" ]; then - echo "Remove Autostart Nextcloud" - rm $SUDO_HOME/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop - #Stopping Nextcloud - su -c "$BASECMD --quit 1>/dev/null 2>/dev/null" $SUDO_USER - sleep 5 -fi - -if [ $SETUP_NEEDED = "0" ]; then - echo "Nextcloud was already setup, skipping configure and starting Service" - echo "If you want to reset, please delete the Folder [HOME]/.var/app/com.nextcloud.desktopclient.nextcloud manually." - echo "Command: rm -rif ~/.var/app/com.nextcloud.desktopclient.nextcloud/" - su -c "nohup ${BASECMD} 1>/dev/null 2>/dev/null &" $SUDO_USER - exit $? -fi - -#No check for installed Nextcloud needed, because it will be installed by calling script sync_client_software.sh - -echo "Syncing Files from remote ${CLIENT_DATA_SRC} to local ${CLIENT_DATA_DST}" -if [ -d "${CLIENT_DATA_DST}" ]; then - echo "Old unsynced Foler ${CLIENT_DATA_DST} was found, renaming to ${CLIENT_DATA_DST}_bak." - mv "${CLIENT_DATA_DST}" "${CLIENT_DATA_DST}_bak" -fi -su -c "mkdir -p ${CLIENT_DATA_DST}" $SUDO_USER -#Cleanup Nextcloud Configuration completely, while otherwise, the configure will not work -echo "Remove $SUDO_HOME/.var/app/com.nextcloud.desktopclient.nextcloud" -rm -rif "$SUDO_HOME/.var/app/com.nextcloud.desktopclient.nextcloud" - -#echo "Exec as $SUDO_USER: ${SYNCCMD}" -echo "Exec as $SUDO_USER: ${SYNCCMD_HIDDENPW}" -su -c "${SYNCCMD}" $SUDO_USER -if [ $? -ne 0 ]; then - echo "=========== !!! ========================" - echo "Error: It looks like this did not work!" - echo "Please check the above output!" - exit 1 -fi -# Now start Nextcloud -su -c "nohup ${BASECMD} 1>/dev/null 2>/dev/null &" $SUDO_USER -echo "Done Setup of Nextcloud." diff --git a/client_software/0020_nextcloud_desktopclient/user_run.sh b/client_software/0020_nextcloud_desktopclient/user_run.sh new file mode 100755 index 0000000..ffbf620 --- /dev/null +++ b/client_software/0020_nextcloud_desktopclient/user_run.sh @@ -0,0 +1,116 @@ +#!/usr/bin/env sh +# SPDX-FileCopyrightText: Daniel Pätzold +# SPDX-License-Identifier: AGPL-3.0-or-later +# +# Sofwareinstallation script for Nextcloud Desktop +# +echo "Setup Nextcloud- Sync" + +#Local Vars +BASECMD="/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=nextcloud com.nextcloud.desktopclient.nextcloud" + +#Check Token +if [ "${DAVTOKEN_USER}." == "." ]; then + # Todo: Move all task to some function to logon as user and get all vars, call it and proceed here + echo "Error: Script cannot be executed standalone and needs a prereserved Environment. Quit." + exit 1 +fi + +#Remove Nextcloud from autostart anyway! Must be started by this script manually, because if it was started befor the ecrypted mount, +#it will never sync and always throw an error that the local dir is missing +if [ -f "$SUDO_HOME/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop" ]; then + echo "Remove Autostart Nextcloud" + rm $SUDO_HOME/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop + #Stopping Nextcloud + su -c "$BASECMD --quit 1>/dev/null 2>/dev/null" $SUDO_USER + sleep 5 +fi + +NC_PID=$( pgrep -u $USER nextcloud ) +if [[ ! -z ${NC_PID} ]]; then + echo "Stopping Nextcloud with PID ${NC_PID}" +# $BASECMD --quit 1>/dev/null 2>/dev/null && sleep 5 + kill ${NC_PID} + if [[ $? -ne 0 ]]; then + echo "Service could not be stopped, please check why." + exit 1 + fi +fi +sleep 0.5 + +#Check if Option is Configured to use Nextcloud Desktop Data- Sync +declare -p CLIENT_DATA_SYNC_DECLARE >/dev/null +eval "${CLIENT_DATA_SYNC_DECLARE}" +declare -p CLIENT_DATA_SYNC_DECLARE CLIENT_DATA_SYNC >/dev/null +eval "${CLIENT_DATA_SYNC}" +if [[ "${#CLIENT_DATA_SYNC[@]}" == "0" ]]; then + echo "CLIENT_DATA_SYNC not set, skipping setup of Nextcloud Desktop sync" + exit 0 +fi + +#Loop through all Entries +for i in {0..99}; do + if [[ -z ${CLIENT_DATA_SYNC[$i]} ]]; then + break + fi + CLIENT_DATA_DECLARE_LINE="${CLIENT_DATA_SYNC[$i]}" + eval "${CLIENT_DATA_DECLARE_LINE}" + # echo "DEBUG user_run.sh(0020)_2: ${CLIENT_DATA_SYNC_LINE[@]}" + # Now, CLIENT_DATA_SYNC_LINE[0] contains the local path and CLIENT_DATA_SYNC_LINE[1] contains the remote path + if grep -q "localPath=${CLIENT_DATA_SYNC_LINE[0]}" "/${HOME}/.var/app/com.nextcloud.desktopclient.nextcloud/config/Nextcloud/nextcloud.cfg"; then + echo "Already found configured local folder ${CLIENT_DATA_SYNC_LINE[0]} syncing with ${CLIENT_DATA_SYNC_LINE[1]} . Leaving it unchanged." + else + echo "Setup new sync from remote ${CLIENT_DATA_SYNC_LINE[1]} to local ${CLIENT_DATA_SYNC_LINE[0]}" + if [[ $i -gt 0 ]]; then + echo "Due to Bug in Nextcloud Client, more than one synced Folder cannot be setup currently. Maybe in the Future." + continue; + fi + if [ -d "${CLIENT_DATA_SYNC_LINE[0]}" ]; then + echo "Old unsynced Folder ${CLIENT_DATA_SYNC_LINE[0]} was found, renaming to ${CLIENT_DATA_SYNC_LINE[0]}_bak." + mv "${CLIENT_DATA_SYNC_LINE[0]}" "${CLIENT_DATA_SYNC_LINE[0]}_bak" + fi + mkdir -p ${CLIENT_DATA_SYNC_LINE[0]} + SYNCCMD="$BASECMD --userid ${DAVTOKEN_USER} --apppassword ${DAVTOKEN_PASS} --localdirpath ${CLIENT_DATA_SYNC_LINE[0]} --remotedirpath ${CLIENT_DATA_SYNC_LINE[1]} --serverurl https://${SERVERFQDN_NC}" + SYNCCMD_HIDDENPW=$( echo "${SYNCCMD/${DAVTOKEN_PASS}/***HIDDEN***}" ) + echo "Exec: ${SYNCCMD_HIDDENPW}" + # Due to Bugs in Nextcloud, autoprovisioning will only work when no configuration is existent. Therefore delete any exitsing configs that may be there + rm -rif ${HOME}/.var/app/com.nextcloud.desktopclient.nextcloud/data/Nextcloud + #Now, execute Nextcloud autoprovisionig + ${SYNCCMD} + if [ $? -ne 0 ]; then + echo "=========== !!! ========================" + echo "Error: It looks like this did not work!" + echo "Please check the above output!" + exit 1 + fi + fi +done + +##Check if Nextcloud was already setup +#if [ $SETUP_NEEDED = "0" ]; then +# echo "Nextcloud was already setup, skipping configure and starting Service" +# echo "If you want to reset, please delete the Folder [HOME]/.var/app/com.nextcloud.desktopclient.nextcloud manually." +# echo "Command: rm -rif ~/.var/app/com.nextcloud.desktopclient.nextcloud/" +# su -c "nohup ${BASECMD} 1>/dev/null 2>/dev/null &" $SUDO_USER +# exit $? +#fi + +#No check for installed Nextcloud needed, because it will be installed by calling script sync_client_software.sh + +#Cleanup Nextcloud Configuration completely, while otherwise, the configure will not work +#echo "Remove $SUDO_HOME/.var/app/com.nextcloud.desktopclient.nextcloud" +#rm -rif "$SUDO_HOME/.var/app/com.nextcloud.desktopclient.nextcloud" + +#echo "Exec as $SUDO_USER: ${SYNCCMD}" +#echo "Exec as $SUDO_USER: ${SYNCCMD_HIDDENPW}" +#su -c "${SYNCCMD}" $SUDO_USER +#if [ $? -ne 0 ]; then +# echo "=========== !!! ========================" +# echo "Error: It looks like this did not work!" +# echo "Please check the above output!" +# exit 1 +#fi +# Now start Nextcloud +nohup ${BASECMD} 1>/dev/null 2>/dev/null & +echo "Done Setup of Nextcloud." +exit 0 diff --git a/system_setup/setup_system.conf.dist b/system_setup/setup_system.conf.dist index 927917a..ca12afe 100644 --- a/system_setup/setup_system.conf.dist +++ b/system_setup/setup_system.conf.dist @@ -38,9 +38,23 @@ if [ "$EUID" -ne 0 ]; then #Important Files export DAVTOKENFILENAME="${DECRYPTEDDATADIR}/WEBDAVTOKEN" - #Path for Documents - export CLIENT_DATA_DST="${DECRYPTEDDATADIR}/Dokumente" #Optional - export CLIENT_DATA_SRC="/Documents" + #Optional: Sync Folders with nextcloud client + CLIENT_DATA_SYNC=() # Do not remove + + # If you dont want to use Folder synchronisation: comment out each line starting with CLIENT_DATA_SYNC_LINE= or CLIENT_DATA_SYNC+= + #First Sync Folder + CLIENT_DATA_SYNC_LINE=("${DECRYPTEDDATADIR}/Dokumente" "/Documents") + CLIENT_DATA_SYNC+=("$(declare -p CLIENT_DATA_SYNC_LINE)") # Repeat for each CLIENT_DATA_SYNC_LINE + + #Next Sync Folder + CLIENT_DATA_SYNC_LINE=("${DECRYPTEDDATADIR}/Bilder" "/Photos") + CLIENT_DATA_SYNC+=("$(declare -p CLIENT_DATA_SYNC_LINE)") # Repeat for each CLIENT_DATA_SYNC_LINE + + #Next Sync Folder + #... + + export CLIENT_DATA_SYNC_DECLARE="$(declare -p CLIENT_DATA_SYNC)" # Do not remove + #End of Sync Folder for nextcloud client #Firefox Profiles of the User export PROFILE_FIREFOX_SRC="mozilla_profiles/firefox"