1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
#! /usr/bin/perl
use strict;
use warnings;
package nms::util;
use Data::Dumper;
use base 'Exporter';
our @EXPORT = qw(guess_placement parse_switches_txt parse_switches parse_switch);
# Parse a single switches.txt-formatted switch
sub parse_switch {
my ($switch, $subnet4, $subnet6, $mgtmt4, $mgtmt6, $lolid, $distro) = split(/ /);
my %foo = guess_placement($switch);
my %ret = (
'sysname' => "$switch",
'subnet4' => "$subnet4",
'subnet6' => "$subnet6",
'mgmt_v4_addr' => "$mgtmt4",
'mgmt_v6_addr' => "$mgtmt6",
'traffic_vlan' => "$lolid",
'distro' => "$distro"
);
%{$ret{'placement'}} = guess_placement($switch);
return %ret;
}
# Parses a switches_txt given as a filehandle on $_[0]
# (e.g.: parse_switches_txt(*STDIN) or parse_switches_txt(whatever).
sub parse_switches_txt {
my $fh = $_[0];
my @switches;
while(<$fh>) {
chomp;
my %switch = parse_switch($_);
push @switches, {%switch};
}
return @switches;
}
# Parses switches in switches.txt format given as $_[0].
# E.g: parse_switches("e1-3 88.92.0.0/26 2a06:5840:0a::/64 88.92.54.2/26 2a06:5840:54a::2/64 1013 distro0")
sub parse_switches {
my @switches;
my $txt = $_[0];
foreach (split("\n",$txt)) {
chomp;
my %switch = parse_switch($_);
push @switches, {%switch};
}
return @switches;
}
# Guesses placement from name to get a starting point
# Largely courtesy of Knuta
sub guess_placement {
my ($x, $y, $xx, $yy);
my $name = $_[0];
my $src = "unknown";
if ($name =~ /^e\d+-\d+$/) {
$name =~ /e(\d+)-(\d+)/;
my ($e, $s) = ($1, $2);
$src = "main";
$x = int(292 + (($e-1)/2) * 31.1);
$y = undef;
$x += 14 if ($e >= 13);
$x += 14 if ($e >= 25);
$x += 14 if ($e >= 41);
$x += 14 if ($e >= 59);
if ($s > 2) {
$y = 405 - 120 * ($s-2);
} else {
$y = 689 - 120 * ($s);
}
$xx = $x + 16;
$yy = $y + 120;
# Justeringer
$y += 45 if $name eq "e1-4";
$y += 20 if $name eq "e3-4";
$y += 15 if $name eq "e5-4";
$yy -= 25 if $name eq "e7-1";
$y += 10 if $name eq "e5-2";
$yy -= 25 if $name eq "e5-2";
$y += 20 if ($e >= 81 and $s == 2);
$yy -= 20 if ($e >= 79 and $s == 1);
$yy -= 30 if ($e >= 81 and $s == 1);
} elsif ($name =~ /^creativia(\d+)$/) {
my ($s) = ($1);
$src = "creativia";
$x = 1535;
$y = int(160 + 32.2 * $s);
$yy = $y + 20;
if ($s == 1) {
$xx = $x + 70;
} elsif ($s == 2) {
$xx = $x + 90;
} elsif ($s == 3) {
$xx = $x + 102;
} else {
$xx = $x + 142;
}
} elsif ($name =~ /^crew(\d+)-(\d+)$/) {
my ($s, $n) = ($1, $2);
$src = "crew";
$x = 550 + 65 * $n;
$y = int(759 + 20.5 * $s);
$xx = $x + 65;
$yy = $y + 14;
} elsif ($name =~ /^distro(\d)/) {
my $d = ($1);
$src = "distro";
$x = 292 + $d * 165;
$y = 415;
$xx = $x + 130;
$yy = $y + 20;
} else {
# Fallback to have _some_ position
$src = "random";
$x = int(rand(500));
$y = int(rand(500));
$xx = $x + 20;
$yy = $y + 130;
};
my %box = (
'src' => "$src",
'x1' => $x,
'y1' => $y,
'xx' => $xx,
'yy' => $yy
);
return %box;
}
|