1package App::Netdisco::Web::Plugin::Report::Netbios; 2 3use Dancer ':syntax'; 4use Dancer::Plugin::DBIC; 5use Dancer::Plugin::Auth::Extensible; 6use App::Netdisco::Util::ExpandParams 'expand_hash'; 7 8use App::Netdisco::Web::Plugin; 9 10register_report( 11 { category => 'Node', 12 tag => 'netbios', 13 label => 'NetBIOS Inventory', 14 provides_csv => 1, 15 } 16); 17 18hook 'before_template' => sub { 19 my $tokens = shift; 20 21 return 22 unless ( request->path eq uri_for('/report/netbios')->path 23 or 24 index( request->path, uri_for('/ajax/content/report/netbios')->path ) 25 == 0 ); 26 27 # used in the search sidebar template to set selected items 28 foreach my $opt (qw/domain/) { 29 my $p = ( 30 ref [] eq ref param($opt) 31 ? param($opt) 32 : ( param($opt) ? [ param($opt) ] : [] ) 33 ); 34 $tokens->{"${opt}_lkp"} = { map { $_ => 1 } @$p }; 35 } 36}; 37 38get '/ajax/content/report/netbios/data' => require_login sub { 39 send_error( 'Missing parameter', 400 ) 40 unless ( param('draw') && param('draw') =~ /\d+/ ); 41 42 my $domain = param('domain'); 43 44 my $rs = schema('netdisco')->resultset('NodeNbt'); 45 46 my $search = $domain eq 'blank' ? '' : $domain; 47 $rs = $rs->search( { domain => $search } ) 48 ->order_by( [ { -asc => 'domain' }, { -desc => 'time_last' } ] ); 49 50 my $exp_params = expand_hash( scalar params ); 51 52 my $recordsTotal = $rs->count; 53 54 my @data = $rs->get_datatables_data($exp_params)->hri->all; 55 56 my $recordsFiltered = $rs->get_datatables_filtered_count($exp_params); 57 58 content_type 'application/json'; 59 return to_json( 60 { draw => int( param('draw') ), 61 recordsTotal => int($recordsTotal), 62 recordsFiltered => int($recordsFiltered), 63 data => \@data, 64 } 65 ); 66}; 67 68get '/ajax/content/report/netbios' => require_login sub { 69 70 my $domain = param('domain'); 71 72 my $rs = schema('netdisco')->resultset('NodeNbt'); 73 my @results; 74 75 if ( defined $domain && !request->is_ajax ) { 76 my $search = $domain eq 'blank' ? '' : $domain; 77 @results 78 = $rs->search( { domain => $search } ) 79 ->order_by( [ { -asc => 'domain' }, { -desc => 'time_last' } ] ) 80 ->hri->all; 81 82 return unless scalar @results; 83 } 84 elsif ( !defined $domain ) { 85 @results = $rs->search( 86 {}, 87 { select => [ 'domain', { count => 'domain' } ], 88 as => [qw/ domain count /], 89 group_by => [qw/ domain /] 90 } 91 )->order_by( { -desc => 'count' } )->hri->all; 92 93 return unless scalar @results; 94 } 95 96 if ( request->is_ajax ) { 97 my $json = to_json( \@results ); 98 template 'ajax/report/netbios.tt', 99 { results => $json, opt => $domain }, 100 { layout => undef }; 101 } 102 else { 103 header( 'Content-Type' => 'text/comma-separated-values' ); 104 template 'ajax/report/netbios_csv.tt', 105 { results => \@results, opt => $domain }, 106 { layout => undef }; 107 } 108}; 109 1101; 111