diff --git a/Netdisco/Changes b/Netdisco/Changes index 7ee22be0..bb104f4b 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -6,6 +6,7 @@ * Also... a Scheduler which removes need for crontab installation * The netdisco-do script can run any one-off job * Select MAC Address display format on Node and Device Port search + * Helper script to import the Netdisco 1.x Topology file to the database [ENHANCEMENTS] diff --git a/Netdisco/bin/nd-import-topology b/Netdisco/bin/nd-import-topology new file mode 100755 index 00000000..f549fef7 --- /dev/null +++ b/Netdisco/bin/nd-import-topology @@ -0,0 +1,91 @@ +#!/usr/bin/env perl + +use FindBin; +use lib "$FindBin::Bin/../lib"; +use App::Netdisco; + +use Dancer ':script'; +use Dancer::Plugin::DBIC 'schema'; + +use App::Netdisco::Util::Device 'get_device'; +use NetAddr::IP::Lite ':lower'; +use Try::Tiny; + +=head1 NAME + +nd-import-topology - Import a Nedisco 1.x Manual Topology File + +=head2 USAGE + + ./nd-import-topology /path/to/netdisco-topology.txt + +=head2 DESCRIPTION + +This helper script will read and import the content of a Netdisco 1.x format +Manual Topology file into the Netdisco 2.x database's C table. + +It's safe to run the script multiple times on the same file - any new data +will be imported. + +The file syntax must be like so: + + left-device + link:left-port,right-device,right-port + +The devices can be either host names or IPs. Data will be imported even if the +devices are currently unknown to Netdisco. + +=cut + +my $file = $ARGV[0]; +die "missing topology file name on command line\n" unless $file; + +chomp $file; +my $dev = undef; # current device +print "Loading topology information from $file\n"; + +open (DEVS,'<', $file) + or die "topo_load_file($file): $!\n"; + +while (my $line = ) { + chomp $line; + $line =~ s/(?txn_do(sub { + schema('netdisco')->resultset('Topology')->create({ + dev1 => $dev, + port1 => $from_port, + dev2 => get_device($to)->ip, + port2 => $to_port, + }); + }); + }; + } + elsif ($line =~ /^alias:(.*)/) { + # ignore aliases + } + else { + my $ip = NetAddr::IP::Lite->new($line) + or next; + next if $ip->addr eq '0.0.0.0'; + + $dev = get_device($ip->addr)->ip; + print " Set device: $dev\n"; + } +} + +close (DEVS); diff --git a/TODO b/TODO index 333f90ae..822a86e0 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ FRONTEND ======== -* import/slurp legacy topo file * UI for topo DB table editing * No devices - trigger first discover splash page * view job queue