Flex SDKテスト 2 SNMPで円グラフ

前回Flexを触った時に言っていたSNMPデータを用いたグラフを作ってみました。
『/』のディスクの使用量と空き容量を取って来て表示するサンプルです。

http://sepia-mind.sakura.ne.jp/node/24

どうやらsdkだとTrialなる文字が埋め込まれてしまうみたいですねー。ライセンスを10万くらいで買えば消えるみたいですが、商用で使う人ならそのくらい出せるでしょう。
まあ私は趣味でそこまでのお金は払えないので、サンプルコードでも晒して貢献させてもらいますかねぇ。

ということでコードです。mxml側は前回と大差ないです。



  <mx:Panel title="ディスク使用量">
     
           <mx:PieSeries 
                field="value" 
                nameField="name" 
                labelPosition="callout"
           />
        
     
  

  


データ取得側はPerlで書きました。まあ少し思うところあってですが、SNMPまわりのモジュールはphpではなさそうですね。組み込みで関数はあるみたいでしたが。この辺はやはりPerlに一日の長があるのかなと。


#!/usr/bin/perl

use strict;
use warnings;
use utf8;

use Net::SNMP;
use Readonly;
use YAML::Syck;

# settings
Readonly my $CONF => '../etc/snmp.yaml';

Readonly my $HOST => 'localhost';
Readonly my $COMMUNITY => 'xxxxxxxx';
Readonly my $VERSION => 'snmpv2';
Readonly my $PORT => 161;

my ($conf, $oid, $result, $xml);


$conf = &YAML::Syck::LoadFile($CONF);
$oid = &conf2oid_array_ref($conf);
$result = &get_snmp_values($oid);

# output
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
$xml .= "\n";
foreach (@{$conf}) {
my $name = $_->{'name'};
my $oid = $_->{'oid'};
my $value = $result->{$oid};

$xml .= " \n";
$xml .= " $name\n";
$xml .= " $oid\n";
$xml .= " $value\n";
$xml .= "
\n";
}
$xml .= "\n";

print "Content-Type: text/xml; charset=UTF-8\n\n";
print $xml;

## -- subroutine

# Subroutine for get SNMP DATA
#
# input: Array Ref [oid1, oid2 ...]
# output: Hash Ref (Return Value for SNMP Request)
sub get_snmp_values {

my $oids = shift;

my ($session, $error, $ret);

($session, $error) = Net::SNMP->session(
-hostname => $HOST,
-community => $COMMUNITY,
-version => $VERSION,
-port => $PORT
);

if (!defined($session)) {
exit 1;
}

$ret = $session->get_request(
-varbindlist => $oids
);

if (!defined($ret)) {
$session->close;
exit 1;
}

$session->close;

return $ret;

}

# Subroutine for yaml hash convert to oid array reference
#
# input: Hash (Yaml Data)
# output: Array Ref (oid array ref)
sub conf2oid_array_ref {
my $conf = shift;

my @oids;

foreach (@{$conf}) {
my $data = $_;
push(@oids, $data->{'oid'});
}

return \@oids;
}

snmp.yaml


-
name: ディスク空き容量
oid: 1.3.6.1.4.1.2021.9.1.7.1
-
name: ディスク使用量
oid: 1.3.6.1.4.1.2021.9.1.8.1

とこんな感じ。今回はwww.sepia-mind.comにswfを置いてsnmpのデータは前回のエントリで触れたVPSサーバから取ってます。そう。勘のいい方はお分かりかと思いますが、クロスドメインなんですよ。一時ブログパーツ作るのにハマってAjaxちょろちょろと触ってたときも悩まされたんですが、やっぱりFlexでもでましたね。まあセキュリティを考えれば当然でしょうか。Ajaxだとjsonpでクロスドメインほげほげで調べれば回避方法は出てくると思いますが、Flexは情報が少なく結構探すのに苦労しました。結論だけいうとSWFから呼び出される側(VPS側)のルートにcrossdomain.xmlという名前で以下のようなファイルを置けば良いです。






とこんな感じできっとやり取りできるはずです。
Flexのグラフは値を渡すだけでキチンと割合も計算して表示してくれるんですねー。
GJすぎる ....

今回は単純にデータを取って来て表示しただけだったので次はrrdtool使ってトラフィック量を吐くの作ってみたいですね。後、

http://examples.adobe.com/flex3/devnet/networkmonitor/main.html

こんなの作りてぇ。普段Nagios使ってるのであれをこんな風に可視化できたら面白いだろうなと。まあNagvisってなのもあるみたいですが。

http://www.nagvis.org/