3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-28 23:09:39 +01:00
pbot/applets/pbot-vm/guest/lib/Languages/_default.pm

122 lines
2.9 KiB
Perl
Raw Normal View History

#!/usr/bin/perl
2021-07-11 00:00:22 +02:00
# SPDX-FileCopyrightText: 2021 Pragmatic Software <pragma78@gmail.com>
# SPDX-License-Identifier: MIT
2019-06-13 06:35:04 +02:00
package _default;
use warnings;
use strict;
2019-06-13 06:35:04 +02:00
use IPC::Run qw/run timeout/;
2023-03-13 02:10:44 +01:00
use Encode;
use SplitLine;
2019-06-13 06:35:04 +02:00
use Data::Dumper;
$Data::Dumper::Terse = 1;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Useqq = 1;
sub new {
my ($class, %conf) = @_;
my $self = bless {}, $class;
$self->{debug} = $conf{debug} // 0;
$self->{sourcefile} = $conf{sourcefile};
$self->{execfile} = $conf{execfile};
$self->{code} = $conf{code};
$self->{cmdline} = $conf{cmdline};
$self->{input} = $conf{input} // '';
$self->{date} = $conf{date};
$self->{arguments} = $conf{arguments};
$self->{factoid} = $conf{factoid};
$self->{'persist-key'} = $conf{'persist-key'};
$self->initialize(%conf);
return $self;
}
sub initialize {
my ($self, %conf) = @_;
}
sub preprocess {
my $self = shift;
open(my $fh, '>:encoding(UTF-8)', $self->{sourcefile}) or die $!;
print $fh $self->{code} . "\n";
close $fh;
my $quoted_args = $self->quote_args($self->{arguments});
my $stdin = 'ulimit -f 2000; ulimit -t 8; ulimit -u 200; ';
if (length $self->{input}) {
my $quoted_cmd = "$self->{cmdline} $quoted_args";
$quoted_cmd =~ s/'/'"'"'/g;
my $quoted_input = $self->{input};
$quoted_input =~ s/'/'"'"'/g;
$stdin .= "/bin/bash -c '$quoted_cmd' <<< '$quoted_input'";
} else {
$stdin .= "$self->{cmdline} $quoted_args";
}
my ($retval, $stdout, $stderr) = $self->execute(60, $stdin, '/bin/bash');
$self->{output} = $stderr;
$self->{output} .= ' ' if length $self->{output};
$self->{output} .= $stdout;
$self->{error} = $retval;
}
sub postprocess {}
sub execute {
my ($self, $timeout, $stdin, @cmdline) = @_;
$stdin //= '';
2023-03-13 00:06:04 +01:00
$stdin = encode('UTF-8', $stdin);
@cmdline = map { encode('UTF-8', $_) } @cmdline;
print STDERR "execute ($timeout) [$stdin] @cmdline\n";
my ($exitval, $stdout, $stderr) = eval {
my ($stdout, $stderr);
run \@cmdline, \$stdin, \$stdout, \$stderr, timeout($timeout);
my $exitval = $? >> 8;
2023-03-13 00:06:04 +01:00
return ($exitval, decode('UTF-8', $stdout), decode('UTF-8', $stderr));
};
2019-06-13 06:35:04 +02:00
if (my $exception = $@) {
$exception = "[Timed-out]" if $exception =~ m/timeout on timer/;
($exitval, $stdout, $stderr) = (-1, '', $exception);
}
$Data::Dumper::Indent = 0;
print STDERR "exitval $exitval stderr [", Dumper($stderr), "] stdout [", Dumper($stdout), "]\n";
$Data::Dumper::Indent = 1;
return ($exitval, $stdout, $stderr);
2019-06-13 06:35:04 +02:00
}
sub quote_args {
my ($self, $text) = @_;
my @args = split_line($text, strip_quotes => 1, preserve_escapes => 1);
my $quoted = '';
foreach my $arg (@args) {
$arg =~ s/'/'"'"'/g;
$quoted .= "'$arg' ";
}
return $quoted;
}
1;