3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-06 03:59:31 +01:00

pbot-vm: add experimental Vagrant provisioning

This commit is contained in:
Pragmatic Software 2024-04-04 03:41:58 -07:00
parent 518b51f060
commit 2547f035a1
No known key found for this signature in database
GPG Key ID: CC916B6E3C84ECCE
11 changed files with 226 additions and 61 deletions

View File

@ -12,33 +12,33 @@
if [ -f /etc/os-release ]; then if [ -f /etc/os-release ]; then
# freedesktop.org and systemd # freedesktop.org and systemd
. /etc/os-release . /etc/os-release
OS=$NAME OS=$PRETTY_NAME
VER=$VERSION_ID
elif type lsb_release >/dev/null 2>&1; then elif type lsb_release >/dev/null 2>&1; then
# linuxbase.org # linuxbase.org
OS=$(lsb_release -si) OS=$(lsb_release -si)
VER=$(lsb_release -sr)
elif [ -f /etc/lsb-release ]; then elif [ -f /etc/lsb-release ]; then
# For some versions of Debian/Ubuntu without lsb_release command # For some versions of Debian/Ubuntu without lsb_release command
. /etc/lsb-release . /etc/lsb-release
OS=$DISTRIB_ID OS=$DISTRIB_ID
VER=$DISTRIB_RELEASE
else else
# Fall back to uname, e.g. "Linux <version>", also works for BSD, etc. # Fall back to uname, e.g. "Linux <version>", also works for BSD, etc.
OS=$(uname -s) OS=$(uname -s)
VER=$(uname -r)
fi fi
echo "Detected OS: $OS ($VER)" echo "Detected OS: $OS"
# run known provisioning scripts # run known provisioning scripts
case $OS in case $OS in
'openSUSE Tumbleweed') 'openSUSE Tumbleweed')
echo "Provisioning for openSUSE Tumbleweed" echo "Provisioning for $OS"
./guest/provision/tumbleweed ./guest/provision/tumbleweed
;; ;;
'Debian GNU/Linux trixie/sid')
echo "Provisioning for $OS"
./guest/provision/debian-trixie
;;
*) *)
echo "!! No automatic provisioning script for $OS ($VER). Install packages manually. !!" echo "!! No automatic provisioning script for $OS. Install packages manually. !!"
echo echo
;; ;;
esac esac

View File

@ -97,10 +97,10 @@ sub postprocess {
if ($self->{cmdline} =~ /-fsanitize=(?:[^ ]+,)?address/) { if ($self->{cmdline} =~ /-fsanitize=(?:[^ ]+,)?address/) {
# leak sanitizer doesn't work under ptrace/gdb # leak sanitizer doesn't work under ptrace/gdb
# ASAN_OPTIONS=strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1 # ASAN_OPTIONS=strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1
($exitval, $stdout, $stderr) = $self->execute(60, "$ulimits; ./prog $quoted_args\n", '/bin/sh'); ($exitval, $stdout, $stderr) = $self->execute(60, "$ulimits; ./prog $quoted_args\n", '/bin/bash');
} else { } else {
my $input = "$ulimits; guest-gdb ./prog $quoted_args"; my $input = "$ulimits; guest-gdb ./prog $quoted_args";
($exitval, $stdout, $stderr) = $self->execute(60, $input, '/bin/sh'); ($exitval, $stdout, $stderr) = $self->execute(60, $input, '/bin/bash');
} }
$self->{error} = $exitval; $self->{error} = $exitval;

View File

@ -62,7 +62,7 @@ sub preprocess {
$stdin .= "$self->{cmdline} $quoted_args"; $stdin .= "$self->{cmdline} $quoted_args";
} }
my ($retval, $stdout, $stderr) = $self->execute(60, $stdin, '/bin/sh'); my ($retval, $stdout, $stderr) = $self->execute(60, $stdin, '/bin/bash');
$self->{output} = $stderr; $self->{output} = $stderr;
$self->{output} .= ' ' if length $self->{output}; $self->{output} .= ' ' if length $self->{output};

View File

@ -0,0 +1,25 @@
#!/bin/sh
# File: debian-trixie
#
# Purpose: Provisioning script to install packages and set-up environment
# on Debian Testing (trixie) for pbot-vm.
# SPDX-FileCopyrightText: 2024 Pragmatic Software <pragma78@gmail.com>
# SPDX-License-Identifier: MIT
apt update
# for virt-io socket
apt install -y socat
# for `cc` C language support
apt install -y libubsan1 libasan8 gdb gcc gcc-multilib clang
# for pbot-vm guest-server support
apt install -y --no-install-recommends libipc-shareable-perl libipc-run-perl libjson-xs-perl
# for `cc` additional languages
apt install -y ksh zsh tcl lua5.4 php8.2-cli nodejs guile3.0 beef bc g++
apt install -y clisp golang-go
apt install -y --no-install-recommends default-jre default-jdk

View File

