2017年5月16日火曜日

自宅のPCを外出先からボタン一つで起動

クラウド全盛の世の中ですが、自宅のPCでないとできないこと、たくさんありますよね。外出先から使いたくなることもたまにあります。

外出先から使えるように、ダイナミックDNSとポート開放を設定してあっても、肝心の電源が入っていなければ使えません。とはいえ、たまにしかないことのために、電源入れっぱなしは電気代がもったいないし、セキュリティも気になります。

そこで、自宅でRaspberry Piを常時起動しておいて、Raspberry Pi経由でPCをWake-on-LANで必要なときだけ起動するように設定しましょう。外出先からの起動の起点には、スマートフォンアプリのボタンを使います。



全体像は下記の通りです。

(スマートフォン)→(Codyl Connect)→(自宅Raspberry Pi)→(自宅PC)

前提知識

この記事では、下記の説明は省略します。
  • 自宅ネットワークの固定グローバルIPまたはダイナミックDNS設定手順
  • 自宅ネットワークのポート開放手順

用意するもの

  • PC
    • OSはWindowsまたはLinux
    • 有線LAN
    • マザーボードや有線LANのネットワークアダプターがWake-on-LANをサポートしていること
  • Raspberry Pi
    • SDカードにraspbianインストール済み
    • 有線LANまたは無線LAN
  • ネットワーク環境
    • インターネットに常時接続
    • グローバルアドレスで接続されていること
    • 固定グローバルIPまたはダイナミックDNSが使えること
  • スマートフォン
    • iOS 9.3以降のiPhone

作業1 PCのWake-on-LAN設定

PCがマジックパケットでWake-on-LANできるように設定します。マザーボードやOSにより設定方法が違うので、ポイントだけ紹介します。マザーボードの設定とOSの設定を両方行わないといけないケースが多いと思います。
  • マザーボードの設定
    • PCのBIOS画面からWake-on-LANを有効にする
  • OSの設定
    • Windowsの場合
      • デバイスマネージャー → ネットワークアダプター → (有線LANのアダプター) → プロパティ
      • ネットワークアダプターのドライバーによって異なるが、「詳細設定」や「電力の管理」にWake-on-LANの設定があることが多い。Magic PacketでのWake-on-LANをオンにする。
    • Linuxの場合
      • 下記コマンドが起動時に実行されるようにする。
        • ethtool -s eth0 wol g
MACアドレスを後で参照するので、確認してメモしておきます。

  • Windowsの場合
    • コマンドプロンプトからipconfig /all
  • Linuxの場合
    • シェルからifconfig -a

作業2 Raspberry Piにetherwakeをセットアップ

etherwakeをインストールして、一般ユーザーからもWake-on-LANのマジックパケットを送信できるようにします。
  • sudo apt-get install -y etherwake
  • sudo chmod +s /usr/sbin/etherwake
PCをシャットダウンさせた状態で、テストしてみましょう。下記のeth0はRasbperry Piが有線LANに接続されている場合の例です。無線LANの場合はwlan0に変更してください。また、XX:XX:XX:XX:XX:XXはPCのMACアドレスに書き換えてください。
  • etherwake -i eth0 -b -D XX:XX:XX:XX:XX:XX
コマンド実行してPCが起動すればOKです。

作業3 Raspberry Piでwebhookを作成

外出先からetherwakeを起動するために、Raspberry Piでwebhookサービスを起動しましょう。nodejsを使えば簡単なプログラムで実装できます。まずは最新の安定版nodejsをセットアップしましょう。
  • sudo apt-get install -y nodejs npm
  • sudo npm cache clean
  • sudo npm install n -g
  • sudo n stable
  • node --version
このブログ執筆時点では7.10.0がインストールされました。続いて、webhookのプログラムです。
  • sudo apt-get install -y uuid-runtime
  • mkdir webhook_etherwake
  • cd webhook_etherwake/
  • npm install express
  • npm install body-parser
下記の内容をwebhook_etherwake.jsというファイル名で保存します。


