also link to manual topology from device ports fix tooltip reinit on datatables paging Squashed commit of the following: commit85d52ed174Merge:66e3536607446ed7Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 31 08:59:19 2017 +0000 Merge branch 'master' into og-newnetmap commit66e353669dAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 31 00:16:49 2017 +0000 add docs link commit809f1ede76Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 31 00:11:29 2017 +0000 node links to other devices commit187e1ea803Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 23:58:56 2017 +0000 add node infostring commit6453f99b28Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 23:41:19 2017 +0000 link infostrings! commitf3ba260142Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 22:42:09 2017 +0000 maxnoderadius is now based on dynamic size calc commit0af415e391Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 22:33:22 2017 +0000 fix to get aggregate ports in matching order on left and right side commit3f36121a4cAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 22:07:28 2017 +0000 initial aggregate link summing commite5b96b0781Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 14:55:00 2017 +0000 tidy and refactor commit79f22a47b3Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 13:42:58 2017 +0000 get rid of d3 v3/v4 and only have v3 commit18c3f16c8fAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 12:54:45 2017 +0000 fullscreen exit now works commit93f8181fc8Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 08:58:04 2017 +0000 implement show link speeds on links commit72961f172dAuthor: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 28 23:51:26 2017 +0000 add speed to retrieved devicelinks commitae5496310eAuthor: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 26 11:21:12 2017 +0000 remove annealing on label change commit885cb92bd3Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 26 11:15:21 2017 +0000 reorder options commit015a1debe0Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 26 11:11:01 2017 +0000 fix d3-force debug link messing up svg text elements commit10ccaa78b1Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 26 10:52:47 2017 +0000 show ips functionality; improvement to maximise icon; bugfix d3-force label wrap commit71a1a20909Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 25 13:21:23 2017 +0000 move labels on neighbor view commit9578215349Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 25 13:13:13 2017 +0000 force running spinner commit6618fba548Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 23:13:33 2017 +0000 fix neighbors pinning commit938848551eAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 18:12:04 2017 +0000 implement dynamic sizing option commite4b19be5d7Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 13:25:00 2017 +0000 zoom to device on neighbor show; do not save positions on neighbor show commit58b576b464Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 13:10:48 2017 +0000 better neighbors/save interaction commit2c77660f2fAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 13:03:46 2017 +0000 fix labels on checkboxes to be clickable commit2c2dc62cdaAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 12:50:26 2017 +0000 prevent save positions when in neighbor view mode commit78c558b5beAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 12:37:51 2017 +0000 add tooltip to show why host groups radio is disabled commit7000d4b0ebAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 12:12:29 2017 +0000 allow port control role to edit manual topology commit547d2934cbAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 12:09:40 2017 +0000 working save/restore node positions with groups commitbf7e231ffeAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 10:09:26 2017 +0000 node colors! commite23594b041Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 23:42:17 2017 +0000 wooo device group selection is working commitb1b22c9811Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 22:31:23 2017 +0000 send full query str from netmap for json commit9a13bb7f9bAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 22:06:24 2017 +0000 implement host_group_displaynames and fix vlan save bug commit35ed34ed2fAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 17:52:14 2017 +0000 when neighbors only can restrict the links search commitf9e5ec02abAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 17:44:41 2017 +0000 tweak mapshow commit9f9971ff4eAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 00:47:17 2017 +0000 better sidebar look and layout commit1def41da67Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 21 23:54:44 2017 +0000 sidebar with many options!! commit4203cbb225Merge:7c12df6b7db65932Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 21 20:14:55 2017 +0000 Merge branch 'master' into og-newnetmap commit7c12df6b83Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 21 00:13:03 2017 +0000 refresh tooltips when the datatables table is updated commit081b89d5dcAuthor: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 23:59:15 2017 +0000 shortcut from device port to manual topology commit9520438960Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 23:34:44 2017 +0000 tighten the sql for neighbor links commitd6b0275931Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 23:26:22 2017 +0000 tweak layout again commit9e5e2f0ed5Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 23:18:57 2017 +0000 fullscreen mode for netmap commitaba359d2a9Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 22:05:51 2017 +0000 save and load netmap positions for same device groups commitb7cd0251ffAuthor: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 19 23:24:47 2017 +0000 basic positions upload commit786115ebdaAuthor: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 19 22:13:16 2017 +0000 working group drag commit91f98d4f33Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 18 23:00:16 2017 +0000 drag all selected nodes commitba48eee5f7Merge:60412cd67f8e3edfAuthor: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 18 20:14:20 2017 +0000 Merge branch 'master' into og-newnetmap commit60412cd6e6Merge:39ca14917dc79f72Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 17 20:23:41 2017 +0000 Merge branch 'master' into og-newnetmap commit39ca1491b0Merge:69622582c8806beaAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 17 19:52:49 2017 +0000 Merge branch 'master' into og-newnetmap commit6962258223Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 17 19:52:26 2017 +0000 bleed versions commit444e82b8a3Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 16 15:33:41 2017 +0000 use d3 v4 only commit01cd7a908dAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 16 15:22:08 2017 +0000 two d3 connected commit854f37fc94Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 14 21:34:49 2017 +0000 more fiddling with d3 commit61a3a9e06dAuthor: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 14 19:15:21 2017 +0000 working worker commitebadebe69aAuthor: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 14 07:57:55 2017 +0000 borken worker commitc327b28513Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 13 13:45:03 2017 +0000 fix node center commit33bd9d39daAuthor: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 13 01:14:50 2017 +0000 improvements to graphing commit6178bf2298Merge:1c627eaf925940c9Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 12 23:44:48 2017 +0000 Merge branch 'master' into og-newnetmap commit1c627eaf3cMerge:77ca8f96000cbaa1Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 12 23:38:00 2017 +0000 Merge branch 'master' into og-newnetmap commit77ca8f96e1Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 11 00:09:08 2017 +0000 working rendering using d3-force plugin commit187265fc03Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 10 23:19:23 2017 +0000 initial work on moving to d3-force-apex-plugin - json data
		
			
				
	
	
		
			214 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| package App::Netdisco::Web;
 | ||
