Raspberry Pi に google-home-notifier を入れた時に躓いたメモ

Raspberry Pi に google-home-notifier を入れた時にいろいろと躓いたメモ
>> 素のラズパイへ入れようとしました(一部、ディレクトリ名は伏せ字です)

【先に結論】
node.js と npm と google-home-notifier を入れる前にやっておくべき事
  • sudo ではなく su や sudo -s で root になっておくとトラブル少ないかも
  • 下記が入っていない場合は、入れておく
    # apt-get install git
    # apt-get install libavahi-compat-libdnssd-dev
これらをインストールしていないと、下記のような目にあいます
(別の素のラズパイで、上記をインストールしてからは問題なしでした)

gitが入っていなければ
# apt-get install git

こちらを参考に node.js と npm をインストール
# apt-get update
# apt-get install nodejs npm
# npm cache clean
# npm install npm n -g
ここで ssh へ入り直したほうがよい??
# n stable

途中で README がねー とか WARN が2つほど出ますが無視(して問題無さそう)

こちら や こちら を参考に google-home-notifier をインストール
としたわけですが # npm install でエラーがドバーッっと

>>>>> /google-home-notifier# npm install
npm WARN package.json google-home-notifier@1.2.0 No repository field.
/
> mdns@2.3.3 install /hogehoge/google-home-notifier/node_modules/mdns
> node-gyp rebuild

make: Entering directory '/hogehoge/google-home-notifier/node_modules/mdns/build'
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_sd.o
In file included from ../src/dns_sd.cpp:1:0:
../src/mdns.hpp:32:20: fatal error: dns_sd.h: そのようなファイルやディレクトリはありません
 #include 
                    ^
compilation terminated.
dns_sd_bindings.target.mk:132: recipe for target 'Release/obj.target/dns_sd_bindings/src/dns_sd.o' failed
make: *** [Release/obj.target/dns_sd_bindings/src/dns_sd.o] Error 1
make: Leaving directory '/hogehoge/google-home-notifier/node_modules/mdns/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/share/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:809:12)
gyp ERR! System Linux 4.9.35+
gyp ERR! command "nodejs" "/usr/bin/node-gyp" "rebuild"
gyp ERR! cwd /hogehoge/google-home-notifier/node_modules/mdns
gyp ERR! node -v v0.10.29
gyp ERR! node-gyp -v v0.12.2
gyp ERR! not ok
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read
/usr/share/doc/nodejs/README.Debian

npm ERR! mdns@2.3.3 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the mdns@2.3.3 install script.
npm ERR! This is most likely a problem with the mdns package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get their info via:
npm ERR!     npm owner ls mdns
npm ERR! There is likely additional logging output above.

npm ERR! System Linux 4.9.35+
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /hogehoge/google-home-notifier
npm ERR! node -v v0.10.29
npm ERR! npm -v 1.4.21
npm ERR! code ELIFECYCLE
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /hogehoge/google-home-notifier/npm-debug.log
npm ERR! not ok code 0

これ node が無ぇ、、、のが原因なので

# ln -s /usr/bin/nodejs /usr/bin/node

で、先ほど入れた nodejs へ node からシンボリックリンクを張ってやります
これで # npm install をやってみる・・・・ なんだか快調にスクロールしてるじゃん
あれ、なんか同じ内容を繰り返してね?→コピペーしてみる→ウギャーーループしてるだけ
(ctrl+c とかで殺します)

↓ループしてる一部
gyp WARN EACCES user "root" does not have permission to access the dev dir "/hogehoge/google-home-notifier/node_modules/mdns/.node-gyp/8.8.1"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/hogehoge/google-home-notifier/node_modules/mdns/.node-gyp"
gyp verb tmpdir == cwd automatically will remove dev files after to save disk space
gyp verb command install [ '8.8.1' ]
gyp verb install input version string "8.8.1"
gyp verb install installing version: 8.8.1
gyp verb install --ensure was passed, so won't reinstall if already installed
gyp verb install version not already installed, continuing with install 8.8.1
gyp verb ensuring nodedir is created /hogehoge/google-home-notifier/node_modules/mdns/.node-gyp/8.8.1
gyp WARN EACCES user "root" does not have permission to access the dev dir "/hogehoge/google-home-notifier/node_modules/mdns/.node-gyp/8.8.1"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/hogehoge/google-home-notifier/node_modules/mdns/.node-gyp"
gyp verb tmpdir == cwd automatically will remove dev files after to save disk space
gyp verb command install [ '8.8.1' ]
gyp verb install input version string "8.8.1"
gyp verb install installing version: 8.8.1
gyp verb install --ensure was passed, so won't reinstall if already installed
gyp verb install version not already installed, continuing with install 8.8.1
gyp verb ensuring nodedir is created /hogehoge/google-home-notifier/node_modules/mdns/.node-gyp/8.8.1

展開したディレクトリに権限がないのに無限にリトライしているようなので
google-home-notifier を置いたフォルダに戻って

# cd ../
# chown -R root google-home-notifier

と、持ち主を変更、再度
後で思ったのだが $ sudo -s で作業するとこうなるみたい # su で root になってから作業するべき

# cd google-home-notifier
# npm install

でなんとか入ったもよう
よしよし、テスト起動

# node example.js
module.js:515
    throw err;
    ^

Error: Cannot find module '../build/Release/dns_sd_bindings'
    at Function.Module._resolveFilename (module.js:513:15)
    at Function.Module._load (module.js:463:25)
    at Module.require (module.js:556:17)
    at require (internal/module.js:11:18)
    at Object. (/hogehoge/google-home-notifier/node_modules/mdns/lib/dns_sd.js:32:22)
    at Module._compile (module.js:612:30)
    at Object.Module._extensions..js (module.js:623:10)
    at Module.load (module.js:531:32)
    at tryModuleLoad (module.js:494:12)
    at Function.Module._load (module.js:486:3)

またまたエラー → モジュールが足りないぜ
※ su で root になってから(sudo だと またループするぜー)

# npm install --unsafe-perm mdns

エラ~ fatal error: dns_sd.h: そのようなファイルやディレクトリはありません

apt-get install libavahi-compat-libdnssd-dev
再度
# npm install --unsafe-perm mdns → 時間のかかる build へ進んでいればOK
問題なければ続けて
# npm rebuild --unsafe-perm

やっと
node example.js

起動しているっぽいので、別の ssh を開いて
$ curl -X POST -d "text=OK Google" http://127.0.0.1:8080/google-home-notifier
アドレス部は、ラズパイのアドレス

ところで、 node example.js を起動すると、サンプルが出て ngrok 経由でどこからでも使えるっぽい
※ngrok のサブドメインは起動毎に変動する

が、どこからでも使える必要がない = ngrok を使わないなら
example.js の下記の箇所をコメントアウト

var express = require('express');
var googlehome = require('./google-home-notifier');
// var ngrok = require('ngrok'); ←ココ
var bodyParser = require('body-parser');
var app = express();
// (略)
app.listen(serverPort, function () {
  /*  ココから
  ngrok.connect(serverPort, function (err, url) {
    console.log('POST "text=Hello Google Home" to:');
    console.log('    http://localhost:' + serverPort + '/google-home-notifier');
    console.log('    ' +url + '/google-home-notifier');
    console.log('example:');
    console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier');
  });
  ココまで
  */
})


コメント