我希望定期将我的Owncloud日历备份为ICS文件,以防服务器遇到我没有时间立即修复的问题。为此,我写了一个小脚本,可以作为cronjob运行。
欢迎任何反馈,改进和改动!
答案 0 :(得分:0)
免责声明:我为我自己和其他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
关于剧本的一些注释:
它假定共享日历的下载URL如下所示:
OwncloudURL / remote.php / DAV /日历/ LoggedInOwncloudUser / CalendarName_shared_by_CalendarOwner?出口
要检查网址是否正确,只需在网络界面下载共享日历并查看下载网址。
它假定日历名称存储在表“oc_calendars”的“uri”列中。
它假定日历所有者存储在表“oc_calendars”的“principaluri”列中,并且所有普通用户都以“principals / users /".
需要sudo权限才能更新Owncloud文件结构。
答案 1 :(得分:0)
我已经使用这个脚本已有一段时间了。这对从onwCloud安装中备份日历和联系人很有帮助。谢谢!
但是,有一件事确实使我羡慕不已:我需要与“备份用户”手动共享新的日历/通讯簿,“备份用户”将备份其日历。这使脚本基本上对我没有用,因为我妻子经常创建和删除她的日历和任务列表。
有一个脚本可以自动处理其他创建/删除的日历,因为它从数据库而不是通过http-request获取所有数据(例如envyrus的脚本)。它只是为数据库中存在的每个日历/通讯簿创建一个备份。使用此脚本时,无需提供用户名/密码组合。此外,也无需共享要与特定用户备份的日历。最后但并非最不重要的一点是,该脚本不需要root特权。
从脚本的“自述文件:
此Bash脚本从中导出日历和通讯录 将自己的Cloud / Nextcloud保存为.ics和.vcf文件,并将其保存到 压缩文件。其他选项可用。
从版本0.8.0开始,不再需要具有 用户凭据,因为所有数据都是直接从 数据库。如果仅某些用户的日历/通讯录应为 备份,在没有任何密码的情况下将它们列出在users.txt中。
也许这对其他人也有帮助:calcardbackup