pbot-vm: vm-exec can now select VM; can be configured by vm-exec.json file

The vm-exec command now recognizes the following options:

    -vm-serial -vm-heart -vm-cid -vm-vport -vm

The -vm option accepts a name and configures the serial,
heart, cid and vport appropriately.

The vm-exec command can be configured by /host/config/vm-exec.json.
This commit is contained in:
Pragmatic Software 2022-02-15 11:28:47 -08:00
parent 619ff86a94
commit 951b771b9c
3 changed files with 108 additions and 12 deletions

View File

@ -1,3 +1,3 @@
PBot can interact with a virtual machine to safely execute arbitrary user-submitted system commands and code.
For installation and usage instructions, see [the documentation.](../../doc/VirtualMachine.md)
For installation and usage instructions, see [the PBot Virtual Machine documentation.](../../doc/VirtualMachine.md)

View File

@ -108,9 +108,11 @@ sub make_context_from_args(@args_in) {
}
}
# parse -lang option
if ($context->{code} =~ s/^-lang=([^ ]+)\s+//) {
$context->{lang} = lc $1;
# parse options specific to vm-exec
while ($context->{code} =~ s/^-(lang|vm-cid|vm-vport|vm-serial|vm)=([^ ]+)\s+//) {
my ($option, $value) = ($1, $2);
print STDERR "Overriding `$option` to `$value`.\n";
$context->{$option} = lc $value;
}
return $context;
@ -148,9 +150,90 @@ sub load_language($context) {
return "Languages::$language"->new(%$context);
}
sub load_config($file) {
open my $fh, '<', $file or die "load config: could not open $file: $!\n";
local $/ = undef;
my $json = <$fh>;
close $fh;
return decode_json($json);
}
sub config_get_machine($config, $machine) {
# check if machine is an alias and update to actual machine
if (exists $config->{aliases}->{$machine}) {
$machine = $config->{aliases}->{$machine};
}
# return pointer to config entry
return $config->{machines}->{$machine};
}
sub list_machines($config) {
my @machines;
# quick-and-easy: just list the aliases
foreach my $alias (keys %{$config->{aliases}}) {
push @machines, $alias;
}
return join ', ', sort @machines;
}
sub configure_context($context, $config) {
if (exists $context->{vm}) {
# -vm option was passed, forcibly override machine
my $machine = $context->{vm};
# point at config entry
my $entry = config_get_machine($config, $machine);
if (not defined $entry) {
my $machines = list_machines($config);
print "Unknown machine '$machine'; available machines are: $machines\n";
exit 1;
}
# override values
$context->{'vm-serial'} = $entry->{'serial'};
$context->{'vm-heart'} = $entry->{'heart'};
$context->{'vm-cid'} = $entry->{'cid'};
$context->{'vm-vport'} = $entry->{'vport'};
} else {
# otherwise configure any undefined values as default machine
my $machine = $config->{'default-machine'};
# point at config entry
my $entry = config_get_machine($config, $machine);
if (not defined $entry) {
my $machines = list_machines($config);
print "Unknown machine '$machine'; available machines are: $machines\n";
exit 1;
}
# update any undefined values, preserving any existing values
$context->{'vm-serial'} //= $entry->{'serial'};
$context->{'vm-heart'} //= $entry->{'heart'};
$context->{'vm-cid'} //= $entry->{'cid'};
$context->{'vm-vport'} //= $entry->{'vport'};
}
# set any undefined values to default values
$context->{nick} //= 'vm';
$context->{channel} //= 'vm';
$context->{lang} //= 'c11';
$context->{'vm-serial'} //= SERIAL;
$context->{'vm-cid'} //= CID;
$context->{'vm-vport'} //= VPORT;
}
sub main() {
my $context = make_context_from_args(@ARGV);
my $config = load_config("$RealBin/../config/vm-exec.json");
configure_context($context, $config);
if (not length $context->{code}) {
if (exists $context->{usage}) {
print "$context->{usage}\n";
@ -160,14 +243,6 @@ sub main() {
exit 1;
}
# set any missing fields to default values
$context->{nick} //= 'vm';
$context->{channel} //= 'vm';
$context->{lang} //= 'c11';
$context->{'vm-serial'} //= SERIAL;
$context->{'vm-cid'} //= CID;
$context->{'vm-vport'} //= VPORT;
my $lang = load_language($context);
$lang->process_interactive_edit;

View File

@ -0,0 +1,21 @@
{
"machines" : {
"pbot-vm" : {
"serial" : 5555,
"heart" : 5556,
"cid" : 7,
"vport" : 5555
},
"pbot-test-vm" : {
"serial" : 7777,
"heart" : 7778,
"cid" : 42,
"vport" : 5555
}
},
"aliases" : {
"fedora-amd64" : "pbot-vm",
"test" : "pbot-test-vm"
},
"default-machine" : "fedora-amd64"
}