OSPF-LSDB

 view release on metacpan or  search on metacpan

script/ospfview  view on Meta::CPAN

	    or die "Open pipe to '@cmd' failed: $!";
	print $fh $dot, "\n";
	close($fh)
	    or die "Close pipe to '@cmd' failed: $!";
	pause();
	exit 0;
    }

    my($oldtime, $oldyaml);
    until ($term) {
	my $time = time();
	if ($oldtime) {
	    my $sleeptime = $interval - ($time - $oldtime);
	    if ($sleeptime > 0) {
		select(undef, undef, undef, $sleeptime);
	    }
	}
	$oldtime = time();

	my $ospfclass = $ipv6 ? 'OSPF::LSDB::ospf6d' : 'OSPF::LSDB::ospfd';
	my $ospf = $ospfclass->new(ssh => $ssh);
	eval { $ospf->parse(); };
	if ($@) {
	    warn $@;
	    kill SIGTERM, $pid if $pid;
	    next;
	}

	my $yamlospf = OSPF::LSDB::YAML->new($ospf);
	if (defined $ipv6 && $ipv6 != $yamlospf->ipv6()) {
	    die "Address family does not match -4 and -6 options.\n";
	}
	my $yaml = $yamlospf->Dump();
	$yaml =~ s/^\s+(age|sequence): .*$//mg;
	next if ($oldyaml && $oldyaml eq $yaml && ! $gone) || $term;
	if ($dump) {
	    print $yaml;
	}
	if ($diff && $oldyaml) {
	    my %args = (
		SUFFIX => ".yaml",
		TEMPLATE => "ospfview-XXXXXXXXXX",
		TMPDIR => 1,
		UNLINK => 1
	    );
	    my $old = File::Temp->new(%args);
	    print $old $oldyaml;
	    my $new = File::Temp->new(%args);
	    print $new $yaml;
	    system('diff', '-up', $old->filename, $new->filename);
	}
	$oldyaml = $yaml;

	my $view = $class->new($ospf);
	my $dot = $view->graph(%todo);
	if ($todo{verbose}) {
	    my @errors = $view->get_errors;
	    print map { "$_\n" } @errors, "" if @errors;
	}

	my $chldsigset = POSIX::SigSet->new( &POSIX::SIGCHLD );
	my $oldsigset = POSIX::SigSet->new();
	sigprocmask(POSIX::SIG_BLOCK, $chldsigset, $oldsigset)
	    or die "Block sigprocmask failed: $!";
	if ($pid) {
	    kill SIGTERM, $pid;
	    if (waitpid($pid, 0) > 0) {
		die "'@cmd' failed: $?" if $? &&
		    ((WIFEXITED($?) && WEXITSTATUS($?) != 0) ||
		    (WIFSIGNALED($?) && WTERMSIG($?) != SIGTERM));
		undef $pid;
		$gone = 1;
	    }
	}
	sigprocmask(POSIX::SIG_SETMASK, $oldsigset, undef)
	    or die "Setmask sigprocmask failed: $!";

	$gone = 0;
	$pid = open2(undef, $fh, @cmd)
	    or die "Open pipe to '@cmd' failed: $!";
	print $fh $dot, "\n";
	close($fh)
	    or die "Close pipe to '@cmd' failed: $!";
    }
}

main();



( run in 1.808 second using v1.01-cache-2.11-cpan-71847e10f99 )