153 lines
5.2 KiB
Perl
153 lines
5.2 KiB
Perl
package App::NetdiscoX::Web::Plugin::RANCID;
|
|
|
|
our $VERSION = '2.004000';
|
|
|
|
use Dancer ':syntax';
|
|
|
|
use App::Netdisco::Web::Plugin;
|
|
use App::Netdisco::Util::Device 'get_device';
|
|
use App::Netdisco::Util::Permission 'check_acl';
|
|
|
|
use File::ShareDir 'dist_dir';
|
|
register_template_path(
|
|
dist_dir( 'App-NetdiscoX-Web-Plugin-RANCID' ));
|
|
|
|
register_device_details({
|
|
name => 'rancid',
|
|
label => 'RANCID',
|
|
default => 'on',
|
|
});
|
|
|
|
hook 'before_template' => sub {
|
|
return unless
|
|
index(request->path, uri_for('/ajax/content/device/details')->path) == 0;
|
|
|
|
my $config = config;
|
|
my $tokens = shift;
|
|
my $device = $tokens->{d};
|
|
my $domain_suffix = setting('domain_suffix') || '';
|
|
|
|
# defaults
|
|
$tokens->{rancidgroup} = '';
|
|
$tokens->{ranciddevice} = ($device->{dns} || $device->{name} || $device->{ip});
|
|
|
|
return unless exists $config->{rancid};
|
|
my $rancid = $config->{rancid};
|
|
|
|
$rancid->{groups} ||= {};
|
|
$rancid->{by_ip} ||= [];
|
|
$rancid->{by_hostname} ||= [];
|
|
|
|
foreach my $g (keys %{ $rancid->{groups} }) {
|
|
if (check_acl( get_device($device->{ip}), $rancid->{groups}->{$g} )) {
|
|
$tokens->{rancidgroup} = $g;
|
|
$tokens->{ranciddevice} = $device->{ip}
|
|
if 0 < scalar grep {$_ eq $g} @{ $rancid->{by_ip} };
|
|
$tokens->{ranciddevice} =~ s/$domain_suffix$//
|
|
if 0 < scalar grep {$_ eq $g} @{ $rancid->{by_hostname} };
|
|
last;
|
|
}
|
|
}
|
|
};
|
|
|
|
=head1 NAME
|
|
|
|
App::NetdiscoX::Web::Plugin::RANCID - Link to device backups in RANCID/WebSVN
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
# in your ~/environments/deployment.yml file
|
|
|
|
extra_web_plugins:
|
|
- X::RANCID
|
|
|
|
plugin_rancid:
|
|
location: 'https://websvn-server.example.com/rancid/%DEVICE%'
|
|
|
|
=head1 Description
|
|
|
|
This is a plugin for the L<App::Netdisco> network management application.
|
|
It adds a row to the Device Details page named "RANCID" with a link to
|
|
your local RANCID/WebSVN installation hosting the device configuation
|
|
backups.
|
|
|
|
=head1 Configuration
|
|
|
|
Create an entry in your C<~/environments/deployment.yml> file named
|
|
"C<plugin_rancid>", containing the following settings:
|
|
|
|
=head2 location
|
|
|
|
Value: String, Required.
|
|
|
|
Name of the server hosting your local WebSVN installation. This should
|
|
also include the path under which backup files are stored for the devices.
|
|
|
|
The text "C<%DEVICE%>" B<must> be included, and it will be substituted with
|
|
the name or IP of the device. That is, this setting must be a complete link to
|
|
a RANCID web page, only with the device name or ip changed to be
|
|
"C<%DEVICE%>".
|
|
|
|
The text "C<%GROUP%>" will be replaced with the group name for this device, if
|
|
known to Netdisco. This uses the same configuration as for
|
|
L<netdisco-rancid-export>, an example of which is below:
|
|
|
|
rancid:
|
|
by_ip: [ other ]
|
|
by_hostname: [ other2 ]
|
|
groups:
|
|
switch: [ 'name:.*[Ss][Ww].*' ]
|
|
rtr: [ 'name:[rR]tr.*' ]
|
|
ap: [ 'name:[aA][pP].*' ]
|
|
|
|
Briefly, each group value is a list of rules for matching devices similar to
|
|
those used by any C<*_only> configuration item. You can provide an IP, subnet
|
|
or prefix, regular expression to match a device name, or device attribute and
|
|
regular expression as in the above example.
|
|
|
|
The device DNS name is used, or if missing the device SNMP sysName. Adding the
|
|
group to the list in C<by_ip> will make the link include the device IP
|
|
instead of the name. Adding the group to the list in C<by_hostname> will
|
|
use the device FQDN minus the C<domain_suffix> config item (i.e. the hostname).
|
|
|
|
=head2 open_in_same_window
|
|
|
|
Value: Boolean. Default: false.
|
|
|
|
If set to true, the hyperlink is configured to open the WebSVN page in the
|
|
same browser window or tab as Netdisco.
|
|
|
|
=head1 AUTHOR
|
|
|
|
Oliver Gorwits <oliver@cpan.org>
|
|
|
|
=head1 COPYRIGHT AND LICENSE
|
|
|
|
This software is copyright (c) 2013 by The Netdisco Developer Team.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions are met:
|
|
* Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
* Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
* Neither the name of the Netdisco Project nor the
|
|
names of its contributors may be used to endorse or promote products
|
|
derived from this software without specific prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
DISCLAIMED. IN NO EVENT SHALL THE NETDISCO DEVELOPER TEAM BE LIABLE FOR ANY
|
|
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
=cut
|
|
|
|
true;
|