ふたりはララベル (Laravel PHP Framework)

PHPフレームワークのLaravelの体験記を書いていきます。こんなタイトルのブログですが萌え系アニメは一秒たりとも観たことがありません。

Cisco機器のIOSからpingを継続的に打つ

Cisco機器のIOSから継続的にpingを打つことはできない。拡張pingを使った場合は、pingが正常に通じるなら一瞬で終わってしまうし、pingが通じないならCtrl+Cが効かないままエラーとなるpingを打ち続ける。そこでperlを使って1秒ごとにpingを打つプログラムを作った。こんな感じで動く。

$ perl ping_cont.pl
Fail ICMP Echos to 192.168.1.1
Fail ICMP Echos to 192.168.1.1
Fail ICMP Echos to 192.168.1.1
Fail ICMP Echos to 192.168.1.1
Success ICMP Echos to 192.168.1.1  min/avg/max = 1/1/1 ms
Success ICMP Echos to 192.168.1.1  min/avg/max = 1/1/1 ms
Success ICMP Echos to 192.168.1.1  min/avg/max = 1/1/1 ms
^C

このプログラムにはCPANモジュールのNet::Telnet::Ciscoが必要になるので、あらかじめインストールしておく。

#!/opt/perl/bin/perl

use strict;

use warnings;

use Net::Telnet::Cisco;

my $cisco = Net::Telnet::Cisco->new(
	Host => '192.168.1.2',
	Timeout => 4,
	ErrMode => 'die'
);

$cisco->login(
	Password => 'password'
);

$cisco->enable('enable');

# これがないとCtrl+Cを検知できない。
$SIG{INT} = sub {

	$cisco->disable;

	$cisco->close;

	print '^C' . "\n";

	exit 0;

};

my $count = 0;

my @ping;

my $protocol  = '';
my $ipaddr    = '192.168.1.2';
my $repeat    = 1;
my $datagram  = '';
my $timeout   = 2;
my $extended  = '';
my $sweep     = '';

# Ctrl+Cを押さなくても100回で終わる
while ($count < 100) {

	@ping =  $cisco->cmd(
	"ping
	 $protocol
	 $ipaddr
	 $repeat
	 $datagram
	 $timeout
	 $extended
	 $sweep
	");
	
	# pingの結果に「Success rate is 100 percent」の文字列が含まれていたら成功
	my $success = grep(/^Success rate is 100 percent/, @ping);
	
	# pingの結果から10行目を取得する
	my $mam = $ping[10];
	
	if ($success) {
		
		# pingの結果の10行目から「min/avg/max」の部分を取得する
		$mam =~ s/.*round-trip//;
		
		print 'Success ';
		
	} else {
		
		$mam = "\n";
		
		print 'Fail ';
		
	}
	
	print "ICMP Echos to $ipaddr $mam";
	
	sleep 1;
	
	$count++;
	
	@ping = ();
	
}

$cisco->disable;

$cisco->close;

exit 0;