ゆっきーのブログ

実践的なシステム設計開発、アプリケーションフレームワーク開発、トラブルシューティング、 後輩育成のためのブログ。その他、キャンプ、トレッキング・登山やレジャー等。

1. システムエンジニアリング 実装技術

Linuxでの gdrive の使い方

投稿日:2018年6月10日 更新日:

技術検証

wordpressのデータをgoogle driveにバックアップするための基礎調査を行っている。
google driveに接続可能なライブラリは幾つかあるようだが、ここでは無料でお手軽に始められそうなgdriveを検証した。


準備

前提

使用した環境は次の通り。

  • OSはCentOS Linux release 7.5(x86_64)を使用
  • gdrive-linux-x64(2.1.1)を使用
  • googleアカウントを登録済み

インストール

上記のgithhubのページから対応するプログラムをダウンロードします。
rpmやtar.gz等のパッケージ化されたものではなく、実行プログラム1つだけのダウンロードです。
私の環境は64ビットOSなので、gdrive-linux-x64がダウンロード対象です。



gdrive-linux-x64のリンクをコピーし、次のようにLinuxのcurlからダウンロードします。
いくつかリダイレクトされるので”-L”オプションを、ダウンロードファイルをgdriveとするために”-o”オプションを使います。

[user@server]$ curl -L -o gdrive "https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA&export=download"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   383    0   383    0     0    531      0 --:--:-- --:--:-- --:--:--   531
  0     0    0 7622k    0     0  4195k      0 --:--:--  0:00:01 --:--:-- 20.0M
[user@server]$ chmod a+x gdrive

初回のgoogle認証を成功させる

まず、gdriveの任意のコマンドを実行して、google認証を行います。
google認証をおこなうためのURLが表示されるので、そのURLを任意のブラウザで開きます。

[user@server]$ ./gdrive list
Authentication needed
Go to the following url in your browser:
https://accounts.google.com/o/oauth2/auth?access_type=...ive&state=state

Enter verification code:

ブラウザにgoogle認証画面が表示されるので認証を行います。
認証に成功すると、gdriveにアクセス許可を与えるかの画面が表示されるので「許可」をクリックします。
コードが表示されるので、これをコピーします。

上記でコピーしたコードを、先ほどの「Enter verification code:」にペーストします。
問題なければ、gdrive listの実行結果が表示されます。

Enter verification code: 4/AAB...Ins
Id                                             Name                                   Type   Size      Created
1LCXXXXXL-Z_EWXXXXXbuUZ81F-5XXXXXpuQXXXXX6eY   test                                   doc              2018-06-09 23:21:18

なお、認証情報をクリアしたい場合、既定ではホームディレクトリの.gdriveフォルダをリネームまたは削除してください。この際、google側の情報も併せて削除することをお勧めします。([My Account]→[アカウントにアクセスできるアプリ]→[アプリを管理]と開き、GDriveのアクセス権を削除する。)


gdriveの検証

google driveとgdrive

  • フォルダやファイルのパスではなく、IDを使って操作対象のフォルダ・ファイルを指定する。フォルダやファイルのIDは、”gdrive list”の実行結果で確認可。フォルダの場合は、google driveのURLの最後に記載されている値で確認可。
  • 検索する場合、既定ではすべてのフォルダが検索対象になる。フォルダを限定したい場合は、後述のように検索条件に”in parents”を追加する。
  • ゴミ箱にある削除されたファイルも検索対象になる。対象外にしたい場合は、後述のように検索条件に”trashed = false”を追加する。
  • ファイルの種類はMIMEで定義されている。例えば、フォルダの場合は”application/vnd.google-apps.folder”である。サポートされるMIMEタイプはgoogleのリファレンス(Supported MIME Types)に定義されている。

google driveのリスト取得(gdrive list)

フォルダ・ファイルの一覧を取得する場合、gdriveのlistを使用します。
指定可能な検索条件の定義はgoogleの検索パラメータリファレンスを参照のこと。
同じく、ソート条件に関してはgoogle driveのapiリファレンスを参照のこと。

検索条件とソート条件の指定
ファイル名に”test”を含む、ゴミ箱のファイルは対象外、を条件にファイルを検索する。
検索結果は、ファイル名(既定の昇順)、更新日時(降順)でソートする。

[user@server]$ ./gdrive list --query "name = 'test' and trashed = false" --order "name, modifiedTime desc"
Id                                             Name   Type   Size   Created
1234567890123456789012345678901234567890AbCd   test   doc           2018-06-09 23:21:18

フォルダのリストを取得
google drive上の全てのフォルダのリストを取得する。

[user@server]$ ./gdrive list --query "trashed = false and mimeType = 'application/vnd.google-apps.folder'"
Id                                  Name         Type   Size   Created
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg   testdir      dir           2018-06-09 15:00:38

フォルダ内のファイルのリストを取得
特定フォルダ内のファイルのリストを取得する。

