我希望定期备份我的Owncloud日历作为ICS文件,以防服务器遇到我没有时间立即修复的问题。为此,我写了一个小脚本,可以作为cronjob运行。
欢迎任何反馈,改进和改动!
免责声明:我为我自己和其他1-2个朋友运行的一个小Owncloud实例创建了这个脚本 - 它不适用于任何“严肃的业务”,可以这么说。我使用this和this网站的脚本作为起点 - 谢谢!
为了创建所有用户日历的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
关于脚本的一些注意事项:
我一直在使用这个脚本。从我的onwCloud安装备份日历和联系人是一个很大的帮助。谢谢!
然而,有一件事让我对envyrus脚本产生了麻烦:新的日历/地址簿需要与“备份用户”手动共享,其日历将被备份。这使得脚本对我来说基本没用,因为我的妻子经常创建和删除她的日历和任务列表。
有一个脚本可以自动处理额外创建/删除的日历,因为它从数据库中获取所有数据,而不是通过http-request(如envyrus中的脚本)。它只是创建数据库中现有的每个日历/地址簿的备份。使用此脚本时,无需提供用户名/密码组合。此外,无需与特定用户共享要备份的日历。最后但并非最不重要的是,该脚本不需要root权限。
从脚本的自述文件中:
此Bash脚本将ownCloud / Nextcloud中的日历和地址簿导出到.ics和.vcf文件,并将它们保存到压缩文件中。还有其他选择。
从版本0.8.0开始,不再需要具有用户凭据的文件,因为所有数据都是直接从数据库中提取的。如果只备份某些用户的日历/地址簿,请在users.txt中列出,不带任何密码。
也许这也是对其他人的帮助:calcardbackup