File Coverage

script/ospf2dot
Criterion Covered Total %
statement 78 93 83.8
branch 15 30 50.0
condition 1 3 33.3
subroutine 28 31 90.3
pod n/a
total 122 157 77.7


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             ##########################################################################
4             # Copyright (c) 2010-2012 Alexander Bluhm
5             #
6             # Permission to use, copy, modify, and distribute this software for any
7             # purpose with or without fee is hereby granted, provided that the above
8             # copyright notice and this permission notice appear in all copies.
9             #
10             # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11             # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12             # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13             # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14             # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15             # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16             # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17             ##########################################################################
18              
19 7     7   1378021 use strict;
  7     5   27  
  7         222  
  5         15386359  
  5         113  
  5         612  
20 7     7   39 use warnings;
  7     5   21  
  7         209  
  5         123  
  5         56  
  5         660  
21 7     7   516 use File::Slurp;
  7     5   24194  
  7         392  
  5         81  
  5         60  
  5         1404  
22 7     7   4994 use Getopt::Long qw(:config posix_default bundling);
  7     5   70638  
  7         39  
  5         93  
  5         74  
  5         222  
23 7     7   7000 use OSPF::LSDB::View;
  7     5   21  
  7         215  
  5         3147  
  5         56  
  5         310  
24 7     7   4158 use OSPF::LSDB::View6;
  7     5   21  
  7         183  
  5         79  
  5         39  
  5         353  
25 7     7   2463 use OSPF::LSDB::YAML;
  7     5   20  
  7         4042  
  5         92  
  5         24  
  5         7275  
26              
27             sub usage(@) {
28 6 100   6   184 print STDERR "Error: @_\n" if @_;
29 6         88 print STDERR <
30             Convert OSPF LSDB in YAML format to dot file used by Graphviz.
31              
32             Usage: $0 [-46bBceEhlpPsSwWv] [ospf.yaml] [ospf.dot]
33             -4 disable IPv6
34             -6 enable IPv6
35             -b generate other area AS boundary router summary
36             -B aggregate other area AS boundary router summary
37             -c cluster identical networks
38             -e generate AS external networks
39             -E aggregate AS external networks
40             -h help, print usage
41             -l generate legend
42             -p generate link and intra-area-prefix
43             -P generate intra-area-prefix
44             -s generate other area network summary
45             -S aggregate other area network summary
46             -w show most serious warning in dot graph
47             -W show all warnings and areas in dot graph
48             -v be verbose, print warnings to stderr
49             ospf.yaml input file, default stdin
50             ospf.dot output file, default stdout
51             EOF
52 6         513 exit(2);
53             }
54              
55             sub main() {
56 7     7   134 my %todo;
57             my $ipv6;
58 7         0 my $legend;
59             GetOptions(
60 0     0   0 '4' => sub { $ipv6 = 0 },
61 0     0   0 '6' => sub { $ipv6 = 1 },
62 1     1   1174 'b' => sub { $todo{boundary}{generate} = 1 },
63 2     2   164 'B' => sub { $todo{boundary}{aggregate} = 1 },
64 1     1   778 'c' => sub { $todo{cluster} = 1 },
65 1     1   1096 'e' => sub { $todo{external}{generate} = 1 },
66 2     2   158 'E' => sub { $todo{external}{aggregate} = 1 },
67 1     1   763 'h' => sub { usage() },
68             'l' => \$legend,
69 1     1   1202 'p' => sub { $todo{prefix}{generate} = 1 },
70 1     1   88 'P' => sub { $todo{prefix}{aggregate} = 1 },
71 1     1   1023 's' => sub { $todo{summary}{generate} = 1 },
72 2     2   155 'S' => sub { $todo{summary}{aggregate} = 1 },
73 1     1   1170 'w' => sub { $todo{warning}{single} = 1 },
74 1     1   86 'W' => sub { $todo{warning}{all} = 1 },
75 0     0   0 'v' => sub { $todo{verbose} = 1 },
76 7 50       178 ) or usage("Bad option");
77 6 50       271 usage("Only two arguments allowed") if @ARGV > 2;
78              
79 6         22 foreach my $option (qw(boundary external prefix summary warning)) {
80 20 100       49 if (keys %{$todo{$option} || {}} > 1) {
  20 100       499  
81 5         23 my $opt = substr($option, 0, 1);
82 5         36 usage("Options -$opt and -".uc($opt)." used together");
83             }
84             }
85              
86 1 50       3 if ($todo{prefix}) {
87 0         0 $todo{intra}{generate} = 1;
88 0 0       0 $todo{link}{generate} = 1 if $todo{prefix}{generate};
89             }
90              
91 1 50       2 if ($legend) {
92 0 0       0 my $class = $ipv6 ? 'OSPF::LSDB::View6' : 'OSPF::LSDB::View';
93 0         0 print $class->legend();
94 0         0 exit 0;
95             }
96              
97 1         7 my $yaml = OSPF::LSDB::YAML->new();
98 1 50       3 if (@ARGV > 0) {
99 1         4 $yaml->LoadFile($ARGV[0]);
100             } else {
101 0         0 local $/;
102 0         0 $yaml->Load();
103             }
104              
105 1 50 33     867 if (defined $ipv6 && $ipv6 != $yaml->ipv6) {
106 0         0 die "Address family of yaml file does not match -4 and -6 options.\n";
107             }
108 1 50       41 my $class = $yaml->ipv6 ? 'OSPF::LSDB::View6' : 'OSPF::LSDB::View';
109 1         11 my $view = $class->new($yaml);
110 1         7 my $dot = $view->graph(%todo);
111 1 50       4 if ($todo{verbose}) {
112 0         0 my @errors = $view->get_errors;
113 0 0       0 warn map { "$_\n" } @errors if @errors;
  0         0  
114             }
115 1 50       4 if (@ARGV > 1) {
116 1         6 write_file($ARGV[1], $dot);
117             } else {
118 0           print $dot;
119             }
120             }
121              
122             main();