[user@server]$ ./gdrive list --query "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg' in parents and trashed = false"
Id                                             Name                                   Type   Size      Created
123456789012345678901234567890123              test_20180610-045738.tar.gz.aes        bin    21.4 MB   2018-06-10 04:57:44
...
1234567890123456789012345678901234567890AbCd   test                                   doc              2018-06-09 23:21:18

google driveへのファイルアップロード(gdrive upload)

所定のフォルダのIDを指定して、そのフォルダにdummy.datファイルをアップロードする。

[user@server]$ ./gdrive upload --parent "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg" ./dummy.dat
Uploading ./dummy.dat
Uploaded 123456789012345678901234567890123 at 13.4 MB/s, total 100.0 MB

シェルスクリプトによる検証

バックアップファイルをgoogle driveにアップロードするシェルスクリプト。
10世代までバックアップファイルを保持する。
実行する前に”chmod a+x backup2gd.sh”をして、実行可状態にしてください。

#!/bin/sh
#
# backup2gd.sh - backup to google drive.
#

#
# 定数定義
#

# アップロード対象のローカルファイル
file_name=backup.dat

# アップロード時のファイル名
gd_file_prefix=backup_
gd_file_suffix=`date "+%Y%m%d_%H%M%S"`
gd_file_name=${gd_file_prefix}${gd_file_suffix}.dat

# アップロード先フォルダID
gd_dest_dir_id=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg

# gdriveコマンドパス
gd_cmd=./gdrive

# 世代管理数
gd_keep_gen=10

# 世代管理用の定数
let "gd_list_max=gd_keep_gen + 1"
gd_list_query="'$gd_dest_dir_id' in parents"
gd_list_query="$gd_list_query and trashed = false"
gd_list_query="$gd_list_query and name contains '$gd_file_prefix'"
gd_list_query="$gd_list_query and mimeType != 'application/vnd.google-apps.folder'"
gd_list_order="name desc"

#
# ファイルアップロード
#
$gd_cmd upload --parent $gd_dest_dir_id --name $gd_file_name $file_name
if [ $? -ne 0 ]; then
        exit 1
fi

#
# 世代管理(ファイル一覧の取得と保持世代を超えたファイルの削除)
#

# 管理対象世代+1個までのファイルリストを取得、新しいものが上にくるようにソート。
# 一番最後の行のファイルが世代管理対象外のファイルとなるので、その行を取得。
gd_del_file_line=`$gd_cmd list --query "$gd_list_query" --order "$gd_list_order" -m $gd_list_max --name-width 0 --no-header | sed -n ${gd_list_max}p`

# 当該行からIDを取得する。(当該行がない場合は空)
# もしIDを取得できた場合はそのファイルを削除する。
gd_del_file_id=`echo "$gd_del_file_line" | awk '{print $1}' `
if [ -n "$gd_del_file_id" ]; then
        echo "deleting old backup file on storage: $gd_del_file_id"
        $gd_cmd delete $gd_del_file_id
        if [ $? -ne 0 ]; then
                exit 1
        fi
fi

exit 0

実行結果は次の通り。
11世代目ができたタイミングで、そのバックアップファイルを削除している。

