diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/nms/util.pm | 137 | 
1 files changed, 137 insertions, 0 deletions
diff --git a/include/nms/util.pm b/include/nms/util.pm new file mode 100644 index 0000000..e1ebaa3 --- /dev/null +++ b/include/nms/util.pm @@ -0,0 +1,137 @@ +#! /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 = ( +		'name' => "$switch", +		'subnet4' => "$subnet4", +		'subnet6' => "$subnet6", +		'mgtmt4' => "$mgtmt4", +		'mgtmt6' => "$mgtmt6", +		'lolid' => "$lolid", +		'distro' => "$distro" +	); +	%{$ret{'placement_guess'}} = 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($_); +		%{$switches{$switch{'name'}}} = %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($_); +		%{$switches{$switch{'name'}}} = %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(232 + (($e-1)/2) * 31.1); +		$y = undef; + +		$x += 14 if ($e >= 17); +		$x += 14 if ($e >= 29); +		$x += 14 if ($e >= 45); +		$x += 14 if ($e >= 63); + +		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 "e11-1"; + +		#$yy -= 14 if $name eq "e77-1"; +		#$yy -= 28 if $name eq "e79-1"; +		#$yy -= 15 if $name eq "e81-1"; +		#$yy -= 56 if $name eq "e83-1"; +	} elsif ($name =~ /^sw(\d+)-creativia$/) { +		my ($s) = ($1); +		$src = "creativia"; +		$x = 1535; +		$y = int(130 + 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 = 1023 + 45 * $n; +		$y = int(329 + 20.5 * $s); +		$xx = $x + 45; +		$yy = $y + 14; + +		if ($s == 1 && $n == 1) { +			$xx += 25; +		} +	} 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; +}  | 
