Owncloud日历ICS备份

时间:2017-05-28 09:28:02

标签: owncloud

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

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

2 个答案:

答案 0 :(得分: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?出口

    要检查网址是否正确,只需在网络界面下载共享日历并查看下载网址。

  • 它假定日历名称存储在表“oc_calendars”的“uri”列中。

  • 它假定日历所有者存储在表“oc_calendars”的“principaluri”列中,并且所有普通用户都以“principals / users /".

  • 为前缀
  • 需要sudo权限才能更新Owncloud文件结构。

  • 需要安装zip。

答案 1 :(得分:0)

我已经使用这个脚本已有一段时间了。这对从onwCloud安装中备份日历和联系人很有帮助。谢谢!

但是,有一件事确实使我羡慕不已:我需要与“备份用户”手动共享新的日历/通讯簿,“备份用户”将备份其日历。这使脚本基本上对我没有用,因为我妻子经常创建和删除她的日历和任务列表。

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

从脚本的“自述文件:

  

此Bash脚本从中导出日历和通讯录   将自己的Cloud / Nextcloud保存为.ics和.vcf文件,并将其保存到   压缩文件。其他选项可用。

     

从版本0.8.0开始,不再需要具有   用户凭据,因为所有数据都是直接从   数据库。如果仅某些用户的日历/通讯录应为   备份,在没有任何密码的情况下将它们列出在users.txt中。

也许这对其他人也有帮助:calcardbackup