プログラムの先頭のTOKENとMACADDRとPORTは書き換えます。TOKENはuuidgenコマンドで生成したランダムなUUIDを使うのが良いでしょう。これが漏洩すると、誰でもあなたのPCを起動できるようになります(大した実害はないかもしれませんが)。MACADDRはPCのMACアドレスに書き換えます。PORTはポート開放に使用するポート番号です、すでに9003を他のポート開放で使っていなければそのままで良いでしょう。

以下、XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXは、セットしたTOKENに置き換えてください。

準備ができたら早速起動してみましょう。下記のコマンドで起動したらListening on port 9003と表示されます。
  • chmod +x webhook_etherwake.js
  • ./webhook_etherwake.js
別のシェルから下記のコマンドを実行して動作確認します。
  • curl -X POST -H "Content-type:application/json" -d '{"token":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"}' http://localhost:9003/wake
OKと表示されて、PCが起動することを確認しましょう。

続いてこのプログラムをRaspberry Piで自動的に起動するように設定します。
  • crontab -e
    • @reboot /usr/local/bin/node $HOME/webhook_etherwake/webhook_etherwake.js > /dev/null 2>&1 &

リブート後、先ほどのcurlコマンドをもう一度実行して、正しく動作することを確認します。

作業4 ポート開放

Raspberry Piのポート9003をインターネットからアクセスできるようにポート開放します。

作業5 Connectアプリをインストール

スマートフォンにCodyl Connectアプリがインストールされていなければ、インストールします。AppStoreでcodylで検索するか、下記のリンクから開いてください。


Connectのアカウント登録がまだであれば、Connectアプリからアカウント登録が可能です。アカウント登録を済ませて、ログインしましょう。

作業6 シナリオ作成

ブラウザからCodyl Connectにログインしてシナリオを作成します。
  • (1)シナリオタブから「新規シナリオ作成」をクリック
  • (2)わかりやすいシナリオ名に変更
  • (3)説明を書く
  • (4)再実行頻度を0分に変更
  • (5)「イベントウォーク新規作成」をクリック

  • (6)mainの箱の下のプラス記号をクリックしてステートを追加
  • (7)追加されたステート(state2)をクリック
  • (8)「ステートにコネクターを追加」をクリック
  • (9)新しいコネクターを作成を選んで、「ボタン」を選択
  • (10)4つのボタンのうち好きなものを選択
  • (11)「作成」をクリック


  • (12)メソッドに「TRIGGER: when pushed」を選択
  • (13)textの値に「PC起動」と記述。この文字列がスマートフォンのボタンに表示されます。一番下の「閉じる」をクリック。
  • (14)state2の下のプラス記号をクリックしてステートを追加、追加されたステート(state5)をクリック。
  • (15)「ステートにコネクターを追加」をクリック
  • (16)新しいコネクターを作成を選んで、「WebHook」を選択
  • (17)わかりやすい名前を入力(例:「WebHook(PC起動)」)
  • (18)外部サービスのURLに、「http://自宅のアドレス:9003/wake」と入力。自宅のアドレスには固定IPの場合はIPアドレス、ダイナミックDNSの場合はDNSホスト名を入れます。
  • (19)「作成」をクリック
  • (20)メソッドに「ACTION: post message」を選択
  • (21)tokenの値にRaspberry Piで設定したTOKENを入力。一番下の「閉じる」をクリック。
  • (22)上部のリストからシナリオ名をクリックしてシナリオプロパティ画面に戻る
  • (23)スケジュール設定を有効にする
これでシナリオの設定は完了です。

完成

シナリオの動作中は、スマートフォンのConnectアプリ上で、「PC起動」ボタンがアクティブになります。このボタンを押したら自宅のPCが起動します。




0 件のコメント:

コメントを投稿

ラズパイでLet's Encryptの証明書更新に失敗

ラズパイを自宅用の各種サーバー(DNS、メール、ウェブ他)として使っています。httpsのサーバー証明書の発行・更新にはLet's Encriptを使っています。今日たまたま証明書を更新しようとすると下記のエラーに陥りました。何度やっても失敗します。 ma...