1package App::Netdisco::Web::Plugin::Report::PortLog;
2
3use Dancer ':syntax';
4use Dancer::Plugin::Ajax;
5use Dancer::Plugin::DBIC;
6use Dancer::Plugin::Auth::Extensible;
7
8use App::Netdisco::Web::Plugin;
9
10register_report({
11  tag => 'portlog',
12  label => 'Port Control Log',
13  category => 'Port', # not used
14  hidden => true,
15});
16
17sub _sanity_ok {
18    return 0 unless
19      param('ip') =~ m/^[[:print:]]+$/
20      and param('port') =~ m/^[[:print:]]+$/
21      and param('log') =~ m/^[[:print:]]+$/;
22
23    return 1;
24}
25
26ajax '/ajax/control/report/portlog/add' => require_login sub {
27    send_error('Bad Request', 400) unless _sanity_ok();
28
29    schema('netdisco')->txn_do(sub {
30      my $user = schema('netdisco')->resultset('DevicePortLog')
31        ->create({
32          ip => param('ip'),
33          port => param('port'),
34          reason => 'other',
35          log => param('log'),
36          username => session('logged_in_user'),
37          userip => request->remote_address,
38          action => 'comment',
39        });
40    });
41};
42
43ajax '/ajax/content/report/portlog' => require_login sub {
44    my $device = param('q');
45    my $port = param('f');
46    send_error('Bad Request', 400) unless $device and $port;
47
48    $device = schema('netdisco')->resultset('Device')
49      ->search_for_device($device);
50    return unless $device;
51
52    my $set = schema('netdisco')->resultset('DevicePortLog')->search({
53        ip => $device->ip,
54        port => $port,
55      }, {
56        order_by => { -desc => [qw/creation/] },
57        rows => 200,
58      })->with_times;
59
60    content_type('text/html');
61    template 'ajax/report/portlog.tt', {
62      results => $set,
63    }, { layout => undef };
64};
65
66true;
67