| 
 | ||
| use Dancer ':syntax';
 | ||
| use Dancer::Plugin::Ajax;
 | ||
| 
 | ||
| use Dancer::Plugin::DBIC;
 | ||
| use Dancer::Plugin::Auth::Extensible;
 | ||
| 
 | ||
| use URI ();
 | ||
| use Socket6 (); # to ensure dependency is met
 | ||
| use HTML::Entities (); # to ensure dependency is met
 | ||
| use URI::QueryParam (); # part of URI, to add helper methods
 | ||
| use Path::Class 'dir';
 | ||
| use Module::Load ();
 | ||
| use App::Netdisco::Util::Web 'interval_to_daterange';
 | ||
| 
 | ||
| use App::Netdisco::Web::AuthN;
 | ||
| use App::Netdisco::Web::Static;
 | ||
| use App::Netdisco::Web::Search;
 | ||
| use App::Netdisco::Web::Device;
 | ||
| use App::Netdisco::Web::Report;
 | ||
| use App::Netdisco::Web::AdminTask;
 | ||
| use App::Netdisco::Web::TypeAhead;
 | ||
| use App::Netdisco::Web::PortControl;
 | ||
| use App::Netdisco::Web::Statistics;
 | ||
| use App::Netdisco::Web::Password;
 | ||
| use App::Netdisco::Web::GenericReport;
 | ||
| 
 | ||
