mrtg.cfgを作るスクリプト

octets, discards, errors, unicastpkts, broadcastpkts, multicastpktsのいずれかを収集するmrtg.cfgファイルを作成する


(mycfgmaker.pl)

#!/usr/bin/env perl

$snmpwalk = "/usr/bin/snmpwalk"; #スクリプト内でsnmpwalkを起動するので実行パスを指定してください
$rrddir   = "/usr/local/apache/htdocs/mrtg";
$icondir  = "/usr/local/mrtg-2/share/mrtg2/icons/";
$absmax   = "125000000"; #1GB
$pathadd  = "/usr/local/rrdtool/bin/";
$libadd   = "/usr/local/rrdtool/lib/perl/\n";
$rrdrowcount = "12960";
$maxbytes = "12500000"; #100MB

$usage =<<"EOS";
usage : mycfgmaker.pl [-global]
                      [-interval min]
                       -v 1|2c|3
                       -c COMMUNITY
                       -object octets|discards|errors|unicastpkts|broadcastpkts|multicastpkts
                       hostname
EOS

if($#ARGV < 6){
  die $usage;
}

$i = 0;
while($i < $#ARGV){
  if($ARGV[$i] =~ /^-global$/){
    $global++;
  }elsif($ARGV[$i] =~ /^-interval$/){
    $i++;
    $interval = $ARGV[$i];
  }elsif($ARGV[$i] =~ /^-v$/){
    $i++;
    $snmpversion = $ARGV[$i];
    if(!($snmpversion =~ /^(1|2c|3)$/)){
      die "invalid option $ARGV[$i-1] $ARGV[$i]\n";
    }
  }elsif($ARGV[$i] =~ /^-c$/){
    $i++;
    $community = $ARGV[$i];
  }elsif($ARGV[$i] =~ /^-object$/){
    $i++;
    $object = $ARGV[$i];
    if($object =~ /^octets$/){
      @oid = ('ifInOctets','ifOutOctets');
    }elsif($object =~ /^discards$/){
      @oid = ('ifInDiscards','ifOutDiscards');
    }elsif($object =~ /^errors$/){
      @oid = ('ifInErrors','ifOutErrors');
    }elsif($object =~ /^unicastpkts$/){
      @oid = ('ifInUcastPkts','ifOutUcastPkts');
    }elsif($object =~ /^multicastpkts$/){
      @oid = ('ifInMulticastPkts','ifOutMulticastPkts');
    }elsif($object =~ /^broadcastpkts$/){
      @oid = ('ifInBroadcastPkts','ifOutBroadcastPkts');
    }else{
      die "invalid option $ARGV[$i-1] $ARGV[$i]\n";
    }
  }elsif($ARGV[$i] =~ /^-\S+$/){
    die "invalid option $ARGV[$i]\n";
  }else{
    die $usage;
  }
  $i++;
}

$hostname = $ARGV[$#ARGV];
$title = "$hostname-$object";

if($global > 0){

  print "Title[_]: $title\n";
  print "WorkDir: $rrddir\n";
  print "IconDir: $icondir\n";
  print "AbsMax[_]: $absmax\n";
  print "Forks: 4\n";
  print "SnmpOptions: timeout => 10, retiries => 3\n";

  print "LogFormat: rrdtool\n";
  print "PathAdd: $pathadd\n";
  print "LibAdd: $libadd\n";
  print "RRDRowCount[_]: $rrdrowcount\n";

  print "\n";

}

if($interval > 0){
  print "Interval: $interval\n\n";
}

#インターフェイスのインデックス番号
open(IFINDEX,"$snmpwalk -v $snmpversion -c $community $hostname IF-MIB::ifIndex|");

#インターフェイスの説明
open(IFDESCR,"$snmpwalk -v $snmpversion -c $community $hostname IF-MIB::ifDescr|");

while(($ifindex = <IFINDEX>) && ($ifdescr = <IFDESCR>)){
  $ifindex =~ /^\S+ \= \w+: (\d+)/; $index = $1;
  $ifdescr =~ /^\S+ \= \w+: (.+)$/; $descr = $1;
  print "\#$descr\n";

  #ファイル名に使用できない文字と大括弧を削除
  $descr =~ s/[\/\\\:\*\?\<\>\|\#\{\}\%\&\~\[\]]//g;

  #"-"を"_"に変換する
  #$descr =~ s/-/_/g;

  #空白を削除し、"_"で連結する
  @temp = split(/\s+/,$descr);
  $descr = join("_",@temp);

  #target名を生成する
  #$target_name = "$hostname-$object-$descr";
  $target_name = $descr;

  @temp = @oid;
  grep(s/.*/$_."\.$index"/e,@temp); #配列の要素全てにindexを付加する
  $oids = join("&",@temp);
  print "Target[$target_name]: $oids:$community\@$hostname\n";
  print "Directory[$target_name]: $hostname/$object\n";
  print "MaxBytes[$target_name]: $maxbytes\n";
  print "\n";
}

close(IFINDEX);
close(IFDESCR);


実行例. マルチキャストパケットを収集するコンフィグファイル(グローバル設定除く)を作成

$ ./mycfgmaker.pl -v 2c -c intrawatcher -object multicastpkts  192.168.0.33
#Software Loopback Interface 1.
Target[Software_Loopback_Interface_1.]: ifInMulticastPkts.1&ifOutMulticastPkts.1:intrawatcher@192.168.0.33
Directory[Software_Loopback_Interface_1.]: 192.168.0.33/multicastpkts
MaxBytes[Software_Loopback_Interface_1.]: 12500000

#VMware Virtual Ethernet Adapter for VMnet1.
Target[VMware_Virtual_Ethernet_Adapter_for_VMnet1.]: ifInMulticastPkts.2&ifOutMulticastPkts.2:intrawatcher@192.168.0.33
Directory[VMware_Virtual_Ethernet_Adapter_for_VMnet1.]: 192.168.0.33/multicastpkts
MaxBytes[VMware_Virtual_Ethernet_Adapter_for_VMnet1.]: 12500000

#VMware Virtual Ethernet Adapter for VMnet8.
Target[VMware_Virtual_Ethernet_Adapter_for_VMnet8.]: ifInMulticastPkts.3&ifOutMulticastPkts.3:intrawatcher@192.168.0.33
Directory[VMware_Virtual_Ethernet_Adapter_for_VMnet8.]: 192.168.0.33/multicastpkts
MaxBytes[VMware_Virtual_Ethernet_Adapter_for_VMnet8.]: 12500000

#Bluetooth Device (RFCOMM Protocol TDI).
Target[Bluetooth_Device_(RFCOMM_Protocol_TDI).]: ifInMulticastPkts.4&ifOutMulticastPkts.4:intrawatcher@192.168.0.33
Directory[Bluetooth_Device_(RFCOMM_Protocol_TDI).]: 192.168.0.33/multicastpkts
MaxBytes[Bluetooth_Device_(RFCOMM_Protocol_TDI).]: 12500000

#Microsoft Virtual WiFi Miniport Adapter #2.
Target[Microsoft_Virtual_WiFi_Miniport_Adapter_2.]: ifInMulticastPkts.5&ifOutMulticastPkts.5:intrawatcher@192.168.0.33
Directory[Microsoft_Virtual_WiFi_Miniport_Adapter_2.]: 192.168.0.33/multicastpkts
MaxBytes[Microsoft_Virtual_WiFi_Miniport_Adapter_2.]: 12500000
...

識別子に"."使えないかも。