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