Raspberry Pi 4を買いました。で、SDカードにはArchLinuxを入れました。
今回LEDとかも別に買っているわけではなく、素の状態での運用となるのですが、困ることが一つあって、
どこに接続しているのかの確認が面倒くさい
基本的にはDHCP利用な上にモニターもない状態なので、有線接続だろうと無線接続だろうとIPアドレスを確認しに行くのも面倒です。
そこで今回は、タイトルの通り「ネットワーク接続が確立できた時点で接続情報を自分から伝えてもらう」ことにしました。
まとめ
環境情報
- 筐体: Raspberry Pi 4
- OS: ArchLinux (ARM版)
- ネットワーク管理: NetworkManager
- Python 3.8.0
書いたコード
#!/usr/bin/env python
import json
import os
import sys
from urllib.request import urlopen
WEBHOOK_URL = 'https://hooks.slack.com/services/THISIS/SLACK/WEBHOOK'
def main(conn_id, ip_addr):
payload = {
'username': 'info',
'icon_emoji': ':strawberry:',
'text': f'*attakei-pi* has connected to {conn_id}\n IP address is `{ip_addr}`',
'channel': '@attakei',
}
urlopen(WEBHOOK_URL, json.dumps(payload).encode())
if __name__ == '__main__':
argv = sys.argv[1:]
# if argv[0] != 'wlan0' or argv[1] != 'up':
if argv[1] != 'up':
sys.exit(0)
ip_addr = os.environ['DHCP4_IP_ADDRESS']
conn_id = os.environ['CONNECTION_ID']
main(conn_id, ip_addr)
出来上がった通知
NetworkManagerの話
NetworkManagerとは
ネットワーク接続に関するあれこれを管理するためのデーモン(+ツール)です。
SSIDの管理をしてくれたり、すでに登録済みのSSIDには自動接続を行ったりしてくれます。
systemd-networkd
などもありますが、とりあえず自分は現在これを利用しています。
NetworkManagerのdispatch機能
さて、NetworkManagerには「ネットワークの切り割りをイベントとしてコマンド実行する」ことを可能にする、dispatcher
機能があります。
ArchLinuxのWikiに掲載されているサンプルなどでは、「有線接続をしたときは無線を無効化(+その逆)」「特定ネットワークに接続した場合は、続けてVPN接続する」みたいな例が書かれています。
今回はこれらのスクリプトを参考にして、上記のような「ネットワーク接続時に、指定されたSlackチャンネルに 利用したSSID
とIPアドレス
を申告する」スクリプトを作ってみました。
dispatcherが受け取るもの
実際に使用してわかっている範囲だと、Disptcherはコマンド実行時に以下の情報を渡すようになってます。
- コマンドの引数として
- イベントのあったネットワークデバイス名
- どんなイベントが発生したか(例:
up
=接続した)
- 環境変数として
- 上記イベントに付随する情報各種
- 接続設定名
- IPアドレス
- などなど
- 上記イベントに付随する情報各種
情報を揃えてdispatchする
トリガーにしたい条件をもとに、どこから情報を取るかや振る舞いを整理します。
- 「ネットワーク接続時に」
- => コマンドの第2引数を参照する。
up
以外は無視
- => コマンドの第2引数を参照する。
- 「指定されたSlackチャンネルに」
- => NetworkManager-dispacherの管理領域ではないので、とりあえずスクリプト直接記載
- 「
利用したSSID
」- => 環境変数の
CONNECTION_ID
を参照
- => 環境変数の
- 「
IPアドレス
」- => とりあえずIPv4がほとんどなので、環境変数の
DHCP4_IP_ADDRESS
を参照
- => とりあえずIPv4がほとんどなので、環境変数の
これで、必要な情報は揃ったので、コードが書けますね。コードは最初に記載したのでそちらを参照して下さい。
補足
スクリプトは直接呼び出されるので、shebangと実行権限付与を忘れずに。
※自分はこれで「あれっ」ってなり、頑張る系のIPアドレス探索をするはめになりかけました。