| sub _load_web_plugins {
 | ||
|   my $plugin_list = shift;
 | ||
| 
 | ||
|   foreach my $plugin (@$plugin_list) {
 | ||
|       $plugin =~ s/^X::/+App::NetdiscoX::Web::Plugin::/;
 | ||
|       $plugin = 'App::Netdisco::Web::Plugin::'. $plugin
 | ||
|         if $plugin !~ m/^\+/;
 | ||
|       $plugin =~ s/^\+//;
 | ||
| 
 | ||
|       $ENV{ND2_LOG_PLUGINS} && debug "loading web plugin $plugin";
 | ||
|       Module::Load::load $plugin;
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| if (setting('web_plugins') and ref [] eq ref setting('web_plugins')) {
 | ||
|     _load_web_plugins( setting('web_plugins') );
 | ||
| }
 | ||
| 
 | ||
| if (setting('extra_web_plugins') and ref [] eq ref setting('extra_web_plugins')) {
 | ||
|     unshift @INC, dir(($ENV{NETDISCO_HOME} || $ENV{HOME}), 'site_plugins')->stringify;
 | ||
|     _load_web_plugins( setting('extra_web_plugins') );
 | ||
| }
 | ||
| 
 | ||
| # after plugins are loaded, add our own template path
 | ||
| push @{ config->{engines}->{netdisco_template_toolkit}->{INCLUDE_PATH} },
 | ||
|      setting('views');
 | ||
| 
 | ||
| # any template paths in deployment.yml (should override plugins)
 | ||
| if (setting('template_paths') and ref [] eq ref setting('template_paths')) {
 | ||
|     push @{setting('template_paths')},
 | ||
|          dir(($ENV{NETDISCO_HOME} || $ENV{HOME}), 'nd-site-local', 'share')->stringify
 | ||
|       if (setting('site_local_files'));
 | ||
|     unshift @{ config->{engines}->{netdisco_template_toolkit}->{INCLUDE_PATH} },
 | ||
|       @{setting('template_paths')};
 | ||
| }
 | ||
| 
 | ||
| # load cookie key from database
 | ||
| setting('session_cookie_key' => undef);
 | ||
| my $sessions = schema('netdisco')->resultset('Session');
 | ||
| my $skey = $sessions->find({id => 'dancer_session_cookie_key'});
 | ||
| setting('session_cookie_key' => $skey->get_column('a_session')) if $skey;
 | ||
| Dancer::Session::Cookie::init(session);
 | ||
| 
 | ||
| # workaround for https://github.com/PerlDancer/Dancer/issues/935
 | ||
| hook after_error_render => sub { setting('layout' => 'main') };
 | ||
| 
 | ||
| # build list of port detail columns
 | ||
| {
 | ||
|   my @port_columns =
 | ||
|     sort { $a->{idx} <=> $b->{idx} }
 | ||
|     map  {{ name => $_, %{ setting('sidebar_defaults')->{'device_ports'}->{$_} } }}
 | ||
|     grep { $_ =~ m/^c_/ } keys %{ setting('sidebar_defaults')->{'device_ports'} };
 | ||
| 
 | ||
|   splice @port_columns, setting('device_port_col_idx_left'), 0,
 | ||
|     grep {$_->{position} eq 'left'}  @{ setting('_extra_device_port_cols') };
 | ||
|   splice @port_columns, setting('device_port_col_idx_mid'), 0,
 | ||
|     grep {$_->{position} eq 'mid'}   @{ setting('_extra_device_port_cols') };
 | ||
|   splice @port_columns, setting('device_port_col_idx_right'), 0,
 | ||
|     grep {$_->{position} eq 'right'} @{ setting('_extra_device_port_cols') };
 | ||
| 
 | ||
|   set('port_columns' => \@port_columns);
 | ||
| 
 | ||
|   # update sidebar_defaults so hooks scanning params see new plugin cols
 | ||
|   setting('sidebar_defaults')->{'device_ports'}->{ $_->{name} } = $_
 | ||
|     for @port_columns;
 | ||
| }
 | ||
| 
 | ||
| hook 'before' => sub {
 | ||
|   my $key = request->path;
 | ||
|   if (param('tab') and ($key !~ m/ajax/)) {
 | ||
|       $key .= ('/' . param('tab'));
 | ||
|   }
 | ||
|   $key =~ s|.*/(\w+)/(\w+)$|${1}_${2}|;
 | ||
|   var(sidebar_key => $key);
 | ||
| 
 | ||
|   # copy sidebar defaults into vars so we can mess about with it
 | ||
|   foreach my $sidebar (keys %{setting('sidebar_defaults')}) {
 | ||
|     vars->{'sidebar_defaults'}->{$sidebar} = { map {
 | ||
|       ($_ => setting('sidebar_defaults')->{$sidebar}->{$_}->{'default'})
 | ||
|     } keys %{setting('sidebar_defaults')->{$sidebar}} };
 | ||
|   }
 | ||
| };
 | ||
| 
 | ||
| hook 'before_template' => sub {
 | ||
|   # search or report from navbar, or reset of sidebar, can ignore params
 | ||
|   return if param('firstsearch')
 | ||
|     or var('sidebar_key') !~ m/^\w+_\w+$/;
 | ||
| 
 | ||
|   # update defaults to contain the passed url params
 | ||
|   # (this follows initial copy from config.yml, then cookie restore)
 | ||
|   var('sidebar_defaults')->{var('sidebar_key')}->{$_} = param($_)
 | ||
|     for keys %{ var('sidebar_defaults')->{var('sidebar_key')} || {} };
 | ||
| };
 | ||
| 
 | ||
| hook 'before_template' => sub {
 | ||
|     my $tokens = shift;
 | ||
| 
 | ||
|     # allow portable static content
 | ||
|     $tokens->{uri_base} = request->base->path
 | ||
|         if request->base->path ne '/';
 | ||
| 
 | ||
|     # allow portable dynamic content
 | ||
|     $tokens->{uri_for} = sub { uri_for(@_)->path_query };
 | ||
| 
 | ||
|     # current query string to all resubmit from within ajax template
 | ||
|     my $queryuri = URI->new();
 | ||
|     $queryuri->query_param($_ => param($_))
 | ||
|       for grep {$_ ne 'return_url'} keys %{params()};
 | ||
|     $tokens->{my_query} = $queryuri->query();
 | ||
| 
 | ||
|     # access to logged in user's roles
 | ||
|     $tokens->{user_has_role}  = sub { user_has_role(@_) };
 | ||
| 
 | ||
|     # create date ranges from within templates
 | ||
|     $tokens->{to_daterange}  = sub { interval_to_daterange(@_) };
 | ||
| 
 | ||
|     # data structure for DataTables records per page menu
 | ||
|     $tokens->{table_showrecordsmenu} =
 | ||
|       to_json( setting('table_showrecordsmenu') );
 | ||
| 
 | ||
|     # linked searches will use these default url path params
 | ||
|     foreach my $sidebar_key (keys %{ var('sidebar_defaults') }) {
 | ||
|         my ($mode, $report) = ($sidebar_key =~ m/(\w+)_(\w+)/);
 | ||
|         if ($mode =~ m/^(?:search|device)$/) {
 | ||
|             $tokens->{$sidebar_key} = uri_for("/$mode", {tab => $report});
 | ||
|         }
 | ||
|         elsif ($mode =~ m/^report$/) {
 | ||
|             $tokens->{$sidebar_key} = uri_for("/$mode/$report");
 | ||
|         }
 | ||
| 
 | ||
|         foreach my $col (keys %{ var('sidebar_defaults')->{$sidebar_key} }) {
 | ||
|             $tokens->{$sidebar_key}->query_param($col,
 | ||
|               var('sidebar_defaults')->{$sidebar_key}->{$col});
 | ||
|         }
 | ||
| 
 | ||
|         # fix Plugin Template Variables to be only path+query
 | ||
|         $tokens->{$sidebar_key} = $tokens->{$sidebar_key}->path_query;
 | ||
|     }
 | ||
| 
 | ||
|     # helper from NetAddr::MAC for the MAC formatting
 | ||
|     $tokens->{mac_format_call} = 'as_'. lc(param('mac_format'))
 | ||
|       if param('mac_format');
 | ||
| 
 | ||
|     # allow very long lists of ports
 | ||
|     $Template::Directive::WHILE_MAX = 10_000;
 | ||
| 
 | ||
|     # allow hash keys with leading underscores
 | ||
|     $Template::Stash::PRIVATE = undef;
 | ||
| };
 | ||
| 
 | ||
| # remove empty lines from CSV response
 | ||
| # this makes writing templates much more straightforward!
 | ||
| hook 'after' => sub {
 | ||
|     my $r = shift; # a Dancer::Response
 | ||
| 
 | ||
|     if ($r->content_type and $r->content_type eq 'text/comma-separated-values') {
 | ||
|         my @newlines = ();
 | ||
|         my @lines = split m/\n/, $r->content;
 | ||
| 
 | ||
|         foreach my $line (@lines) {
 | ||
|             push @newlines, $line if $line !~ m/^\s*$/;
 | ||
|         }
 | ||
| 
 | ||
|         $r->content(join "\n", @newlines);
 | ||
|     }
 | ||
| };
 | ||
| 
 | ||
| any qr{.*} => sub {
 | ||
|     var('notfound' => true);
 | ||
|     status 'not_found';
 | ||
|     template 'index';
 | ||
| };
 | ||
| 
 | ||
| {
 | ||
|   # https://github.com/PerlDancer/Dancer/issues/967
 | ||
|   no warnings 'redefine';
 | ||
|   *Dancer::_redirect = sub {
 | ||
|       my ($destination, $status) = @_;
 | ||
|       my $response = Dancer::SharedData->response;
 | ||
|       $response->status($status || 302);
 | ||
|       $response->headers('Location' => $destination);
 | ||
|   };
 | ||
| }
 | ||
| 
 | ||
| true;
 |