カテゴリー
Mac

caldavd のバックアップ

以前痛い目を見たので Open Directory のバックアップはデイリーで取ってる俺ですが、最近奥さんがカレンダーにいろんなイベントを突っ込んでるのでこれがなくなるとマズい、と OS X Server 3 にした記念でカレンダー(caldavd) のバックアップを取り始めました。

といっても OS X Server には /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_backup といういかにもな実行ファイルが用意されてるので、これを実行すればいいはずなんだけど、

sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_backup -f /Library/Server/Calendar\ and\ Contacts/Config/caldavd-system.plist backup ~/work/caldav.backup

とかやると

Failed to dump database; error: /Applications/Server.app/Contents/ServerRoot/usr/bin/pg_dump failed:
pg_dump: [archiver (db)] connection to database "caldav" failed: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/Library/Server/PostgreSQL For Server Services/Socket/.s.PGSQL.5432"?
 (exit code = 1)

ここでも OS X Server クオリティ炸裂! ということで調べてみると OS X Server 3 の caldavd がデータを保存してる PostgreSQL は /var/run/caldavd/ccs_postgres_XXXXXXXXXXXXXXXXXXXXXX/ にソケットを開くように変わった(!)みたいなので、ここを指定すればいいみたい。

で、どーせ pg_dump だから(デフォルトで)吐かれるのはテキストだし、だったら差分をバージョン管理するとそれっぽく履歴追えてかっこいいんじゃね、ということでこんなシェルスクリプト書いて

#!/bin/sh

recover_path="/Volumes/TimeMachine/Server/backups/calendar"
recover_file="caldav.sql"
server_root="/Applications/Server.app/Contents/ServerRoot"
serveradmin_cmd=${server_root}/usr/sbin/serveradmin
pg_dump=${server_root}/usr/bin/pg_dump
caldav_datadir=`ls -d /var/run/caldavd/*/`
caldav_user=_calendar
caldav_db=caldav
bzr=/usr/pkg/bin/bzr
bzr_mail=`whoami`@`hostname`

if [ ! -d ${recover_path} ]; then
        mkdir -p ${recover_path}
fi

${pg_dump} -U ${caldav_user} -h ${caldav_datadir} ${caldav_db} > ${recover_path}/${recover_file}

if [ -f ${bzr} ]; then
        cd ${recover_path}
        if [ ! -d ${recover_path}/.bzr ]; then
                ${bzr} init
                ${bzr} add ${recover_file}
                ${bzr} whoami --branch ${bzr_mail}
        fi
        ${bzr} ci -m "version `date -u +%Y-%m-%dT%H:%MZ`"
fi

こんな plist でバックアップを取ることにしたのでした。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.
com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>jp.hyrule.flora.backup.caldav</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/local/sbin/caldav_backup.sh</string>
        </array>
        <key>LowPriorityIO</key>
        <true/>
        <key>Nice</key>
        <integer>1</integer>
        <key>StartCalendarInterval</key>
        <dict>
                <key>Hour</key>
                <integer>2</integer>
                <key>Minute</key>
                <integer>30</integer>
        </dict>
</dict>
</plist>

この branch を LaunchPad あたりに push するとさらにそれっぽいけど、どうしようかなぁ…

コメントを残す