[user@server]$ ./gdrive list --query "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg' in parents and trashed = false" --order "name desc"
Id                                  Name                         Type   Size        Created
123456789012345678901234567890991   test.txt                     bin                2018-06-10 20:32:14
123456789012345678901234567890992   dummy.dat                    bin    100.0 MB    2018-06-10 20:36:16
123456789012345678901234567890009   backup_20180610_213342.dat   bin    1000.0 KB   2018-06-10 21:33:43
123456789012345678901234567890008   backup_20180610_213020.dat   bin    1000.0 KB   2018-06-10 21:30:21
123456789012345678901234567890007   backup_20180610_212616.dat   bin    1000.0 KB   2018-06-10 21:26:17
123456789012345678901234567890006   backup_20180610_212452.dat   bin    1000.0 KB   2018-06-10 21:24:53
123456789012345678901234567890005   backup_20180610_212420.dat   bin    1000.0 KB   2018-06-10 21:24:21
123456789012345678901234567890004   backup_20180610_212210.dat   bin    1000.0 KB   2018-06-10 21:22:11
123456789012345678901234567890003   backup_20180610_212048.dat   bin    1000.0 KB   2018-06-10 21:20:49
123456789012345678901234567890002   backup_20180610_212045.dat   bin    1000.0 KB   2018-06-10 21:20:45
123456789012345678901234567890001   backup_20180610_212030.dat   bin    1000.0 KB   2018-06-10 21:20:32
[user@server]$ ./backup2gd.sh
Uploading backup.dat
Uploaded 123456789012345678901234567890010 at 348.4 KB/s, total 1000.0 KB
[user@server]$ ./gdrive list --query "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg' in parents and trashed = false" --order "name desc"
Id                                  Name                         Type   Size        Created
123456789012345678901234567890991   test.txt                     bin                2018-06-10 20:32:14
123456789012345678901234567890992   dummy.dat                    bin    100.0 MB    2018-06-10 20:36:16
123456789012345678901234567890010   backup_20180610_213450.dat   bin    1000.0 KB   2018-06-10 21:34:53
123456789012345678901234567890009   backup_20180610_213342.dat   bin    1000.0 KB   2018-06-10 21:33:43
123456789012345678901234567890008   backup_20180610_213020.dat   bin    1000.0 KB   2018-06-10 21:30:21
123456789012345678901234567890007   backup_20180610_212616.dat   bin    1000.0 KB   2018-06-10 21:26:17
123456789012345678901234567890006   backup_20180610_212452.dat   bin    1000.0 KB   2018-06-10 21:24:53
123456789012345678901234567890005   backup_20180610_212420.dat   bin    1000.0 KB   2018-06-10 21:24:21
123456789012345678901234567890004   backup_20180610_212210.dat   bin    1000.0 KB   2018-06-10 21:22:11
123456789012345678901234567890003   backup_20180610_212048.dat   bin    1000.0 KB   2018-06-10 21:20:49
123456789012345678901234567890002   backup_20180610_212045.dat   bin    1000.0 KB   2018-06-10 21:20:45
123456789012345678901234567890001   backup_20180610_212030.dat   bin    1000.0 KB   2018-06-10 21:20:32
[user@server]$ ./backup2gd.sh
Uploading backup.dat
Uploaded 123456789012345678901234567890011 at 975.4 KB/s, total 1000.0 KB
deleting old backup file on storage: 123456789012345678901234567890001
Deleted 'backup_20180610_212030.dat'
[user@server]$ ./gdrive list --query "'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg' in parents and trashed = false" --order "name desc"
Id                                  Name                         Type   Size        Created
123456789012345678901234567890991   test.txt                     bin                2018-06-10 20:32:14
123456789012345678901234567890992   dummy.dat                    bin    100.0 MB    2018-06-10 20:36:16
123456789012345678901234567890011   backup_20180610_213516.dat   bin    1000.0 KB   2018-06-10 21:35:17
123456789012345678901234567890010   backup_20180610_213450.dat   bin    1000.0 KB   2018-06-10 21:34:53
123456789012345678901234567890009   backup_20180610_213342.dat   bin    1000.0 KB   2018-06-10 21:33:43
123456789012345678901234567890008   backup_20180610_213020.dat   bin    1000.0 KB   2018-06-10 21:30:21
123456789012345678901234567890007   backup_20180610_212616.dat   bin    1000.0 KB   2018-06-10 21:26:17
123456789012345678901234567890006   backup_20180610_212452.dat   bin    1000.0 KB   2018-06-10 21:24:53
123456789012345678901234567890005   backup_20180610_212420.dat   bin    1000.0 KB   2018-06-10 21:24:21
123456789012345678901234567890004   backup_20180610_212210.dat   bin    1000.0 KB   2018-06-10 21:22:11
123456789012345678901234567890003   backup_20180610_212048.dat   bin    1000.0 KB   2018-06-10 21:20:49
123456789012345678901234567890002   backup_20180610_212045.dat   bin    1000.0 KB   2018-06-10 21:20:45

-1. システムエンジニアリング, 実装技術

執筆者:


  1. […] なお、このシェルを実現するために、linuxからgoogleドライブにアップロードする方法を調査しています。 […]

  2. […] Linuxでの gdrive の使い方 投稿日: 2019年2月5日2019年2月5日作成者 kuroinublogカテゴリー developmentタグ camera, googledrive, raspberrypi, shell […]

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

保守運用

運用 と 保守 の 違い

若い頃は 運用 と 保守 の違いを調べても良くわからなかった… この辺を使い分けられる人をほとんど見たことない… ある事項が運用なのか保守なのかの話をすると認識が合わない&#8 …

postgresqlでの拡張のインストール

PostgreSQL10で暗号化関数を使用するため拡張(pgcrypto)をインストールした際の出来事を記載します。 事象 pgcryptoの拡張をインストールしたり、インストールの確認を行うと、その …

WebサイトのSSL化

次のようなGoogleウェブマスター向け公式ブログでの推奨や、リモートか管理の安全性向上の向上のためにSSL(TLS)を有効にする。 概要 Googleさんの考え 保護されたウェブの普及を目指して(2 …

マスタデータ生成ツール

開発や結合試験、本番環境等で使用するマスタデータをExcelで管理することがあります。 そのようなExcelファイルからDBに登録するためのインサート文を作成するために、いつもツールに悩むので作成して …

Wildfly11のインストール

このサイトでWebアプリを公開したい。 仕事ではJBoss Enterprise Application Server(JBoss EAP)を使う機会が多いのでそれを使いたいがライセンス料がかかる。無 …