絵チャに接続している人数を拾ってMRTGでグラフ化

スクリプト初心者です。 もっと綺麗に書ける人はトラックバックでレスください('A`)※

はじまりはここから。
http://pie.bbspink.com/test/read.cgi/erocg/1135503973/534

>>533
入室はアパッチからカスタムログで.jarへのアクセスログ抜き出しで
人数カウントは各部屋のportのコネクション数見てます

という話だったので、じゃあMRTGでグラフ化してみようじゃない。
…と思ったのが、多分25日あたり。完成が3日だから8日(実質作業日数20時間くらい)… 初心者*1なので見逃してくださいorz


port接続をnetstatで見てもいいんだけど、どうもそれだけでは面白くなかったので、snmpから抜き出そうと思いつく。
snmpdとsnmp-toolをaptでインストールし、snmpwalkで確認。
19031をpaintchatの接続portと仮定して進めます…

# snmpwalk -v 1 -c public localhost tcpConnState|grep 19031

で、出てくる結果のうち、established(5)が接続してる分とおもうんだけど、何故か2ヶ出てくる。
通常であればこれの行数をカウントするだけだから1行スクリプトで済むんだけど、計算が混じっちゃうので1行は無理とシェルスクリプト直打ちでやることにしました。

# cat portcon

#!/bin/sh
walk=(`snmpwalk -v 1 -c public localhost tcpConnState |grep $1|awk '{if($4=="established(5)"){cnt++}print cnt}'`)
num=1
while [ "${walk[$num]}" != "" ];do
shift 1
num=`expr $num + 1`
done
num=`expr $num - 1`
if [ "${walk[$num]}" == "" ];then
echo "0"
else
echo `expr ${walk[$num]} / 2`
fi

これで、接続者が1人の場合は

# portcon 19031
1

と出ます。
しかし、MRTGは2ヶ以上のデータを必要とするので、これだけではだめです。*2
仕方ないので、最後のif〜fiを2回続けてデータ捏造。(なげやり)
これで出力は

# portcon 19031
1
1

となって、MRTGへの入力が可能になりました。
あとは、MRTG.cfgを編集。

Target[19031]: `/hogehoge/portcon 19031`
MaxBytes[19031]: 100
Title[19031]: TCP19031 connections...
Options[19031]: growright,absolute,gauge,nopercent,noinfo,integer
WithPeak[19031]: ymw
ShortLegend[19031]: 人
YLegend[19031]: port: 19031
LegendI[19031]: 接続数
LegendO[19031]:
Legend1[19031]: nums
Legend2[19031]:

これでMRTGを動かして、19031.htmlを参照すればグラフが出ます。
当然ですが、÷2を無くしてやれば別のポート監視にも使えます。

*1:免罪符

*2:本来は4ヶ必要とあり。 しかも、他を"0"とすると正常なデータの保存ができない。 このあたりで3日ほど悩みました