Googleドキュメントの定時バックアップ

Googleドキュメントの履歴機能は便利なのですが、やはり手元にファイルのバックアップとして定期的な保存が必要だったりします。

フリーウェアのみで特定のGoogleドキュメントを日付をつけた任意のファイル名で自分のコンピュータに毎日バックアップ取ることにします。

元のファイル名が「Mouse Inventory」だとすると2012.3.4→120304, 2012.3.5→120305と、
120304 mouse inventory.xls
120305 mouse inventory.xls
のような感じでファイルが溜まっていくようにします。

Macで行いましたが、Windows/Linuxでも同様に出来るはずです。

GoogleCLというフリーウェアがあり、これでコマンドラインからグーグルの各種サービスにアクセス出来るようになります。
それを使って特定のファイルを日付を付けてダウンロードするスクリプトを作り、
それを/etc/periodic/daily/というフォルダに入れるというのが概要になります。

まず、Pythonのバージョンが2.5以上であることをターミナルを起動して確認

YourMac:~ tosh$ python -V
Python 2.7.1

GData 2.0.14 (2.0.15や16は相性悪し)とGoogleCLをインストール
sudoコマンドで聞かれるパスワードはMacへのログインパスワードを入力します。パスワードを設定していない場合はsudoは使えません。

YourMac:~ tosh$ mkdir src
YourMac:~ tosh$ cd src/
YourMac:src tosh$ curl -O http://gdata-python-client.googlecode.com/files/gdata-2.0.14.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1828k  100 1828k    0     0   745k      0  0:00:02  0:00:02 --:--:--  886k
YourMac:src tosh$ tar xzvf gdata-2.0.14.tar.gz
x gdata-2.0.14/
...
x gdata-2.0.14/MANIFEST
YourMac:src tosh$ cd gdata-2.0.14
YourMac:gdata-2.0.14 tosh$ sudo python setup.py install
Password:
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: 
...
Writing /Library/Python/2.7/site-packages/gdata-2.0.14-py2.7.egg-info
YourMac:gdata-2.0.14 tosh$ cd ~/src
YourMac:src tosh$ curl -O http://googlecl.googlecode.com/files/googlecl-0.9.13.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 85690  100 85690    0     0  64726      0  0:00:01  0:00:01 --:--:-- 92637
YourMac:src tosh$ tar xzvf googlecl-0.9.13.tar.gz
x googlecl-0.9.13/
…
x googlecl-0.9.13/PKG-INFO
YourMac:src tosh$ cd googlecl-0.9.13
YourMac:googlecl-0.9.13 tosh$ sudo python setup.py install
running install
…
Finished processing dependencies for googlecl==0.9.13

これでソフトのインストールは終わり。後はGoogleへの認証のみ。これも対話式なので指示通りに入れていけばOK。
色々なGoogleのサービスへのアクセスができる。ここではyoutubeにアップロードしたリストを取得してみる。

YourMac:googlecl-0.9.13 tosh$ cd
YourMac:~ tosh$ google youtube list
Please specify user: toshiki.saito           
Please log in and/or grant access via your browser at https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=4%2FA62soD028vPKHABqZA9GVQ&hd=default then hit enter.
2011 Athletic Festival,http://www.youtube.com/watch?v=hZSplbQ&feature=youtube_gdata
...
1st concert,http://www.youtube.com/watch?v=AxFNTaw&feature=youtube_gdata

次にGoogleドキュメントへのアクセスを試みる。Googleドキュメントのファイル一覧を取得してみる。指示通りにGoogleアカウントのユーザー名とパスワードを入れるとブラウザが開くので指示通りに表示された確認コード(Verification Code)を入力すると、一覧が表示される。

YourMac:~ tosh$ google docs list
Please specify user: toshiki.saito
Please log in and/or grant access at https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=4%2FF9R8_nT7ulks0qGomLkhe3-&hd=default

Please enter the verification code on the success page: 3egM-DKMKArS8FQbB3
Ptosh SOP Clerk DM,https://docs.google.com/document/d/1Wx7sAik8lOAGrLMsQa-A-Tt2DTPUHPLLBiFCY/edit
...
Otsuka 2006,https://docs.google.com/Doc?docid=0AfBu_SyaL1DWYWg4bjliZ2NrNmDQ4anBocG5od2M

次に任意のファイルをダウンロードしてみる。–titleでファイル名を指定します。正規表現でまとめて複数ファイルをダウンロードすることも可能です。

YourMac:~ tosh$ google docs get --title "Mouse Inventory"
Please specify dest: test123
Downloading Mouse Inventory to test123.xls

