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;
 |