The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use Dancer ':syntax';
use App::Netdisco::JobQueue qw/jq_insert jq_userlog/;
ajax '/ajax/portcontrol' => require_any_role [qw(admin port_control)] => sub {
send_error('No device/port/field', 400)
unless param('device') and (param('port') or param('field'));
my $log = sprintf 'd:[%s] p:[%s] f:[%s]. a:[%s] v[%s]',
param('device'), (param('port') || ''), param('field'),
(param('action') || ''), (param('value') || '');
my %action_map = (
'location' => 'location',
'contact' => 'contact',
'c_port' => 'portcontrol',
'c_name' => 'portname',
'c_pvid' => 'vlan',
'c_power' => 'power',
);
my $action = $action_map{ param('field') };
my $subaction = ($action =~ m/^(?:power|portcontrol)/
? (param('action') ."-other")
: param('value'));
schema('netdisco')->txn_do(sub {
if (param('port')) {
my $a = "$action $subaction";
$a =~ s/-other$//;
$a =~ s/^portcontrol/port/;
schema('netdisco')->resultset('DevicePortLog')->create({
ip => param('device'),
port => param('port'),
action => $a,
username => session('logged_in_user'),
userip => request->remote_address,
reason => (param('reason') || 'other'),
log => param('log'),
});
}
jq_insert({
device => param('device'),
port => param('port'),
action => $action,
subaction => $subaction,
username => session('logged_in_user'),
userip => request->remote_address,
log => $log,
});
});
content_type('application/json');
to_json({});
};
ajax '/ajax/userlog' => require_login sub {
my @jobs = jq_userlog( session('logged_in_user') );
my %status = (
'done' => [
map {s/\[\]/<empty>/; $_}
map { $_->log }
grep { $_->status eq 'done' }
grep { defined }
@jobs
],
'error' => [
map {s/\[\]/<empty>/; $_}
map { $_->log }
grep { $_->status eq 'error' }
grep { defined }
@jobs
],
);
content_type('application/json');
to_json(\%status);
};
true;