diff --git a/Netdisco/lib/App/Netdisco/DB/Result/Virtual/ApRadioChannelPower.pm b/Netdisco/lib/App/Netdisco/DB/Result/Virtual/ApRadioChannelPower.pm new file mode 100644 index 00000000..30707c1b --- /dev/null +++ b/Netdisco/lib/App/Netdisco/DB/Result/Virtual/ApRadioChannelPower.pm @@ -0,0 +1,54 @@ +package App::Netdisco::DB::Result::Virtual::ApRadioChannelPower; + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +__PACKAGE__->table_class('DBIx::Class::ResultSource::View'); + +__PACKAGE__->table('ap_radio_channel_power'); +__PACKAGE__->result_source_instance->is_virtual(1); +__PACKAGE__->result_source_instance->view_definition(<add_columns( + 'device_name' => { + data_type => 'text', + }, + 'ip' => { + data_type => 'inet', + }, + 'dns' => { + data_type => 'text', + }, + 'model' => { + data_type => 'text', + }, + 'location' => { + data_type => 'text', + }, + 'port' => { + data_type => 'text', + }, + 'port_name' => { + data_type => 'text', + }, + 'descr' => { + data_type => 'text', + }, + 'channel' => { + data_type => 'integer', + }, + 'power' => { + data_type => 'integer', + }, +); + +1; diff --git a/Netdisco/lib/App/Netdisco/Web/Plugin/Report/ApChannelDist.pm b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/ApChannelDist.pm new file mode 100644 index 00000000..98e5d21b --- /dev/null +++ b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/ApChannelDist.pm @@ -0,0 +1,34 @@ +package App::Netdisco::Web::Plugin::Report::ApChannelDist; + +use Dancer ':syntax'; +use Dancer::Plugin::Ajax; +use Dancer::Plugin::DBIC; +use Dancer::Plugin::Auth::Extensible; + +use App::Netdisco::Web::Plugin; + +register_report( + { category => 'Wireless', + tag => 'apchanneldist', + label => 'Access Point Channel Distribution', + } +); + +ajax '/ajax/content/report/apchanneldist' => require_login sub { + my $set = schema('netdisco')->resultset('DevicePortWireless')->search( + { channel => { '!=', '0' } }, + { select => [ 'channel', { count => 'channel' } ], + as => [qw/ channel ch_count /], + group_by => [qw/channel/], + order_by => { -desc => [qw/count/] }, + }, + ); + + return unless $set->count; + + content_type('text/html'); + template 'ajax/report/apchanneldist.tt', { results => $set, }, + { layout => undef }; +}; + +true; diff --git a/Netdisco/lib/App/Netdisco/Web/Plugin/Report/ApRadioChannelPower.pm b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/ApRadioChannelPower.pm new file mode 100644 index 00000000..e294d718 --- /dev/null +++ b/Netdisco/lib/App/Netdisco/Web/Plugin/Report/ApRadioChannelPower.pm @@ -0,0 +1,62 @@ +package App::Netdisco::Web::Plugin::Report::ApRadioChannelPower; + +use Dancer ':syntax'; +use Dancer::Plugin::Ajax; +use Dancer::Plugin::DBIC; +use Dancer::Plugin::Auth::Extensible; + +use App::Netdisco::Web::Plugin; + +register_report( + { category => 'Wireless', + tag => 'apradiochannelpower', + label => 'Access Point Radios Channel and Power', + } +); + +sub port_tree { + my $devices = shift; + + my %ports; + + foreach my $device (@$devices) { + my $power2; + + if ( defined( $device->power ) && $device->power ) { + $power2 = sprintf( "%.1f", + 10.0 * CORE::log( $device->power ) / CORE::log(10) ); + } + + $ports{ $device->device_name }{device} = { + name => $device->device_name, + ip => $device->ip, + dns => $device->dns, + model => $device->model, + location => $device->location + }; + push @{ $ports{ $device->device_name }{ports} }, + { + port => $device->port, + name => $device->port_name, + descr => $device->descr, + channel => $device->channel, + power => $device->power, + power2 => $power2 + }; + } + return \%ports; +} + +ajax '/ajax/content/report/apradiochannelpower' => require_login sub { + my @set + = schema('netdisco')->resultset('Virtual::ApRadioChannelPower')->all; + + my $results = port_tree( \@set ); + return unless scalar %$results; + + content_type('text/html'); + template 'ajax/report/apradiochannelpower.tt', { results => $results, }, + { layout => undef }; +}; + +true; diff --git a/Netdisco/share/config.yml b/Netdisco/share/config.yml index ccf7d041..3b6058be 100644 --- a/Netdisco/share/config.yml +++ b/Netdisco/share/config.yml @@ -34,6 +34,8 @@ path: '/' web_plugins: - Inventory - Report::PortUtilization + - Report::ApChannelDist + - Report::ApRadioChannelPower - Report::HalfDuplex - Report::DuplexMismatch - AdminTask::PseudoDevice diff --git a/Netdisco/share/views/ajax/report/apchanneldist.tt b/Netdisco/share/views/ajax/report/apchanneldist.tt new file mode 100644 index 00000000..2575d998 --- /dev/null +++ b/Netdisco/share/views/ajax/report/apchanneldist.tt @@ -0,0 +1,17 @@ + + + + + + + + + [% WHILE (row = results.next) %] + + + + + [% END %] + +
ChannelCount
[% row.channel %][% row.get_column('ch_count') %]
+ diff --git a/Netdisco/share/views/ajax/report/apradiochannelpower.tt b/Netdisco/share/views/ajax/report/apradiochannelpower.tt new file mode 100644 index 00000000..8d282b2b --- /dev/null +++ b/Netdisco/share/views/ajax/report/apradiochannelpower.tt @@ -0,0 +1,52 @@ +
+[% count = 0 %] +[% FOREACH row IN results.keys.sort %] + [% count = count + 1 %] +
+ +
+
+ + + + + + + + + + + + [% FOREACH p IN results.$row.ports %] + [% NEXT UNLESS p.channel # No channel port is admin down %] + + + + + + + + [% END %] + +
PortNameDescriptionChannelTx Power (mW/dBm)
+ + [% p.port | html_entity %][% p.name %][% p.descr %][% p.channel %][% IF p.power or p.power2 %][% p.power %] / [% p.power2 %][% END %]
+
+
+[%END%] +
+ +