2022-01-23 16:49:23 +01:00
|
|
|
#!/usr/bin/env perl
|
|
|
|
|
|
|
|
# File: vm-client
|
|
|
|
#
|
|
|
|
# Purpose: Interfaces with the PBot virtual machine server hosted at
|
|
|
|
# PeerAddr/PeerPort defined below. This allows us to host instances of
|
|
|
|
# virtual machines on remote servers.
|
|
|
|
#
|
|
|
|
# This script is intended to be installed to PBot's applets directory
|
|
|
|
# and attached to a PBot command such as `cc`.
|
|
|
|
|
|
|
|
# SPDX-FileCopyrightText: 2021 Pragmatic Software <pragma78@gmail.com>
|
|
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
|
|
|
|
# TODO: extend to take a list of server/ports to cycle for load-balancing
|
|
|
|
|
|
|
|
use warnings;
|
|
|
|
use strict;
|
|
|
|
|
|
|
|
use IO::Socket;
|
2022-02-07 05:01:56 +01:00
|
|
|
use JSON::XS;
|
|
|
|
|
|
|
|
use constant {
|
|
|
|
SERVER_PORT => $ENV{PBOTVM_SERVER} // 9000,
|
|
|
|
};
|
2022-01-23 16:49:23 +01:00
|
|
|
|
|
|
|
my $sock = IO::Socket::INET->new(
|
|
|
|
PeerAddr => '127.0.0.1',
|
2022-02-07 05:01:56 +01:00
|
|
|
PeerPort => SERVER_PORT,
|
2022-01-30 04:23:36 +01:00
|
|
|
Proto => 'tcp'
|
2022-01-23 16:49:23 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
if (not defined $sock) {
|
|
|
|
print "Fatal error compiling: $!; try again later\n";
|
|
|
|
die $!;
|
|
|
|
}
|
|
|
|
|
2022-01-30 04:23:36 +01:00
|
|
|
my $json = join ' ', @ARGV;
|
|
|
|
my $h = decode_json $json;
|
2022-01-23 16:49:23 +01:00
|
|
|
|
2022-01-30 04:23:36 +01:00
|
|
|
my $lang = $h->{lang} // "c11";
|
2022-01-23 16:49:23 +01:00
|
|
|
|
2022-01-30 04:23:36 +01:00
|
|
|
if ($h->{code} =~ s/-lang=([^ ]+)//) { $lang = lc $1; }
|
2022-01-23 16:49:23 +01:00
|
|
|
|
2022-01-30 04:23:36 +01:00
|
|
|
$h->{lang} = $lang;
|
|
|
|
$json = encode_json $h;
|
2022-01-23 16:49:23 +01:00
|
|
|
|
2022-01-30 04:23:36 +01:00
|
|
|
print $sock "$json\n";
|
|
|
|
|
|
|
|
while (my $line = <$sock>) { print "$line"; }
|
2022-01-23 16:49:23 +01:00
|
|
|
|
|
|
|
close $sock;
|