mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-14 16:09:34 +01:00
1326b0ac5f
VM socket communication is superior to VM serial communication in every way. Unfortunately at this time only Linux supports them. Fortunately, that's 99% of PBot's userbase. If you're not using Linux or if you're using an older Linux that does not support VM sockets, the PBot VM scripts will gracefully fallback to using the serial connection. You may explicitly disable VM socket connection attempts by setting PBOTVM_CID=0.
70 lines
1.3 KiB
Perl
Executable File
70 lines
1.3 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
|
|
# File: accept-vsock-client
|
|
#
|
|
# Purpose: Accepts and handles a client connecting over Linux VM socket.
|
|
|
|
# SPDX-FileCopyrightText: 2022 Pragmatic Software <pragma78@gmail.com>
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
use 5.020;
|
|
|
|
use warnings;
|
|
use strict;
|
|
|
|
use feature qw/signatures/;
|
|
no warnings qw(experimental::signatures);
|
|
|
|
use constant {
|
|
USERNAME => 'vm',
|
|
MOD_DIR => '/usr/local/share/pbot-vm/',
|
|
};
|
|
|
|
use lib MOD_DIR;
|
|
|
|
use Guest;
|
|
|
|
sub accept_client() {
|
|
print STDERR "VSOCK accepted new connection.\n";
|
|
|
|
my $buffer = '';
|
|
|
|
while (1) {
|
|
my $command = Guest::read_input(*STDIN, \$buffer, 'VSOCK');
|
|
|
|
if (not defined $command) {
|
|
# recoverable error or waiting for more input
|
|
next;
|
|
}
|
|
|
|
if (not $command) {
|
|
# unrecoverable error or input closed
|
|
exit 1;
|
|
}
|
|
|
|
last;
|
|
}
|
|
|
|
eval { require "Languages/$command->{lang}.pm" };
|
|
|
|
if ($@) {
|
|
require 'Languages/_default.pm';
|
|
$command->{lang} = '_default';
|
|
}
|
|
|
|
my $mod = $command->{lang}->new(%$command);
|
|
|
|
my $result = Guest::process_command($command, $mod, USERNAME, 'VSOCK');
|
|
|
|
if (not defined $result) {
|
|
$result = "[Fatal error]";
|
|
}
|
|
|
|
if ($result) {
|
|
Guest::send_output(*STDOUT, $result, 'VSOCK');
|
|
exit; # exit child process
|
|
}
|
|
}
|
|
|
|
accept_client();
|