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