add vlan inventory report

This commit is contained in:
Eric A. Miller
2013-09-24 23:51:33 -04:00
parent 26de9cc6d9
commit 2856271cd2
5 changed files with 92 additions and 0 deletions

View File

@@ -69,6 +69,17 @@ __PACKAGE__->has_many( port_vlans_native => 'App::Netdisco::DB::Result::Virtual:
{ cascade_copy => 0, cascade_update => 0, cascade_delete => 0 } { cascade_copy => 0, cascade_update => 0, cascade_delete => 0 }
); );
=head2 ports
Link relationship to support C<ports>.
=cut
__PACKAGE__->has_many( ports => 'App::Netdisco::DB::Result::DevicePortVlan',
{ 'foreign.ip' => 'self.ip', 'foreign.vlan' => 'self.vlan' },
{ cascade_copy => 0, cascade_update => 0, cascade_delete => 0 }
);
=head2 tagging_ports =head2 tagging_ports
Returns the set of Device Ports on which this VLAN is configured to be tagged. Returns the set of Device Ports on which this VLAN is configured to be tagged.

View File

@@ -0,0 +1,44 @@
package App::Netdisco::Web::Plugin::Report::VlanInventory;
use Dancer ':syntax';
use Dancer::Plugin::DBIC;
use Dancer::Plugin::Auth::Extensible;
use App::Netdisco::Web::Plugin;
register_report(
{ category => 'VLAN',
tag => 'vlaninventory',
label => 'VLAN Inventory',
provides_csv => 1,
}
);
get '/ajax/content/report/vlaninventory' => require_login sub {
my $set = schema('netdisco')->resultset('DeviceVlan')->search(
{ 'vlan.description' => { '!=', 'NULL' } },
{ join => { 'ports' => 'vlan' },
select => [
'vlan.vlan',
'vlan.description',
{ count => { distinct => 'ports.ip' } },
{ count => 'ports.vlan' }
],
as => [qw/ vlan description dcount pcount /],
group_by => [qw/ vlan.vlan vlan.description /],
}
);
return unless $set->count;
if ( request->is_ajax ) {
template 'ajax/report/vlaninventory.tt', { results => $set, },
{ layout => undef };
}
else {
header( 'Content-Type' => 'text/comma-separated-values' );
template 'ajax/report/vlaninventory_csv.tt', { results => $set, },
{ layout => undef };
}
};
true;

View File

@@ -38,6 +38,7 @@ web_plugins:
- Report::ApRadioChannelPower - Report::ApRadioChannelPower
- Report::HalfDuplex - Report::HalfDuplex
- Report::DuplexMismatch - Report::DuplexMismatch
- Report::VlanInventory
- AdminTask::PseudoDevice - AdminTask::PseudoDevice
- AdminTask::Topology - AdminTask::Topology
- AdminTask::JobQueue - AdminTask::JobQueue

View File

@@ -0,0 +1,24 @@
[% USE Number.Format %]
<table class="table table-bordered table-condensed table-striped nd_floatinghead">
<thead>
<tr>
<th class="nd_center-cell">VLAN ID</th>
<th class="nd_center-cell">VLAN Name</th>
<th class="nd_center-cell">Device Count</th>
<th class="nd_center-cell">Port Count</th>
</tr>
</thead>
</tbody>
[% WHILE (row = results.next) %]
<tr>
<td><a class="nd_linkcell"
href="[% uri_for('/search') %]?tab=vlan&q=[% row.vlan | uri %]">
[% row.vlan | html_entity %]</a></td>
<td class="nd_center-cell">[% row.description %]</td>
<td class="nd_center-cell">[% row.get_column('dcount') | format_number %]</td>
<td class="nd_center-cell">[% row.get_column('pcount') | format_number %]</td>
</tr>
[% END %]
</tbody>
</table>

View File

@@ -0,0 +1,12 @@
[% USE CSV -%]
[% CSV.dump([ 'VLAN ID' 'VLAN Name' 'Device Count' 'Port Count' ]) %]
[% WHILE (row = results.next) %]
[% mylist = [] %]
[% mylist.push(row.vlan) %]
[% mylist.push(row.description) %]
[% mylist.push(row.get_column('dcount')) %]
[% mylist.push(row.get_column('pcount')) %]
[% CSV.dump(mylist) %]
[% END %]