以前痛い目を見たので 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 するとさらにそれっぽいけど、どうしようかなぁ…
コメントを残す