RaspberryPi ADT7410の温度を取得してsnmpに載せる

 2015-08-10
I2Cにぶら下がるADT7410から温度を取得する方法が分かったので、さっそくそれをsnmpに載せてcactiでグラフにしてもらう。
 

snmpにADT7410の値を載せる

さて、前回まででADT7410の温度が得られるようになったのでそれをsnmpに載せてみましょう。前回のshellscriptを適当な場所に保存し、 /etc/snmp/snmpd.confに下記の行を付け足します。
extend i2c-adt7410    "/root/script/get_i2c_ADT7410.sh"

設定ファイルを変更したら、snmpdを再起動しておきます。
raspi% sudo /etc/init.d/snmpd restart



次にsnmpdの実行ユーザでI2Cバスにアクセスできるように、snmpというユーザを、i2cというグループに入れてあげます。
raspi% sudo gpasswd -a snmp i2c

raspi% id snmp
uid=107(snmp) gid=110(snmp) groups=110(snmp),111(i2c)


これでsnmpユーザはi2cグループに入りましたので、/dev/i2c-1にアクセスできます(デフォルトでgroupにrw許可されている)


・・・という予定でしたが、なぜか出来ません

パーミッションとの戦い

sudo -u snmp で実行した時は通常通り温度を読み出しできるのですが、snmpd経由ではダメなのです。別のマシンからsnmpwalkすると、Could not open file '/dev/i2c-1': Permission deniedと言われてしまいます。なぜだ・・・
rapi% sudo -u snmp i2cget -y 1 0x4a 0x00 w 
0x5011
↑snmpユーザで読み出し出来ている
↓snmpd経由ではエラーになっている
OtherMachine% snmpwalk <snip>
<snip>
NET-SNMP-EXTEND-MIB::nsExtendOutLine."i2c-adt7410".10 = STRING: +/root/script/get_i2c_ADT7410.sh:22> CH3_DAT=+/root/script/get_i2c_ADT7410.sh:22> /usr/sbin/i
2cget -y 1 0x4b 0x00 w
NET-SNMP-EXTEND-MIB::nsExtendOutLine."i2c-adt7410".11 = STRING: Error: Could not open file `/dev/i2c-1': Permission denied
NET-SNMP-EXTEND-MIB::nsExtendOutLine."i2c-adt7410".12 = STRING: Run as root?
<snip>


/etc/snmp/snmpd.confに下記のように付け足して、snmpユーザ権限で動作するように明示しても、解消しませんでした。なぜ・・?
agentuser  snmp
agentgroup snmp



しかたがないので、/dev/i2c-1のパーミッションを変更してotherな人たちもrwできるようにします。
raspi% sudo chmod o+rw /dev/i2c-1


これで誰でもI2Cにアクセスできます。良いか悪いかは置いといて・・
OtherMachine% snmpwalk <snip>
<snip>
NET-SNMP-EXTEND-MIB::nsExtendOutLine."i2c-adt7410".1 = STRING: 026.6250
NET-SNMP-EXTEND-MIB::nsExtendOutLine."i2c-adt7410".2 = STRING: 030.6875
NET-SNMP-EXTEND-MIB::nsExtendOutLine."i2c-adt7410".3 = STRING: 035.6875
NET-SNMP-EXTEND-MIB::nsExtendOutLine."i2c-adt7410".4 = STRING: 037.3750
<snip>
やったぜ!


しかし、残念ながらrasberrypiを再起動すると、/dev/i2c-1のパーミッションが元に戻ってしまいました。
デバイスファイルは起動時に作り直したりするものがあるので、そういうこともありますのだ・・。

起動時にまたパーミッションを付け直すようにrcファイルかなにかに書けば良いのですが、なんだか美しくないので、今回は/usr/sbin/i2cgetの実行ファイルにSGIDを付けることにします。
SGIDが付けられた実行ファイルは、誰が実行しても、そのファイルの所有グループの権限で実行されます。こわい!
raspi% sudo chmod g+s /usr/sbin/i2cget

raspi% ls -l /usr/sbin/i2cget
-rwxr-sr-x 1 root i2c 15K Apr 28 20:37 /usr/sbin/i2cget
↑Groupのパーミッションに r-s とあるのがSGIDが設定された表示

セキュリティ上、あまり褒められた対応ではない(/dev/i2c-1のパーミッション変更するのも大概だが)のですが、このrasberrypiをむき出しでwebに公開するわけではないのでいいかな。。

実行ファイルにSGIDを設定したことで、snmpd経由でも値が取得できるようになりました。 めでたしめでたし。


cactiに登録

cactiに任意のデータをグラフ化させる方法は以前書いた通りなので、それに従って下記の作業を行います。
  1. データテンプレートの作成
  2. 上記のデータテンプレートを読み込む形のグラフテンプレートを作成
  3. 該当する端末に、上記データテンプレートからデータソースを登録
  4. 該当する端末に、上記グラフテンプレートからグラフを作成

基本的には、snmpのOIDに名前を付けて(データテンプレート)、その名前をどのようにグラフ化するのか決めて(グラフテンプレート)、それをどの端末で実際にグラフ化するか登録(データソース・グラフの作成)、という感じ。
adt7410_i2c_snmp_cacti_01.png adt7410_i2c_snmp_cacti_02.png adt7410_i2c_snmp_cacti_03.png




ADT7410関係:


 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/205-bad77b7e
≪ トップページへこのページの先頭へ  ≫