Squashed commit of the following: commit 25bc026dc5e0177cd3aa81c11cdace091eb68f36 Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Jun 17 08:16:56 2013 +0100 bump version for new release commit d4042f6e8db42c7a85df4dcf9690fec72ad2db69 Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 18:27:52 2013 +0100 Job Queue page play/pause/refresh controls commit b6c9152516d7800409b7a73c5d0cdce6dd405492 Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 17:50:06 2013 +0100 limit size of job queue table commit ac9e5feb8b774071fcf4423dd862dced74dee9e6 Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 17:47:55 2013 +0100 update bugs link commit 9c0fb0e9aedc6297f4462c3cf88343f6d0df40b6 Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 17:41:29 2013 +0100 update MANIFEST commit 7aaa2fff91ed2b1839bdbb79081d90ad3e144f47 Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 17:40:35 2013 +0100 Fix Plack middleware config for Expiry commit 313e2cf014cf0da7cf85074e390ad394b28bf42d Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 17:23:00 2013 +0100 Support for delegated authentication with REMOTE_USER and X-REMOTE_USER commit 85e21f2bf296c4a5ca6b5afb5091694e56e3031f Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 14:24:08 2013 +0100 Add tooltip showing the job queue item logged status message commit 9b14f53ebed51eb46ea278807cfe8a2fbd28743c Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 13:43:26 2013 +0100 Increase default frequency of job queue polling to 2 seconds commit 6ba46818d8ab2100c652c8eb8e98bc6f5a54e273 Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 12:57:43 2013 +0100 workaround for https://github.com/PerlDancer/Dancer/issues/935 commit c7a2d8a9d45716959bedbbb8db4cdd82a5950642 Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Jun 16 11:54:18 2013 +0100 Fix hyperlinks when running behind reverse proxy on custom path commit 0620efa404bc25cb0a9ada5aa6f1b092d5c4d482 Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Jun 15 18:31:19 2013 +0100 update deploy docs commit 857b1c7aa0fe832f8948349eda5211eb38ba3099 Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Jun 15 18:16:50 2013 +0100 add note about compiler dependency commit 02a2ad6b2c52db9fbc1e24bc8888f658dc7084ad Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Jun 15 17:44:29 2013 +0100 sort vlans, macs, ips in device port view commit 097bad77310728a98b261a2cfca4de7ab50be94b Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Jun 15 16:32:20 2013 +0100 hint when calling web in fg without starman commit 6425d89ddb2b56129c610482134482d8f9455d40 Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Jun 15 15:53:26 2013 +0100 macwalk and arpwalk refactored commit d527b9d05addc82fb38c84f6fea1aa5818fc68d5 Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Jun 13 22:27:34 2013 +0100 implement is_macsuckable and is_arpnipable commit 7af10ed313e25f5d99a22b53ba438225c2259069 Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Jun 13 22:17:39 2013 +0100 version bump commit 8ace3bf8fa48cf3e14bdf86fad5a4862aad50a4b Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Jun 13 22:14:05 2013 +0100 tidy up user menu commit e6eef605c248471dbfe7ec62cd04d73d653523ca Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Jun 13 22:02:52 2013 +0100 Add discoverall, macwalk, arpwalk items to the Admin Tasks menu commit 2631fabd1eccd8a3971e4762eebe57f406623bee Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Jun 13 21:21:50 2013 +0100 remove length() which only became sane in 5.12 commit a7b7169070a58685cacde26a3b6d462e74be9928 Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Jun 13 19:07:56 2013 +0100 Use DBIx::Class new collapsed query support when we can commit 77cddab8ba7033ccb1ecae257bafa4eef8f99f47 Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Jun 12 17:26:47 2013 +0100 Database config simplified to only four essential settings commit 6ed0802bf2ab0fd898ce6945451b8ca6566ae551 Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Jun 12 13:03:20 2013 +0100 Ask to set up guest user for Admin/Port Control rights in deploy script
263 lines
6.6 KiB
Perl
263 lines
6.6 KiB
Perl
package App::Netdisco::Web::Plugin;
|
|
|
|
use Dancer ':syntax';
|
|
use Dancer::Plugin;
|
|
|
|
set(
|
|
'_additional_css' => [],
|
|
'_additional_javascript' => [],
|
|
'_extra_device_port_cols' => [],
|
|
'_navbar_items' => [],
|
|
'_search_tabs' => [],
|
|
'_device_tabs' => [],
|
|
'_admin_tasks' => {},
|
|
'_reports_menu' => {},
|
|
'_reports' => {},
|
|
'_report_order' => [qw/Device Port Node VLAN Network Wireless/],
|
|
);
|
|
|
|
# this is what Dancer::Template::TemplateToolkit does by default
|
|
config->{engines}->{template_toolkit}->{INCLUDE_PATH} ||= [ setting('views') ];
|
|
|
|
register 'register_template_path' => sub {
|
|
my ($self, $path) = plugin_args(@_);
|
|
|
|
if (!$path) {
|
|
return error "bad template path to register_template_paths";
|
|
}
|
|
|
|
unshift
|
|
@{ config->{engines}->{template_toolkit}->{INCLUDE_PATH} },
|
|
$path;
|
|
};
|
|
|
|
sub _register_include {
|
|
my ($type, $plugin) = @_;
|
|
|
|
if (!$type) {
|
|
return error "bad type to _register_include";
|
|
}
|
|
|
|
if (!$plugin) {
|
|
return error "bad plugin name to register_$type";
|
|
}
|
|
|
|
push @{ setting("_additional_$type") }, $plugin;
|
|
}
|
|
|
|
register 'register_css' => sub {
|
|
my ($self, $plugin) = plugin_args(@_);
|
|
_register_include('css', $plugin);
|
|
};
|
|
|
|
register 'register_javascript' => sub {
|
|
my ($self, $plugin) = plugin_args(@_);
|
|
_register_include('javascript', $plugin);
|
|
};
|
|
|
|
register 'register_device_port_column' => sub {
|
|
my ($self, $config) = plugin_args(@_);
|
|
$config->{default} ||= '';
|
|
$config->{position} ||= 'right';
|
|
|
|
if (!$config->{name} or !$config->{label}) {
|
|
return error "bad config to register_device_port_column";
|
|
}
|
|
|
|
foreach my $item (@{ setting('_extra_device_port_cols') }) {
|
|
if ($item->{name} eq $config->{name}) {
|
|
$item = $config;
|
|
return;
|
|
}
|
|
}
|
|
|
|
push @{ setting('_extra_device_port_cols') }, $config;
|
|
};
|
|
|
|
register 'register_navbar_item' => sub {
|
|
my ($self, $config) = plugin_args(@_);
|
|
|
|
if (!$config->{tag}
|
|
or !$config->{path}
|
|
or !$config->{label}) {
|
|
|
|
return error "bad config to register_navbar_item";
|
|
}
|
|
|
|
foreach my $item (@{ setting('_navbar_items') }) {
|
|
if ($item->{tag} eq $config->{tag}) {
|
|
$item = $config;
|
|
return;
|
|
}
|
|
}
|
|
|
|
push @{ setting('_navbar_items') }, $config;
|
|
};
|
|
|
|
register 'register_admin_task' => sub {
|
|
my ($self, $config) = plugin_args(@_);
|
|
|
|
if (!$config->{tag}
|
|
or !$config->{label}) {
|
|
|
|
return error "bad config to register_admin_task";
|
|
}
|
|
|
|
setting('_admin_tasks')->{ $config->{tag} } = $config;
|
|
};
|
|
|
|
sub _register_tab {
|
|
my ($nav, $config) = @_;
|
|
my $stash = setting("_${nav}_tabs");
|
|
|
|
if (!$config->{tag}
|
|
or !$config->{label}) {
|
|
|
|
return error "bad config to register_${nav}_item";
|
|
}
|
|
|
|
foreach my $item (@{ $stash }) {
|
|
if ($item->{tag} eq $config->{tag}) {
|
|
$item = $config;
|
|
return;
|
|
}
|
|
}
|
|
|
|
push @{ $stash }, $config;
|
|
}
|
|
|
|
register 'register_search_tab' => sub {
|
|
my ($self, $config) = plugin_args(@_);
|
|
_register_tab('search', $config);
|
|
};
|
|
|
|
register 'register_device_tab' => sub {
|
|
my ($self, $config) = plugin_args(@_);
|
|
_register_tab('device', $config);
|
|
};
|
|
|
|
register 'register_report' => sub {
|
|
my ($self, $config) = plugin_args(@_);
|
|
my @categories = @{ setting('_report_order') };
|
|
|
|
if (!$config->{category}
|
|
or !$config->{tag}
|
|
or !$config->{label}
|
|
or 0 == scalar grep {$config->{category} eq $_} @categories) {
|
|
|
|
return error "bad config to register_report";
|
|
}
|
|
|
|
foreach my $item (@{setting('_reports_menu')->{ $config->{category} }}) {
|
|
if ($item eq $config->{tag}) {
|
|
setting('_reports')->{$config->{tag}} = $config;
|
|
return;
|
|
}
|
|
}
|
|
|
|
push @{setting('_reports_menu')->{ $config->{category} }}, $config->{tag};
|
|
setting('_reports')->{$config->{tag}} = $config;
|
|
};
|
|
|
|
register_plugin;
|
|
true;
|
|
|
|
=head1 NAME
|
|
|
|
App::Netdisco::Web::Plugin - Netdisco Web UI components
|
|
|
|
=head1 Introduction
|
|
|
|
L<App::Netdisco>'s plugin system allows you more control of what Netdisco
|
|
components are displayed in the web interface. Plugins can be distributed
|
|
independently from Netdisco and are a better alternative to source code
|
|
patches.
|
|
|
|
The following web interface components are implemented as plugins:
|
|
|
|
=over 4
|
|
|
|
=item *
|
|
|
|
Navigation Bar items (e.g. Inventory link)
|
|
|
|
=item *
|
|
|
|
Tabs for Search and Device pages
|
|
|
|
=item *
|
|
|
|
Reports (pre-canned searches)
|
|
|
|
=item *
|
|
|
|
Additional Device Port Columns
|
|
|
|
=item *
|
|
|
|
Admin Menu function (job control, manual topology, pseudo devices)
|
|
|
|
=back
|
|
|
|
This document explains how to configure which plugins are loaded. See
|
|
L<App::Netdisco::Manual::WritingPlugins> if you want to develop new plugins.
|
|
|
|
=head1 Application Configuration
|
|
|
|
Netdisco configuration supports a C<web_plugins> directive along with the
|
|
similar C<extra_web_plugins>. These list, in YAML format, the set of Perl
|
|
module names which are the plugins to be loaded. Each item injects one part of
|
|
the Netdisco web user interface.
|
|
|
|
You can override these settings to add, change, or remove entries from the
|
|
default lists. Here is an example of the C<web_plugins> list:
|
|
|
|
web_plugins:
|
|
- Inventory
|
|
- Report::DuplexMismatch
|
|
- Search::Device
|
|
- Search::Node
|
|
- Search::Port
|
|
- Device::Details
|
|
- Device::Ports
|
|
|
|
Any change should go into your local C<deployment.yml> configuration file. If
|
|
you want to view the default settings, see the C<share/config.yml> file in the
|
|
C<App::Netdisco> distribution.
|
|
|
|
=head1 How to Configure
|
|
|
|
The C<extra_web_plugins> setting is empty, and used only if you want to add
|
|
new plugins but not change the set enabled by default. If you do want to add
|
|
to or remove from the default set, then create a version of C<web_plugins>
|
|
instead.
|
|
|
|
Netdisco prepends "C<App::Netdisco::Web::Plugin::>" to any entry in the list.
|
|
For example, "C<Inventory>" will load the
|
|
C<App::Netdisco::Web::Plugin::Inventory> module.
|
|
|
|
Such plugin modules can either ship with the App::Netdisco distribution
|
|
itself, or be installed separately. Perl uses the standard C<@INC> path
|
|
searching mechanism to load the plugin modules.
|
|
|
|
If an entry in the list starts with a "C<+>" (plus) sign then Netdisco attemps
|
|
to load the module as-is, without prepending anything to the name. This allows
|
|
you to have App::Netdiso web UI plugins in other namespaces:
|
|
|
|
web_plugins:
|
|
- Inventory
|
|
- Search::Device
|
|
- Device::Details
|
|
- +My::Other::Netdisco::Web::Component
|
|
|
|
The order of the entries is significant. Unsurprisingly, the modules are
|
|
loaded in order. Therefore Navigation Bar items appear in the order listed,
|
|
and Tabs appear on the Search and Device pages in the order listed, and so on.
|
|
|
|
Finally, you can also prepend module names with "C<X::>", to support the
|
|
"Netdisco extension" namespace. For example, "C<X::Observium>" will load the
|
|
L<App::NetdiscoX::Web::Plugin::Observium> module.
|
|
|
|
=cut
|
|
|