myriad
myriad copied to clipboard
Arbitrary code execution
Myriad
Arbitrary code execution server using Docker.
Each language has its own Docker image and so each evaluation will run in the respective language's locked-down container.
Features include:
- Building images on startup.
- Preparing containers on startup or on demand.
- Periodically cleanup running containers.
- Customizable settings for each image:
- Maximum memory usage.
- Maximum CPU usage.
- Maximum evaluation time.
- Maximum concurrent evaluations.
- Maximum number of retries.
- Maximum output size.
Requires Docker 18+ to operate.
Download Pre-Built Binary
Check the Releases tab for pre-built binaries.
The languages folder and an example configuration are also included.
Installation from Source
You can use either stack or cabal.
stackshould be >= 2.1.1,cabalshould be >= 2.4.0.0.- GHC 8.8.3 is required if not already installed by
stackor if usingcabal.
Make sure the place where stack or cabal places binaries is in your PATH.
- For
stack, you can get it withstack path --local-bin. - For
cabal, you should find it in$HOME/.cabal/bin(Linux) or%APPDATA%\cabal\bin(Windows).
Run stack install or cabal new-install inside the project folder.
Or, to build within the project, run stack build or cabal new-build.
Configure and Run
Make sure the configuration is filled out, see config.example.yaml for an example.
Run myriad (or stack run or cabal new-run if you built within the project) to start the server.
The config and languages folder will default to ./config.yaml and ./languages.
You can configure this with --config and --languages.
Endpoints
GET /languages
List of enabled languages.
Example response:
["haskell", "javascript"]
POST /eval
Evaluate code.
JSON payload with language and code keys.
The language is as in the name of a subfolder in the languages directory.
Example payload:
{ "language": "haskell", "code": "main = print (1 + 1)" }
Example response:
{ "result": "2\n" }
Errors with 404 if language is not found, 504 if evaluation timed out, or 500 if evaluation failed for other reasons.
GET /containers
List of containers being handled by Myriad.
POST /cleanup
Kill all containers, giving back the names of the containers killed.