From e700b41fa698e40283c7cdc4bce98d857eb65e44 Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Sun, 22 Jun 2014 17:26:38 +0100 Subject: [PATCH] VendorMap and Delimiter enhancements to RANCID generator (LesB) --- Netdisco/Changes | 1 + Netdisco/bin/netdisco-rancid-export | 40 ++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Netdisco/Changes b/Netdisco/Changes index 9346fb73..25c59c27 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -12,6 +12,7 @@ * Link to VLAN search by name from VLAN Inventory report * Neighbor device links to both device and port (fragfutter) * Optimization of multiple SQL queries to improve report performance + * VendorMap and Delimiter enhancements to RANCID generator (LesB) [BUG FIXES] diff --git a/Netdisco/bin/netdisco-rancid-export b/Netdisco/bin/netdisco-rancid-export index 84a8bf81..578d6c91 100755 --- a/Netdisco/bin/netdisco-rancid-export +++ b/Netdisco/bin/netdisco-rancid-export @@ -43,8 +43,10 @@ use Dancer::Plugin::DBIC 'schema'; use App::Netdisco::Util::Permission ':all'; my $settings = setting( 'rancid' ); +my $delimiter = $settings->{ 'delimiter' } || ':'; my $down_age = $settings->{ 'down_age' } || '1 day'; my $rancidhome = $settings->{ 'rancid_home' } || '/var/lib/rancid'; +my $config_vendormap = $settings->{ 'vendormap' } || {}; my $by_ip = {}; foreach my $g (@{$settings->{ 'by_ip' }}) { $by_ip->{$g} = 1; @@ -75,22 +77,29 @@ foreach my $d (@devices) { my %VENDORMAP = ( # If netdisco vendor name and rancid vendor name # do not map 1:1, map it here. +# eg: +# 'dell:2024' => 'dellnseries', +# 'dell:3024' => 'dellnseries' ); - + foreach my $group (keys %$list) { open(ROUTER, ">${rancidhome}/${group}/router.db") || die "${rancidhome}/${group}/router.db: $!\n"; foreach my $dev (sort {$a->ip cmp $b->ip} @{$list->{$group}}) { my $vendor = $dev->vendor; + my $vendormodel = join(':',$dev->vendor,$dev->model); my $name; - if ($VENDORMAP{$vendor}) { - $vendor = $VENDORMAP{$vendor}; + if ( $VENDORMAP{$vendor} or $VENDORMAP{$vendormodel} ) { + $vendor = $VENDORMAP{$vendormodel} || $VENDORMAP{$vendor}; + } + if ( $config_vendormap->{$vendor} or $config_vendormap->{$vendormodel} ) { + $vendor = $config_vendormap{$vendormodel} || $config_vendormap{$vendor}; } if ($by_ip->{$group}) { $name = $dev->ip; } else { $name = ($dev->dns || $dev->name); } - printf ROUTER "%s:%s:%s\n", $name, $vendor, + printf ROUTER "%s$delimiter%s$delimiter%s\n", $name, $vendor, $dev->get_column( 'old' ) ? "down" : "up"; } close(ROUTER); @@ -108,11 +117,15 @@ This script requires some configuration to be added to your Netdisco rancid: rancid_home: /var/lib/rancid down_age: '1 day' + delimiter: ':' by_ip: [ other ] groups: switch: [ 'name:.*[Ss][Ww].*' ] rtr: [ 'name:[rR]tr.*' ] ap: [ 'name:[aA][pP].*' ] + vendormap: + "dell": force10 + "dell:2024": dellnseries Note that C is not part of the automatic scheduler built in to Netdisco. You should run this script via C just after your @@ -123,12 +136,31 @@ periodic C. The location to write RANCID Group configuration files into. A subdirectory for each Group will be created. +Default: "C". + =head2 C This should be the same or greater than the interval between regular discover jobs on your network. Devices which have not been discovered within this time will be marked as "C" to RANCID. +Default: "C<1 day>". + +=head2 C + +RANCID version 3 uses a semicolon as delimiter. Set this to the delimiter +character if needed to be different from the default. + +Default: "C<:>". + +=head2 C + +If the device Vendor in Netdisco is not the same as the RANCID vendor script, +configure a mapping here. The left hand side (key) should be the Netdisco +vendor, the right hand side (value) should be the RANCID vendor script name. +You can also set the Netdisco vendor to be "C" for fine-grained +control. See the synopsis for an example. + =head2 C This dictionary maps RANCID Group names with configuration which will match