xref: /freebsd/usr.sbin/route6d/misc/chkrt (revision 6d7256d9d60bc277b4e6383cd992173ea2134b38)
17d56d374SYoshinobu Inoue#!/usr/bin/perl
27d56d374SYoshinobu Inoue#
37d56d374SYoshinobu Inoue# $FreeBSD$
47d56d374SYoshinobu Inoue#
57d56d374SYoshinobu Inoue$dump="/var/tmp/route6d_dump";
67d56d374SYoshinobu Inoue$pidfile="/var/run/route6d.pid";
77d56d374SYoshinobu Inoue
87d56d374SYoshinobu Inouesystem("rm -f $dump");
97d56d374SYoshinobu Inoue
107d56d374SYoshinobu Inoueopen(FD, "< $pidfile") || die "Can not open $pidfile";
117d56d374SYoshinobu Inoue$_ = <FD>;
127d56d374SYoshinobu Inouechop;
137d56d374SYoshinobu Inoueclose(FD);
147d56d374SYoshinobu Inouesystem("kill -INT $_");
157d56d374SYoshinobu Inoue
166d7256d9SHajimu UMEMOTOopen(NS, "/usr/bin/netstat -r -n|") || die "Can not open netstat";
177d56d374SYoshinobu Inouewhile (<NS>) {
187d56d374SYoshinobu Inoue	chop;
197d56d374SYoshinobu Inoue	next unless (/^3f/ || /^5f/);
207d56d374SYoshinobu Inoue	@f = split(/\s+/);
217d56d374SYoshinobu Inoue	$gw{$f[0]} = $f[1];
227d56d374SYoshinobu Inoue	$int{$f[0]} = $f[3];
237d56d374SYoshinobu Inoue}
247d56d374SYoshinobu Inoueclose(NS);
257d56d374SYoshinobu Inoue
267d56d374SYoshinobu Inoue$err=0;
277d56d374SYoshinobu Inouesleep(2);
287d56d374SYoshinobu Inoueopen(FD, "< $dump") || die "Can not open $dump";
297d56d374SYoshinobu Inouewhile (<FD>) {
307d56d374SYoshinobu Inoue	chop;
317d56d374SYoshinobu Inoue	next unless (/^    3f/ || /^    5f/);
327d56d374SYoshinobu Inoue	@f = split(/\s+/);
337d56d374SYoshinobu Inoue	$dst = $f[1];
347d56d374SYoshinobu Inoue	$f[2] =~ /if\(\d:([a-z0-9]+)\)/;
357d56d374SYoshinobu Inoue	$intf = $1;
367d56d374SYoshinobu Inoue	$f[3] =~ /gw\(([a-z0-9:]+)\)/;
377d56d374SYoshinobu Inoue	$gateway = $1;
387d56d374SYoshinobu Inoue	$f[4] =~ /\[(\d+)\]/;
397d56d374SYoshinobu Inoue	$metric = $1;
407d56d374SYoshinobu Inoue	$f[5] =~ /age\((\d+)\)/;
417d56d374SYoshinobu Inoue	$age = $1;
427d56d374SYoshinobu Inoue	unless (defined($gw{$dst})) {
437d56d374SYoshinobu Inoue		print "NOT FOUND: $dst $intf $gateway $metric $age\n";
447d56d374SYoshinobu Inoue		$err++;
457d56d374SYoshinobu Inoue		next;
467d56d374SYoshinobu Inoue	}
477d56d374SYoshinobu Inoue	if ($gw{$dst} ne $gateway && $gw{$dst} !~ /link#\d+/) {
487d56d374SYoshinobu Inoue		print "WRONG GW: $dst $intf $gateway $metric $age\n";
497d56d374SYoshinobu Inoue		print "kernel gw: $gw{$dst}\n";
507d56d374SYoshinobu Inoue		$err++;
517d56d374SYoshinobu Inoue		next;
527d56d374SYoshinobu Inoue	}
537d56d374SYoshinobu Inoue	if ($int{$dst} ne $intf) {
547d56d374SYoshinobu Inoue		print "WRONG IF: $dst $intf $gateway $metric $age\n";
557d56d374SYoshinobu Inoue		print "kernel if: $int{$dst}\n";
567d56d374SYoshinobu Inoue		$err++;
577d56d374SYoshinobu Inoue		next;
587d56d374SYoshinobu Inoue	}
597d56d374SYoshinobu Inoue}
607d56d374SYoshinobu Inoueclose(FD);
617d56d374SYoshinobu Inoue
627d56d374SYoshinobu Inoueif ($err == 0) {
637d56d374SYoshinobu Inoue	print "No error found\n";
647d56d374SYoshinobu Inoue}
65