指定しないとこのように対話式に保存ファイル名を要求される。Googleドキュメント上の「Mouse Inventory」というファイルをDocuments(書類)フォルダの中のBACKUPS/Mouse Inventoryというフォルダの中に日付を付けて「120305 mouse inventory.xls」こんな感じのファイル名で毎日バックアップさせます。–destで保存先を指定します。

YourMac:~ tosh$ google docs get --title "Mouse Inventory" --dest "$HOME/Documents/BACKUPS/Mouse Inventory/`date +%y%m%d` mouse inventory"
Downloading Mouse Inventory to /Users/tosh/Documents/BACKUPS/Mouse Inventory/120305 mouse inventory.xls

``で囲まれた部分はシェルで実行された結果をファイル名に文字列として反映させることができます。

YourMac:~ tosh$ date +%y%m%d
120305
YourMac:~ tosh$ date +%Y%m%d
20120305
YourMac:~ tosh$ date +%H%M
1600

思い通りにファイル名を指定して目的のフォルダにダウンロードできたことを確認したら、シェルスクリプトの実行ファイルにします。ターミナルのVimかTextEdit(フォーマット→プレーンテキストを忘れずに)で下記のようなテキストファイルを作ります。backupMouseInventory.shというファイル名にしました。拡張子は「.sh」である必要があります。1行目はおまじないですが、必要ですので加えて下さい。最終的にはroot権限で実行するので、”$HOME”は”/Users/tosh”とフルパスに変更します。またroot権限ではパスが通っていないので、/usr/local/bin/googleとフルパスで記載します。

#!/bin/sh
/usr/local/bin/google docs get --title "Mouse Inventory" --dest "/Users/tosh/Documents/BACKUPS/Mouse Inventory/`date +%y%m%d` mouse inventory"

ちゃんとできているか確認し実行属性を与え、実行できるかどうか確認します。パスが通っていないことあるので、ファイル名の前に「./」を付けてあるいはフルパスでファイルを指定して実行してみます。

YourMac:ScriptsMac tosh$ cat backupMouseInventory.sh 
#!/bin/sh
/usr/local/bin/google docs get --title "Mouse Inventory" --dest "/Users/tosh/Documents/BACKUPS/Mouse Inventory/`date +%y%m%d` mouse inventory"
YourMac:ScriptsMac tosh$ chmod 777 backupMouseInventory.sh 
YourMac:ScriptsMac tosh$ ./backupMouseInventory.sh 
Downloading Mouse Inventory to /Users/tosh/Documents/BACKUPS/Mouse Inventory/120305 mouse inventory.xls

上手くダウンロードされることが確認できたら、/etc/periodic/daily/にコピーまたは移動します。sudo periodic dailyとして、ファイルのダウンロードがされることを確認します。

YourMac:ScriptsMac tosh$ sudo cp backupMouseInventory.sh /etc/periodic/daily/
YourMac:~ tosh$ sudo periodic daily

ここまで上手く行ったらRoot権限でGoogleへの認証を取っておきます。
まずMacのRootアカウントを有効化します。
http://support.apple.com/kb/HT1528?viewlocale=ja_JP
上記で行なったことと同じことをRoot権限で行います。

YourMac:~ tosh$ login
login: root
Password:
Last login: Wed Mar  7 09:53:46 on console
YourMac:~ root# google docs list
Please specify user: toshiki.saito
0:123: execution error: An error of type -10810 has occurred. (-10810)
Please log in and/or grant access at https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=4%2FsxerBjcxdfsUhtM4vN&hd=default
Please enter the verification code on the success page: FLehmasdfaserersgk2Xy3w

毎日早朝(3:15am)にバックアップが取られるようになりました。時間はlaunchdで設定されています。

YourMac:LaunchDaemons tosh$ cat /System/Library/LaunchDaemons/com.apple.periodic-daily.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">


	Label
	com.apple.periodic-daily
	ProgramArguments
	
		/usr/sbin/periodic
		daily
	
	LowPriorityIO
	
	Nice
	1
	StartCalendarInterval
	
		Hour
		3
		Minute
		15
	
	AbandonProcessGroup
	


最初スクリプトファイルの中でフルパスを指定しなかったら、上手く動いていなかった。ログをみると下記のようになっていたので、絶対パス指定とした。

YourMac:~ tosh$ tail -n 100 /var/log/daily.out
...
/etc/periodic/daily/backupMouseInventory.sh: line 2: google: command not found
-- End of daily output --
zp8497586rq