Skip to content

Latest commit

 

History

History

sim

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Sim

Sim is an open source platform for carrying out algorithmic contests

How to build

NOTE: There is a script scripts/setup_sim_on_debian_12.py. So if you need to look at very precise instructions that set up Sim, you can check out these scripts. If you intend to use it, first look at help, by just running the script without arguments, choose what you need and the script will guide you through the rest.

You will need meson build system to be installed (on most platforms it is in the meson package).

Dependencies:

  • Meson build system
  • gcc/g++ with C++17 support
  • MariaDB server
  • MariaDB client library
  • libseccomp
  • libzip

Debian / Ubuntu

sudo apt install g++ mariadb-server libmariadb-dev libseccomp-dev libzip-dev libcap-dev rustc fpc pkgconf meson

Modern versions of some of the above packages are needed to build sim successfully.

Arch Linux

sudo pacman -S gcc mariadb mariadb-libs libseccomp libzip libcap rust fpc meson && \
sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql && \
sudo systemctl enable mariadb && sudo systemctl start mariadb

Instructions: release build and installation step by step

  1. In case you installed MariaDB server for the first time, you should run:
sudo mariadb-secure-installation
  1. First of all clone the repository and all its submodules
git clone https://github.com/varqox/sim-project && cd sim-project/subprojects/sim
  1. Then setup build directory:
meson setup release-build/ -Dbuildtype=release
  1. Build:
ninja -C release-build/
  1. Make sure that you have created a MariaDB account and a database for Sim, use command below to create an user sim@localhost and a database simdb (when asked for password, enter your mariadb root password, by default it is empty – if that does not work, try running the below command with sudo):
sudo mariadb -e "CREATE USER sim@localhost IDENTIFIED BY 'sim'; CREATE DATABASE simdb; GRANT ALL ON simdb.* TO 'sim'@'localhost';"
  1. Configure a directory for a Sim instance
meson configure release-build --prefix $PWD/sim

This sets Sim instance's directory to $PWD/sim i.e. subdirectory sim of the current working directory. If you want to install Sim in other location, replace $PWD/sim with it.

  1. Install
meson install -C release-build

It will ask for MariaDB credentials. In previous step you created a MariaDB user and database, by default: username sim, password sim, database simdb and user host localhost.

  1. Run servers If you installed Sim in the default location:
sim/manage start

If you installed Sim elsewhere:

where-you-installed-sim/manage start

You can easily make it run in a background by adding -b parameter:

sim/manage -b start

Meson allows building and installing in one go:

meson install -C release-build

So building, installing and running can be combined into:

meson install -C release-build && sim/manage -b start
  1. Visit http://127.7.7.7:8080 via your web browser. By default a Sim root account was created there with following credentials:
username: sim
password: sim

Remember to change the password now (or later) if you want to make Sim website accessible to others. Do not make hacker's life easier!

  1. Well done! You have just fully set up Sim. There is a sim-server configuration file where-you-installed-sim/sim.conf (sim/sim.conf by default) where server parameters like address, workers etc. reside. Also, there are log files where-you-installed-sim/log/*.log that you can find useful if something didn't work.

  2. If you want to run Sim at system startup then you can use crontab -- just add these lines to your crontab (using command crontab -e):

@reboot sh -c 'until test -e /var/run/mysqld/mysqld.sock; do sleep 0.4; done; where-you-installed-sim/manage start&'

where-you-installed-sim = an absolute path to Sim instance's directory e.g. /home/your_username/sim/sim

  1. Feel free to report any bugs or things you would like to see.

Upgrading

Be aware that sometimes incompatible database or other inner changes won't allow for a smooth upgrade. In such cases sim-upgrader may come handy, grep the commit messages for it to check if it is needed.

To upgrade just type:

git pull --rebase --autostash
meson install -C release-build
sim/manage -b start

Release build

meson setup release-build/ -Dbuildtype=release -Ddefault_library=both
ninja -C release-build/

Development build

meson setup build/ -Dc_args=-DDEBUG -Dcpp_args='-DDEBUG -D_GLIBCXX_DEBUG' -Db_sanitize=undefined -Db_lundef=false
ninja -C build/

Installing

Run after building:

# we will use release-build build directory, if you use other just change all release-build below
meson configure release-build --prefix $PWD/sim # if you want to install to sim/ subdirectory
meson install -C release-build

Managing the Sim instance i.e. starting / stopping servers

For this, there is manage program in the instance's main directory. To start servers type:

sim/manage -b start # or other instance's directory

To stop servers:

sim/manage stop

For more options:

sim/manage help

Backups

Backups are made using restic. Debin/Ubuntu package: restic, Arch Linux package: restic.

A sim backup can be created with:

sim/bin/backup save

Multiple backups may be created.

To restore a specific backup use the sim/bin/backup restore program. You may want to edit the .db.config file if migrating sim from another machine. To learn more run:

sim/bin/backup help

Merging one Sim instance into the other

First, naming. Let's call the Sim instance that we want to merge into the main Sim instance and the one we want to merge from the other Sim instance.

In case the merging fails for some reason, make a backup of the main sim instance:

main-sim-instance/bin/backup save

The other sim instance has to be on the same machine as the main sim instance. If this is not the case, follow the steps below:

  1. Make a backup of the other instance if not already done:
other-sim-instance/bin/backup save
  1. Copy the other sim instance to the machine containing the main sim instance, e.g. using rsync.

  2. Create user and database for the other sim instance. E.g.

sudo mariadb -e "CREATE USER other_sim@localhost IDENTIFIED BY 'other_sim'; CREATE DATABASE other_simdb; GRANT ALL ON other_simdb.* TO 'other_sim'@'localhost';"
  1. Edit file other-sim-instance/.db.config to use the new user and database.

  2. Restore the other sim instance from latest backup:

other-sim-instance/bin/backup restore latest

Now we have both instances on the same machine we can merge them. To do so, run:

main-sim-instance/bin/sim-merger path-to-other-sim-instance

Then restore the main instance:

main-sim-instance/manage start -b

Lastly, you can remove the other sim instance by removing files and database used, e.g.

rm -rf other-sim-instance/
sudo mariadb -e "DROP DATABASE other_sim; DROP USER other_sim@localhost;"

Running tests

ninja -C build/ test # or other build directory

Development build targets

Formating C/C++ sources

To format all sources (clang-format is required):

ninja -C build format

Linting C/C++ sources

All sources

To lint all sources:

ninja -C build tidy

or

./tidy

Specified sources

To lint specified sources:

./tidy path/to/source.cc other/source.h

Static analysis

ninja -C build scan-build