Node.jsのバージョンアップ後にhomebridgeを起動しようとしたらハマった

# 環境
```
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 8.0 (jessie)
Release:    8.0
Codename:   jessie
$ node -v
v9.6.1
$ npm -v
5.6.0
```

Raspberry Pi上でNode.jsのバージョンアップ後にhomebridgeを起動しようとすると以下のエラーが出ました。

```bash
$ homebridge
/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/mdns/lib/dns_sd.js:35
    throw ex;
    ^

Error: The module '/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/mdns/build/Release/dns_sd_bindings.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 46. This version of Node.js requires
NODE_MODULE_VERSION 59. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
    at Object.Module._extensions..node (module.js:691:18)
    at Module.load (module.js:575:32)
    at tryModuleLoad (module.js:515:12)
    at Function.Module._load (module.js:507:3)
    at Module.require (module.js:606:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/mdns/lib/dns_sd.js:24:20)
    at Module._compile (module.js:662:30)
    at Object.Module._extensions..js (module.js:673:10)
    at Module.load (module.js:575:32)
```

どうやら異なるバージョンでコンパイルしたことが原因のようです。`npm rebuild` or `npm install`で解決しそうです。さっそく`npm rebuild`を試してみると。。

```bash
$ cd /usr/local/lib/node_modules/homebridge
$ npm rebuild

> curve25519-n2@1.1.3 install /usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/curve25519-n2
> node-gyp rebuild

gyp ERR! clean error 
gyp ERR! stack Error: EACCES: permission denied, rmdir 'build'
gyp ERR! System Linux 4.9.35-v7+
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/curve25519-n2
gyp ERR! node -v v9.6.1
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok 
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! curve25519-n2@1.1.3 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the curve25519-n2@1.1.3 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/pi/.npm/_logs/2018-03-07T11_56_05_707Z-debug.log
```

**エラー**。権限不足で`build`ディレクトリが削除できないのが原因のようです。`sudo`で実行してもダメ。ディレクトリの権限を確認してみると。。

```bash
$ cd /usr/local/lib/node_modules/homebridge
$ ls -la
合計 76
drwxr-sr-x 7 nobody pi  4096  3月  7 20:59 .
drwxr-sr-x 7 nobody pi  4096  3月  7 20:59 ..
drwxr-sr-x 2 nobody pi  4096 11月 25 15:54 .github
-rw-r--r-- 1 nobody pi   204 11月 30  2016 .npmignore
-rw-r--r-- 1 nobody pi 10172  2月 14  2016 LICENSE
-rw-r--r-- 1 nobody pi 11702 11月  2 07:13 README.md
drwxr-sr-x 2 nobody pi  4096  3月  7 20:59 bin
-rw-r--r-- 1 nobody pi   599 10月 21 08:32 config-sample.json
drwxr-sr-x 3 nobody pi  4096  7月 27  2016 devPlugins
drwxr-sr-x 3 nobody pi  4096 11月 25 15:54 lib
drwxr-sr-x 9 nobody pi  4096 11月 25 15:54 node_modules
-rw-r--r-- 1 root   pi  9197  3月  7 20:59 package-lock.json
-rw-r--r-- 1 root   pi  1818 11月 25 15:54 package.json
```

`nobody`という所有者が悪さをしているようです。`build`ディレクトリがどこにあるのかよくわからなかったので、`homebridge`ディレクトリ以下をまるごと`nobody`から`pi`ユーザに所有者変更してみます。

```bash
$ sudo chown -R pi /usr/local/lib/node_modules/homebridge
$ ls -la
合計 76
drwxr-sr-x 7 pi     pi  4096  3月  7 20:59 .
drwxr-sr-x 7 nobody pi  4096  3月  7 20:59 ..
drwxr-sr-x 2 pi     pi  4096 11月 25 15:54 .github
-rw-r--r-- 1 pi     pi   204 11月 30  2016 .npmignore
-rw-r--r-- 1 pi     pi 10172  2月 14  2016 LICENSE
-rw-r--r-- 1 pi     pi 11702 11月  2 07:13 README.md
drwxr-sr-x 2 pi     pi  4096  3月  7 20:59 bin
-rw-r--r-- 1 pi     pi   599 10月 21 08:32 config-sample.json
drwxr-sr-x 3 pi     pi  4096  7月 27  2016 devPlugins
drwxr-sr-x 3 pi     pi  4096 11月 25 15:54 lib
drwxr-sr-x 9 pi     pi  4096 11月 25 15:54 node_modules
-rw-r--r-- 1 pi     pi  9197  3月  7 20:59 package-lock.json
-rw-r--r-- 1 pi     pi  1818 11月 25 15:54 package.json
```

これでどうだっ。。

```bash
$ npm rebuild

> curve25519-n2@1.1.3 install /usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/curve25519-n2
> node-gyp rebuild

make: Entering directory '/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/curve25519-n2/build'
  CXX(target) Release/obj.target/curve/node_curve.o
  SOLINK_MODULE(target) Release/obj.target/curve.node
  COPY Release/curve.node
make: Leaving directory '/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/node_modules/curve25519-n2/build'

（省略）
```

**いけた！！**改めて`homebridge`を起動してみると。。

```bash
$ homebridge

*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>

（中略）

[2018-3-7 21:31:59] Homebridge is running on port 51826.
```

`homebridge`無事起動できました！

# まとめ
Node.jsのバージョン管理ツール導入しようかな。。

# 参考リンク
- [Node.jsのバージョンコンフリクト - GentooやIoTの覚え書きブログ](http://gentoolinux.hatenablog.com/entry/2017/11/15/003527)
- [node.js - Meteor Error: EACCES: permission denied, rmdir &#39;build&#39; - Stack Overflow](https://stackoverflow.com/questions/38594122/meteor-error-eacces-permission-denied-rmdir-build)