Owncloud日历ICS备份

问题描述 投票:0回答:2

我希望定期备份我的Owncloud日历作为ICS文件,以防服务器遇到我没有时间立即修复的问题。为此,我写了一个小脚本,可以作为cronjob运行。

欢迎任何反馈,改进和改动!

owncloud
2个回答
0
投票

免责声明:我为我自己和其他1-2个朋友运行的一个小Owncloud实例创建了这个脚本 - 它不适用于任何“严肃的业务”,可以这么说。我使用thisthis网站的脚本作为起点 - 谢谢!

为了创建所有用户日历的ics备份,我创建了一个名为“calendarBackup”的Owncloud用户,其他用户可以与其共享日历。我写了一个小脚本,循环遍历所有这些日历并下载ics文件。然后将它们放入calendarBackup拥有的共享文件夹中,并将备份分布在用户之间。 (可以进行简单的调整,以便每个用户都可以获得自己的日历文件。)

这种方法的优点是脚本不需要知道所有用户密码。

这里的代码:

#!/bin/bash

#owncloud login data for calendar backup user
OCuser=owncloudUserName
OCpassword="owncloudUserPassword"
OCpath="/var/www/owncloud/"
OCbaseURL="https://localhost/owncloud/"
OCdatabase="owncloudDatabaseName"

#destination folder for calendar backups
dest="/var/www/owncloud/data/owncloudUserName/files/Backup/"

#mysql user data with access to owncloud database
MSQLuser=owncloudMysqlUser
MSQLpassword="owncloudMysqlUserPassword"

#timestamp used as backup name
timeStamp=$(date +%Y%m%d%H%M%S)
archivePassword="passwordForArchivedCalendars"

#apachee user and group
apacheUser="apacheUser"
apacheGroup="apacheGroup"

#create folder for new backup files
mkdir "$dest$timeStamp"

#create array of calendar names from Owncloud database query
calendars=($(mysql -B -N -u $MSQLuser -p$MSQLpassword -e "SELECT uri FROM $OCdatabase.oc_calendars"))
calendarCount=${#calendars[@]}

#create array of calendar owners from Owncloud database query
owners=($(mysql -B -N -u $MSQLuser -p$MSQLpassword -e "SELECT principaluri FROM $OCdatabase.oc_calendars"))


loopCount=0

#loop through all calendars
while [ $loopCount -lt $calendarCount ]
do
    #see if owner starts with "principals/users/"
    #(this part of the script assumes that principaluri for normal users looks like this: principal/users/USERNAME )
    if [ "${owners[$loopCount]:0:17}" = "principals/users/" ]
    then
        #concatenate download url
        url=$OCbaseURL"remote.php/dav/calendars/$OCuser/${calendars[$loopCount]}_shared_by_${owners[$loopCount]:17}?export"

        #echo $url

        #download the ics files (if download fails, delete file)
        wget \
        --output-document="$dest$timeStamp/${owners[$loopCount]:17}${calendars[$loopCount]}.ics" \
        --no-check-certificate --auth-no-challenge \
        --http-user=$OCuser --http-password="$OCpassword" \
        "$url" || rm "$dest$timeStamp/${owners[$loopCount]:17}${calendars[$loopCount]}.ics"

        #echo ${owners[$loopCount]:17}
    fi
    #echo "${calendars[$loopCount]} ${owners[$loopCount]}" 
    loopCount=$(($loopCount + 1))
done

#zip backed up ics files and remove the folder (this could easily be left out, change the chown command though)
zip -r -m -j -P $archivePassword "$dest$timeStamp" "$dest$timeStamp"
rm -R $dest$timeStamp
#chown needed so owncloud can access backup file
chown $apacheUser:$apacheGroup "$dest$timeStamp.zip"

#update owncloud database of calendar backup user
sudo -u $apacheUser php "$OCpath"occ files:scan $OCuser

关于脚本的一些注意事项:

  • 它是为Debian shell编写的。
  • 它适用于带有Mysql的Owncloud 9.1。
  • 它假定共享日历的下载URL如下所示: OwncloudURL / remote.php / DAV /日历/ LoggedInOwncloudUser / CalendarName_shared_by_CalendarOwner?出口 要检查正确的URL,只需在Web界面中下载共享日历并检查下载URL。
  • 它假定日历名称存储在表“oc_calendars”的“uri”列中。
  • 它假定日历所有者存储在表“oc_calendars”的“principaluri”列中,并且所有普通用户都以“principalals / users /”为前缀。
  • 它需要sudo权限才能更新Owncloud文件结构。
  • 它需要安装zip。

0
投票

我一直在使用这个脚本。从我的onwCloud安装备份日历和联系人是一个很大的帮助。谢谢!

然而,有一件事让我对envyrus脚本产生了麻烦:新的日历/地址簿需要与“备份用户”手动共享,其日历将被备份。这使得脚本对我来说基本没用,因为我的妻子经常创建和删除她的日历和任务列表。

有一个脚本可以自动处理额外创建/删除的日历,因为它从数据库中获取所有数据,而不是通过http-request(如envyrus中的脚本)。它只是创建数据库中现有的每个日历/地址簿的备份。使用此脚本时,无需提供用户名/密码组合。此外,无需与特定用户共享要备份的日历。最后但并非最不重要的是,该脚本不需要root权限。

从脚本的自述文件中:

此Bash脚本将ownCloud / Nextcloud中的日历和地址簿导出到.ics和.vcf文件,并将它们保存到压缩文件中。还有其他选择。

从版本0.8.0开始,不再需要具有用户凭据的文件,因为所有数据都是直接从数据库中提取的。如果只备份某些用户的日历/地址簿,请在users.txt中列出,不带任何密码。

也许这也是对其他人的帮助:calcardbackup

© www.soinside.com 2019 - 2024. All rights reserved.