@ -15,8 +15,8 @@ zypper -n in socat
zypper -n in libubsan1 libasan8 gdb gcc gcc-32bit glibc-32bit clang zypper -n in libubsan1 libasan8 gdb gcc gcc-32bit glibc-32bit clang
# for pbot-vm guest-server support # for pbot-vm guest-server support
zypper -n in perl-IPC-Run perl-JSON-XS make zypper -n in perl-IPC-Run perl-JSON-XS make cpanm
PERL_MM_USE_DEFAULT=1 cpan IPC::Shareable cpanm -n IPC::Shareable
# for `cc` additional languages # for `cc` additional languages
zypper -n in ksh zsh tcl lua php8-cli nodejs-common guile bff bc gcc-c++ zypper -n in ksh zsh tcl lua php8-cli nodejs-common guile bff bc gcc-c++

View File

@ -0,0 +1,16 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'libvirt'
PBOTVM_SERIAL = ENV['PBOTVM_SERIAL'] || 5555
PBOTVM_HEART = ENV['PBOTVM_HEART'] || 5556
PBOTVM_NAME = ENV['PBOTVM_NAME'] || 'pbot-vagrant-vm'
Vagrant.configure("2") do |config|
# Every Vagrant development environment requires a box. You can search for
# boxes at https://vagrantcloud.com/search.
config.vm.box = "debian/testing64"
end
load '../common/Vagrantfile.common'

View File

@ -0,0 +1,56 @@
# Vagrant instructions
### Install Vagrant
To install vagrant on openSUSE, use:
zypper install --no-recommends vagrant vagrant-libvirt
Otherwise see https://vagrant-libvirt.github.io/vagrant-libvirt/installation.html for installation instructions for your platform.
### Install vagrant-libvirt
If your distribution does not have a `vagrant-libvirt` package or if you need an up-to-date version use Vagrant's plugin manager:
vagrant plugin install vagrant-libvirt
### Start Vagrant Box
To start a virtual machine, `cd` into one of the PBot-VM Vagrant sub-directories and run:
vagrant up
You may pass optional environment variables to override pbot-vm default configuration (see [Virtual Machine](../../../doc/VirtualMachine.md)):
PBOTVM_SERIAL=7777 PBOTVM_HEART=7778 vagrant up
### Shutdown Vagrant Box
vagrant halt
### Destroy Vagrant Box
vagrant destroy
### Delete Vagrant Box
vagrant box list
vagrant box remove <name>
### (Optional) Install Alterantive Vagrant Box
To install an alternative Vagrant box with your preferred OS/distribution, search for one at https://app.vagrantup.com/boxes/search
and then run the following command to download its Vagrantfile:
vagrant init <OS/distribution>
Examples:
vagrant init debian/testing64
vagrant init debian/bookworm64
vagrant init opensuse/Tumbleweed.x86_64
vagrant init archlinux/archlinux
vagrant init freebsd/FreeBSD-14.0-CURRENT
vagrant init generic/openbsd7
Then use one of the existing PBot-VM Vagrantfiles as a guide for adjusting your alternative Vagrantfile.

View File

@ -0,0 +1,30 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box_check_update = false
config.vm.hostname = PBOTVM_NAME
config.vm.provider :libvirt do |libvirt|
libvirt.qemuargs :value => "-chardev"
libvirt.qemuargs :value => "socket,id=charserial1,host=127.0.0.1,port=#{PBOTVM_SERIAL},server=on,wait=off"
libvirt.qemuargs :value => "-device"
libvirt.qemuargs :value => '{"driver":"isa-serial","chardev":"charserial1","id":"serial1","index":2}'
libvirt.qemuargs :value => "-chardev"
libvirt.qemuargs :value => "socket,id=charserial2,host=127.0.0.1,port=#{PBOTVM_HEART},server=on,wait=off"
libvirt.qemuargs :value => "-device"
libvirt.qemuargs :value => '{"driver":"isa-serial","chardev":"charserial2","id":"serial2","index":3}'
end
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.synced_folder "../../guest", "/home/vagrant/guest", type: "rsync",
rsync__auto: false
config.vm.provision "shell", inline: "useradd -m vm -s /bin/bash"
config.vm.provision "shell", inline: "/home/vagrant/guest/bin/setup-guest"
config.vm.post_up_message = "To start the PBot-VM Guest Server, run `vagrant ssh` to log into the pbot-vagrant-vm and then run `sudo guest-server`."
end

View File

@ -0,0 +1,16 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'libvirt'
PBOTVM_SERIAL = ENV['PBOTVM_SERIAL'] || 5555
PBOTVM_HEART = ENV['PBOTVM_HEART'] || 5556
PBOTVM_NAME = ENV['PBOTVM_NAME'] || 'pbot-vagrant-vm'
Vagrant.configure("2") do |config|
# Every Vagrant development environment requires a box. You can search for
# boxes at https://vagrantcloud.com/search.
config.vm.box = "opensuse/Tumbleweed.x86_64"
end
load '../common/Vagrantfile.common'

File diff suppressed because one or more lines are too long

View File

@ -25,8 +25,8 @@ use PBot::Imports;
# These are set by the /misc/update_version script # These are set by the /misc/update_version script
use constant { use constant {
BUILD_NAME => "PBot", BUILD_NAME => "PBot",
BUILD_REVISION => 4733, BUILD_REVISION => 4735,
BUILD_DATE => "2024-03-31", BUILD_DATE => "2024-04-04",
}; };
sub initialize {} sub initialize {}