2018年版、CentOS 7 で Dropbox を使う

# CentOS 7 は Dropbox デーモンの動作対象外に
2018 年 10 月のアップデートで動作対象が Ubuntu / Debian / Fedora のみになった。
CentOS で使いたいので、動かすためのメモ

## 追記（2019/05/25）
アップデートにより、**ここに掲載している方法では Dropbox デーモンの起動ができなくなりました**。
今後は、Dropbox デーモン用にバージョンが新しい glibc を自前で用意する必要があります。
詳しくは[dn225さんのコメント](https://qiita.com/la_float/items/a846a391874b452047ca?utm_source=public_comment#comment-d4e53c0a0c2d0b05cb72)を参照してください。

# セットアップ
まずはクライアントのソースコードをダウンロードする。

```console
$ cd ~
$ mkdir bin
$ cd bin
$ wget -O dropbox "http://www.dropbox.com/download?dl=packages/dropbox.py"
$ chmod +x dropbox
```

`~/bin` にまだパスを通していない場合はパスを通しておく。

```console
$ export PATH=~/bin:$PATH
```

クライアントのコードは Python 2 で書かれているのと、`dbus` セッションを用いてデーモンと通信を行うため、Python 2.7 と dbus-x11 を入れる。

```console
$ sudo yum install -y python2.7 dbus-x11
```

`dropbox` と叩いて動くことを確認する。`Dropbox command-line interface` と出れば良い。

```console
$ dropbox
Dropbox command-line interface
(以下略)
```

ちなみに、同期されたファイル等を収めた Dropbox 関連のディレクトリはデフォルトだとホーム直下に置かれる。具体的には以下の三つのディレクトリがホームディレクトリに作成される。

* `Dropbox`: 同期されるディレクトリ
* `.dropbox-dist`: デーモンの実行ファイルの置き場
* `.dropbox`: 認証の情報とかPIDとかランタイム情報

ホームではなく別のディレクトリにこれらのディレクトリを置きたい場合は、環境変数 `HOME` を設定することで変えられる。
よって、`dropbox` コマンドの alias を設定することで対応する。例えば `/data/dropbox` に置きたければ次のようにする。

```console
$ alias dropbox='HOME=/data/dropbox dropbox'
```

ちなみに ext4 ファイルシステムでないと動かないらしいので注意してほしい。
ext4 でない場合は[フォーマットする](https://qiita.com/ikuwow/items/c5832fd823e869825c80)。

これで準備はできた。早速 Dropbox を起動しようと `dropbox start` を叩くと、まだデーモンがインストールされていないとして怒られる。

```console
$ dropbox start
Starting Dropbox...
The Dropbox daemon is not installed!
Run "dropbox start -i" to install the daemon
```

言う通りに `dropbox start -i` を実行する。

```console
$ dropbox start -i
Starting Dropbox...
Dropbox is the easiest way to share and store your files online. Want to learn more? Head to https://www.dropbox.com/

In order to use Dropbox, you must download the proprietary daemon. [y/n] 
```

プロンプトが出てきたので `y` を入力して続行する。これでデーモンをインストールした後に起動してくれる。`Done!` と出れば成功だ。

デーモンの起動に成功したら、次は自分のアカウントと紐付けるために認証を行う必要がある。
`dropbox status` を叩くと次のような表示が出るはずだ。

```
$ dropbox status
開始中...
To link this computer to a dropbox account, visit the following url:
https://www.dropbox.com/cli_link_nonce?nonce=hogefuga
```

表示された URL が認証用の URL なので、これをブラウザに貼り付けて認証を済ませれば良い……と思いきやページに飛んでみるとこんな表示がされている。

![dropbox-auth-error.JPG](https://qiita-image-store.s3.amazonaws.com/0/94737/f4a7f60b-8ace-757c-1ce3-be5176772c89.jpeg)

Dropbox デーモンは動作要件に glibc 2.19 を要求しているようである。しかし CentOS 7 は glibc 2.17 が標準で入っている。
流石に glibc のリプレースメントを行うのは危険が想定される。
なので、デーモンでバージョン確認に使われている関数を自前のもので上書きすることで、あたかも glibc のバージョンが 2.19 であるかのように振る舞わせることにする。
以下のようにライブラリファイルを置くためのディレクトリを適当に用意する。

```console
$ cd ~
$ mkdir lib
$ cd lib
```

ハックのための関数を作る。

```~/lib/dropbox-glibcfix.c
const char* gnu_get_libc_version(void)
{
    return "2.19";
}
```

共有ライブラリとしてコンパイルする。

```console
$ gcc -fPIC -shared -o dropbox-glibcfix.so dropbox-glibcfix.c
```

`dropbox` コマンドを叩いた時に毎回ファイルを preload してほしいので、alias を設定する。

```console
$ alias dropbox='LD_PRELOAD=~/lib/dropbox-glibcfix.so dropbox'

(Dropboxのディレクトリを変更している場合)
$ alias dropbox='LD_PRELOAD=~/lib/dropbox-glibcfix.so HOME=/data/dropbox dropbox'
```

ここまでやれば、`dropbox stop` → `dropbox start` → `dropbox status` を実行することで認証画面まで行けるようになるはずだ。
認証が完了すると、すぐに同期が開始される。
もし、サイズが大きかったりで同期したくないディレクトリがある場合は `dropbox exclude add` を使って除外する。

```console
$ dropbox exclude add /data/dropbox/hoge
```

# リンク
* [Dropbox on CentOS7 requires glibc 2.19 • lorenzo milesi](https://lorenzo.mile.si/dropbox-on-centos7-requires-glibc-2-19/828/)
* [CentOS7でDropBox glibc2.9以上でないと使えなくなった対応 - Qiita](https://qiita.com/yuucha/items/99ae90afa17ba70cfdd2)
* [CentOS/Linuxからdropboxにアクセスする方法 - tkomakiのメモ帳](http://q068891.hatenablog.com/entry/2017/07/21/033029)