Skip to content

Instantly share code, notes, and snippets.

@tiberiosantos
Last active May 7, 2022 02:29
Show Gist options
  • Save tiberiosantos/55b13f3a07642eb38ceac34e132a9f1a to your computer and use it in GitHub Desktop.
Save tiberiosantos/55b13f3a07642eb38ceac34e132a9f1a to your computer and use it in GitHub Desktop.
Instalação e Configuração do BOCA Online Contest Administrator (https://github.com/cassiopc/boca/)

Instalação dos pacotes do BOCA

Instalando os pacotes necessários para compilar e rodar a aplicação.

apt install --no-install-recommends acl apache2 build-essential coreutils debconf debootstrap debhelper git libany-uri-escape-perl makepasswd makepasswd openssl php php-cli php-fpm php-gd php-pgsql php-xml php-zip postgresql postgresql-client quota quotatool sharutils schroot

Compilando e instalando os pacotes do BOCA

git clone https://github.com/cassiopc/boca
cd boca
dpkg-buildpackage -us -uc
cd ..
dpkg -i {boca-{common,web,db,autojudge},boca}_*.deb

Nos diálogos que se seguem selecione com a tecla TAB e confirme com a tecla ENTER.

  1. localhost
  2. Senha do usuario do banco de dados
  3. Yes

Configurando o BOCA web

Configurando o VirtualHost do BOCA

cat << EOF > /etc/apache2/sites-available/000-boca-ssl.conf
<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerAdmin boca@bombonera.org
                SSLEngine on
                SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
                Protocols h2 http/1.1
                DocumentRoot /var/www/boca
                <FilesMatch "\.(php)$">
                        SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory "/var/www/boca/src">
                        AllowOverride Options AuthConfig Limit
                        Order Allow,Deny
                        Allow from all
                        AddDefaultCharset utf-8
                </Directory>
                <Directory "/var/www/boca/src/private">
                        AllowOverride Options AuthConfig Limit
                        Deny from all
                </Directory>
                <Directory /var/www/boca>
                        AllowOverride Options AuthConfig Limit
                        Deny from all
                </Directory>
                Alias /boca /var/www/boca/src
        </VirtualHost>
        SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
        SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        SSLHonorCipherOrder     off
        SSLSessionTickets       off
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
EOF
cp /etc/apache2/sites-enabled/000-boca.conf /etc/apache2/sites-available/
rm /etc/apache2/sites-enabled/000-boca.conf
a2enconf $(a2query -c | awk '/php.*fpm/ {print $1}')
a2enmod rewrite
a2ensite 000-boca-ssl.conf
systemctl reload apache2

Configurando o banco de dados

su - postgres -c "psql -U postgres postgres <<EOF
 CREATE USER bocauser PASSWORD '<SENHA>';
 ALTER USER bocauser CREATEDB;
EOF"
echo YES | boca-createdb

Criando uma unidade de serviço do SystemD para iniciar o BOCA Auto Judge

cat << EOF > /lib/systemd/system/boca-autojudge.service
[Unit]
Description=Auto Judge Boca Contest
After=network.target

[Service]
ExecStart=/usr/sbin/boca-autojudge

[Install]
WantedBy=multi-user.target
EOF
systemctl enable boca-autojudge
systemctl start boca-autojudge

Configurando a jaula para rodar os programas

Corrigiremos alguns bugs na criação da jaula. O arquivo lsb-release não é mais suportado na maioria das distribuições Linux. A versão atual do systemd não suporta um diretório raiz em que o dono não é "root". https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=950684

NUID=$[$(sort -t: -hk3 /etc/passwd | awk -F: '{if ($3 > 999 && $3 < 60000) print $3}' | tail -n1)+1]
JAIL=/home/bocajail
echo "DISTRIB_CODENAME=$(lsb_release -cs)" > /etc/lsb-release
mkdir -p /var/lib/AccountsService/users/ $JAIL
setfacl -m u:$NUID:rwx,g:users:rwx $JAIL

Ativando o suporte a cota de disco na partição home com sistema de arquivos ext4

umount /home
tune2fs -O quota $(mount | awk '/\/home/ {print $1}')
mount -a
quotaon -va

Criando a jaula

boca-createjail

O pacote "maratona-linguagens" não possui versão para distribuições diferentes do ubuntu. Deveremos instalar os pacotes requeridos manualmente. A lista de versões atualizadas do kotlin encontram-se em https://github.com/JetBrains/kotlin/releases, atualize a url da versão atual caso necessário no script do here-document abaixo.

cat << EOF > $JAIL/root/linguagens.sh
#!/bin/bash
apt install --no-install-recommends build-essential debconf default-jre default-jdk gdb nodejs python3 pyflakes3 python3-distutils unzip wget valgrind
wget --tries=3 --wait=2 --random-wait -O /tmp/kotlin.zip https://github.com/JetBrains/kotlin/releases/download/v1.6.21/kotlin-compiler-1.6.21.zip
unzip /tmp/kotlin.zip -d /opt
echo 'PATH="$PATH:/opt/kotlinc/bin"' > /etc/profile.d/kotlin.sh
rm /tmp/kotlin.zip
apt clean
rm -rf /var/lib/apt/lists/*
EOF
schroot -u root -c chroot:bocajail -- bash linguagens.sh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment