1package App::Netdisco::Web::PortControl;
2
3use Dancer ':syntax';
4use Dancer::Plugin::Ajax;
5use Dancer::Plugin::DBIC;
6use Dancer::Plugin::Auth::Extensible;
7
8use App::Netdisco::JobQueue qw/jq_insert jq_userlog/;
9
10ajax '/ajax/portcontrol' => require_any_role [qw(admin port_control)] => sub {
11    send_error('No device/port/field', 400)
12      unless param('device') and (param('port') or param('field'));
13
14    my $log = sprintf 'd:[%s] p:[%s] f:[%s]. a:[%s] v[%s]',
15      param('device'), (param('port') || ''), param('field'),
16      (param('action') || ''), (param('value') || '');
17
18    my %action_map = (
19      'location' => 'location',
20      'contact'  => 'contact',
21      'c_port'   => 'portcontrol',
22      'c_name'   => 'portname',
23      'c_pvid'   => 'vlan',
24      'c_power'  => 'power',
25    );
26
27    my $action = $action_map{ param('field') };
28    my $subaction = ($action =~ m/^(?:power|portcontrol)/
29      ? (param('action') ."-other")
30      : param('value'));
31
32    schema('netdisco')->txn_do(sub {
33      if (param('port')) {
34          my $act = "$action $subaction";
35          $act =~ s/-other$//;
36          $act =~ s/^portcontrol/port/;
37
38          schema('netdisco')->resultset('DevicePortLog')->create({
39            ip => param('device'),
40            port => param('port'),
41            action => $act,
42            username => session('logged_in_user'),
43            userip => request->remote_address,
44            reason => (param('reason') || 'other'),
45            log => param('log'),
46          });
47      }
48
49      jq_insert({
50        device => param('device'),
51        port => param('port'),
52        action => $action,
53        subaction => $subaction,
54        username => session('logged_in_user'),
55        userip => request->remote_address,
56        log => $log,
57      });
58    });
59
60    content_type('application/json');
61    to_json({});
62};
63
64ajax '/ajax/userlog' => require_login sub {
65    my @jobs = jq_userlog( session('logged_in_user') );
66
67    my %status = (
68      'done' => [
69        map  {s/\[\]/<empty>/; $_}
70        map  { $_->log }
71        grep { $_->status eq 'done' }
72        grep { defined }
73        @jobs
74      ],
75      'error' => [
76        map  {s/\[\]/<empty>/; $_}
77        map  { $_->log }
78        grep { $_->status eq 'error' }
79        grep { defined }
80        @jobs
81      ],
82    );
83
84    content_type('application/json');
85    to_json(\%status);
86};
87
88true;
89