{ "info": { "author": "DMOJ Team", "author_email": "contact@dmoj.ca", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", "Operating System :: POSIX :: BSD :: FreeBSD", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Topic :: Education", "Topic :: Software Development" ], "description": "DMOJ Judge [![amd64 Build Status](https://img.shields.io/github/workflow/status/DMOJ/judge-server/build?logo=github)](https://github.com/DMOJ/judge-server/actions?query=workflow%3Abuild) [![arm64 Build Status](https://img.shields.io/travis/DMOJ/judge-server/master?label=arm64&logo=travis)](https://travis-ci.org/github/DMOJ/judge-server) [![FreeBSD Build Status](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.dmoj.ca%2Fview%2FDMOJ%2Fjob%2Fdmoj-judge-freebsd-py3%2F&logo=freebsd)](https://ci.dmoj.ca/view/DMOJ/job/dmoj-judge-freebsd-py3/) [![Coverage](https://img.shields.io/codecov/c/github/DMOJ/judge-server.svg)](https://codecov.io/gh/DMOJ/judge-server) [![Slack](https://slack.dmoj.ca/badge.svg)](https://slack.dmoj.ca)\n=====\n\nPython [AGPLv3](LICENSE) contest judge backend for the [DMOJ site](http://github.com/DMOJ/online-judge) interface. See it in action at [dmoj.ca](https://dmoj.ca/)!\n\n\n\n\n\n\n
\n\n\n\n\nA modern online judge and contest platform system, supporting IO-based, interactive, and signature-graded tasks,\n with runtime data generators and custom output validators.\n
\n\n## Supported Platforms and Runtimes\n\nThe judge implements secure grading on Linux and FreeBSD machines.\n\n| | Linux \t| FreeBSD \t|\n|------\t|-------\t|---------\t|\n| x64 \t| [\u2714](https://travis-ci.org/DMOJ/judge-server) \t| [\u2714](https://ci.dmoj.ca/job/dmoj-judge-freebsd/) \t|\n| x86 \t| \u2714 \t| \u00af\\\\\\_(\u30c4)\\_/\u00af |\n| x32 \t| \u2714 \t| — \t|\n| ARM \t| \u2714 \t| \u274c \t|\n\nVersions up to and including [v1.4.0](https://github.com/DMOJ/judge-server/releases/tag/v1.4.0) also supported grading on Windows machines.\n\nThe DMOJ judge does **not** need a root user to run on Linux machines: it will run just fine under a normal user.\n\nSupported languages include:\n* C++ 11/14/17/20 (GCC and Clang)\n* C 99/11\n* Java 8/9/10/11/15\n* Python 2/3\n* PyPy 2/3\n* Pascal\n* Perl\n* Mono C#/F#/VB\n\nThe judge can also grade in the languages listed below. These languages are less tested and more likely to be buggy.\n* Ada\n* AWK\n* COBOL\n* D\n* Dart\n* Fortran\n* Forth\n* Go\n* Groovy\n* Haskell\n* INTERCAL\n* Kotlin\n* Lua\n* NASM\n* Objective-C\n* OCaml\n* PHP\n* Pike\n* Prolog\n* Racket\n* Ruby\n* Rust\n* Scala\n* Chicken Scheme\n* sed\n* Steel Bank Common Lisp\n* Swift\n* Tcl\n* Turing\n* V8 JavaScript\n* Brain\\*\\*\\*\\*\n* Zig\n\n## Installation\nInstalling the DMOJ judge creates two executables in your Python's script directory: `dmoj` and `dmoj-cli`.\n`dmoj` is used to connect a judge to a DMOJ site instance, while `dmoj-cli` provides a command-line interface to a\nlocal judge, useful for testing problems.\n\nFor more detailed steps, read the [installation instructions](https://docs.dmoj.ca/#/judge/setting_up_a_judge).\n\nNote that **the only officially-supported Linux distribution is the latest Debian**, with the default `apt` versions of all runtimes. This is [what we run on dmoj.ca](https://dmoj.ca/runtimes/matrix/), and it should \"just work\". While the judge will likely still work with other distributions and runtime versions, some runtimes might fail to initialize. In these cases, please [file an issue](https://github.com/DMOJ/judge-server/issues).\n\n### Stable Build\n[![PyPI version](https://badge.fury.io/py/dmoj.svg)](https://pypi.python.org/pypi/dmoj)\n[![PyPI](https://img.shields.io/pypi/pyversions/dmoj.svg)](https://pypi.python.org/pypi/dmoj)\n\nWe periodically publish builds [on PyPI](https://pypi.python.org/pypi/dmoj). This is the easiest way to get started,\nbut may not contain all the latest features and improvements.\n\n```\n$ pip install dmoj\n```\n\n### Bleeding-Edge Build\nThis is the version of the codebase we run live on [dmoj.ca](https://dmoj.ca).\n\n```\n$ git clone --recursive https://github.com/DMOJ/judge-server.git\n$ cd judge-server\n$ pip install -e .\n```\n\nSeveral environment variables can be specified to control the compilation of the sandbox:\n\n* `DMOJ_USE_SECCOMP`; set it to `no` if you're building on a pre-Linux 3.5 kernel to disable `seccomp` filtering in favour of pure `ptrace` (slower).\n This flag has no effect when building outside of Linux.\n* `DMOJ_TARGET_ARCH`; use it to override the default architecture specified for compiling the sandbox (via `-march`).\n Usually this is `native`, but will not be specified on ARM unless `DMOJ_TARGET_ARCH` is set (a generic, slow build will be compiled instead).\n\n### With Docker\nWe maintain Docker images with all runtimes we support in the [runtimes-docker](https://github.com/DMOJ/runtimes-docker) project.\n\nRuntimes are split into three tiers of decreasing support. Tier 1 includes\nPython 2/3, C/C++ (GCC only), Java 8, and Pascal. Tier 3 contains all the\nruntimes we run on [dmoj.ca](https://dmoj.ca). Tier 2 contains some in-between\nmix; read the `Dockerfile` for each tier for details. These images are rebuilt\nand tested every week to contain the latest runtime versions.\n\nThe script below spawns a tier 1 judge image. It expects the relevant\nenvironment variables to be set, the network device to be `enp1s0`, problems\nto be placed under `/mnt/problems`, and judge-specific configuration to be in\n`/mnt/problems/judge.yml`. Note that runtime configuration is already done for you,\nand will be merged automatically into the `judge.yml` provided.\n\n```\n$ git clone --recursive https://github.com/DMOJ/judge-server.git\n$ cd judge-server/.docker\n$ make judge-tier1\n$ exec docker run \\\n --name judge \\\n -p \"$(ip addr show dev enp1s0 | perl -ne 'm@inet (.*)/.*@ and print$1 and exit')\":9998:9998 \\\n -v /mnt/problems:/problems \\\n --cap-add=SYS_PTRACE \\\n -d \\\n --restart=always \\\n dmoj/judge-tier1:latest \\\n run -p15001 -s -c /problems/judge.yml \\\n \"$BRIDGE_ADDRESS\" \"$JUDGE_NAME\" \"$JUDGE_KEY\"\n```\n\n## Usage\n### Running a Judge Server\n```\n$ dmoj --help\nusage: dmoj [-h] [-p SERVER_PORT] -c CONFIG [-l LOG_FILE] [--no-watchdog]\n [-a API_PORT] [-A API_HOST] [-s] [-k] [-T TRUSTED_CERTIFICATES]\n [-e ONLY_EXECUTORS | -x EXCLUDE_EXECUTORS] [--no-ansi]\n server_host [judge_name] [judge_key]\n\nSpawns a judge for a submission server.\n\npositional arguments:\n server_host host to connect for the server\n judge_name judge name (overrides configuration)\n judge_key judge key (overrides configuration)\n\noptional arguments:\n -h, --help show this help message and exit\n -p SERVER_PORT, --server-port SERVER_PORT\n port to connect for the server\n -c CONFIG, --config CONFIG\n file to load judge configurations from\n -l LOG_FILE, --log-file LOG_FILE\n log file to use\n --no-watchdog disable use of watchdog on problem directories\n -a API_PORT, --api-port API_PORT\n port to listen for the judge API (do not expose to\n public, security is left as an exercise for the\n reverse proxy)\n -A API_HOST, --api-host API_HOST\n IPv4 address to listen for judge API\n -s, --secure connect to server via TLS\n -k, --no-certificate-check\n do not check TLS certificate\n -T TRUSTED_CERTIFICATES, --trusted-certificates TRUSTED_CERTIFICATES\n use trusted certificate file instead of system\n -e ONLY_EXECUTORS, --only-executors ONLY_EXECUTORS\n only listed executors will be loaded (comma-separated)\n -x EXCLUDE_EXECUTORS, --exclude-executors EXCLUDE_EXECUTORS\n prevent listed executors from loading (comma-\n separated)\n --no-ansi disable ANSI output\n --skip-self-test skip executor self-tests\n```\n\n### Running a CLI Judge\n```\n$ dmoj-cli --help\nusage: dmoj-cli [-h] -c CONFIG\n [-e ONLY_EXECUTORS | -x EXCLUDE_EXECUTORS]\n [--no-ansi]\n\nSpawns a judge for a submission server.\n\noptional arguments:\n -h, --help show this help message and exit\n -c CONFIG, --config CONFIG\n file to load judge configurations from\n -e ONLY_EXECUTORS, --only-executors ONLY_EXECUTORS\n only listed executors will be loaded (comma-separated)\n -x EXCLUDE_EXECUTORS, --exclude-executors EXCLUDE_EXECUTORS\n prevent listed executors from loading (comma-\n separated)\n --no-ansi disable ANSI output\n --skip-self-test skip executor self-tests\n```\n\n## Documentation\nFor info on the problem file format and more, [read the documentation.](https://docs.dmoj.ca)", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/DMOJ/judge-server", "keywords": "online-judge", "license": "", "maintainer": "", "maintainer_email": "", "name": "dmoj", "package_url": "https://pypi.org/project/dmoj/", "platform": "", "project_url": "https://pypi.org/project/dmoj/", "project_urls": { "Homepage": "https://github.com/DMOJ/judge-server" }, "release_url": "https://pypi.org/project/dmoj/3.0.2/", "requires_dist": null, "requires_python": "", "summary": "The judge component of the DMOJ: Modern Online Judge platform", "version": "3.0.2", "yanked": false, "yanked_reason": null }, "last_serial": 11426646, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "ad993676dd5c881b6b64899b72f91137", "sha256": "94b5f0444082c29cdfd05ca6778c06a195d940ee707dbc062ca4e6d2892a4a05" }, "downloads": -1, "filename": "dmoj-1.0.0.tar.gz", "has_sig": false, "md5_digest": "ad993676dd5c881b6b64899b72f91137", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 224582, "upload_time": "2017-12-02T05:49:22", "upload_time_iso_8601": "2017-12-02T05:49:22.017769Z", "url": "https://files.pythonhosted.org/packages/3a/7e/9f41d4e180f3b053847a3d43d65dc1715c51450147f62604c4e669a03303/dmoj-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "0a695339714ef0231bed82a0544e2c43", "sha256": "0ed6b114ed7c5a7a37ad75f6210ce92dc6d319e57383f0e27a31d2c61a414bbc" }, "downloads": -1, "filename": "dmoj-1.0.3.tar.gz", "has_sig": false, "md5_digest": "0a695339714ef0231bed82a0544e2c43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 224868, "upload_time": "2017-12-02T08:05:55", "upload_time_iso_8601": "2017-12-02T08:05:55.468305Z", "url": "https://files.pythonhosted.org/packages/f7/69/809651ff296e08a70a23156c3472b3ea6fbfc052222f5827802a35dd4d0e/dmoj-1.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "7035c446bd47e35e77bdaf265a465af8", "sha256": "d28a17676e9ac86ed57645e5083856bb0a2fec21373a226869e582a2f47ae7b0" }, "downloads": -1, "filename": "dmoj-1.0.4.tar.gz", "has_sig": false, "md5_digest": "7035c446bd47e35e77bdaf265a465af8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 229432, "upload_time": "2017-12-02T09:37:02", "upload_time_iso_8601": "2017-12-02T09:37:02.359842Z", "url": "https://files.pythonhosted.org/packages/78/50/2428662f42edb5a5a51e9f406b1e4a315c51c76912ae35802f5d7f0a9d4f/dmoj-1.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "2bbf7e9d195314aa9f3349398ecf53bc", "sha256": "ef5aa27bf70fd1b92dfe6e42e47c01d2dd56ffa2c9aea6958b01a14590f86241" }, "downloads": -1, "filename": "dmoj-1.0.5.tar.gz", "has_sig": false, "md5_digest": "2bbf7e9d195314aa9f3349398ecf53bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 229577, "upload_time": "2017-12-03T00:51:49", "upload_time_iso_8601": "2017-12-03T00:51:49.056236Z", "url": "https://files.pythonhosted.org/packages/94/e4/919c34f996c8c5deb262acbfcd9bfcc24caa5f34bf95c33e41c3c057e6d9/dmoj-1.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "3b06d945ff03efe56313b8b5f500efb9", "sha256": "9962f01b63f6be3bc8dbf1a165593a0baa2e3e60ec893066b53ba1a71bfb0e42" }, "downloads": -1, "filename": "dmoj-1.1.0.tar.gz", "has_sig": false, "md5_digest": "3b06d945ff03efe56313b8b5f500efb9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 224999, "upload_time": "2017-12-09T22:07:57", "upload_time_iso_8601": "2017-12-09T22:07:57.625996Z", "url": "https://files.pythonhosted.org/packages/57/f8/dbfaa8c7dca0a591926109718079090261f9dfbee2aada7753dea5594378/dmoj-1.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "df1cf62f8f74ff17237245e3a3ef0a9e", "sha256": "2ec882af02e0f81714b05eb54cb24c624a3f36e835051a37489bf45cf23291c9" }, "downloads": -1, "filename": "dmoj-1.2.0.tar.gz", "has_sig": false, "md5_digest": "df1cf62f8f74ff17237245e3a3ef0a9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 240138, "upload_time": "2018-04-22T02:04:55", "upload_time_iso_8601": "2018-04-22T02:04:55.355762Z", "url": "https://files.pythonhosted.org/packages/be/a9/d435e072682c4cb584cd641b070274a8a45edc37a1256d6dd1bb189372e8/dmoj-1.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "b7128dce3a7290d90bde6e948c437941", "sha256": "d85855841352a91454a24b1cc184eb85b314746f2b76570321ceff61a417faa1" }, "downloads": -1, "filename": "dmoj-1.3.0.tar.gz", "has_sig": false, "md5_digest": "b7128dce3a7290d90bde6e948c437941", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 242959, "upload_time": "2018-11-21T03:32:24", "upload_time_iso_8601": "2018-11-21T03:32:24.175035Z", "url": "https://files.pythonhosted.org/packages/fb/89/f09bcf9d6409e2bb85944f675809a2d17c8dff22887bdfdad04c60c71a6a/dmoj-1.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "e6eda9cdc49c516c8f65308007a599fc", "sha256": "15705dd94866bf7f2b8e0dbb9a3b1258ae1cb30650eab78cbe48b6eeb13628d0" }, "downloads": -1, "filename": "dmoj-1.4.0.tar.gz", "has_sig": false, "md5_digest": "e6eda9cdc49c516c8f65308007a599fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 254402, "upload_time": "2019-09-15T20:03:08", "upload_time_iso_8601": "2019-09-15T20:03:08.878940Z", "url": "https://files.pythonhosted.org/packages/c7/d2/4663f01f39b2ef62f2569551734251acf95c27a7564d60e51d2e67856a9a/dmoj-1.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "90cf15484cb0b3d7d0c9907d4f952cae", "sha256": "f8e778b9f1f8dcc342a62556ef32f41e6ebe907bcdb50d6fc0bbe1ceadf2f4d5" }, "downloads": -1, "filename": "dmoj-2.0.0.tar.gz", "has_sig": false, "md5_digest": "90cf15484cb0b3d7d0c9907d4f952cae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 178269, "upload_time": "2019-10-29T05:27:42", "upload_time_iso_8601": "2019-10-29T05:27:42.948628Z", "url": "https://files.pythonhosted.org/packages/3b/2a/36f945258629445ba1619386fe923e5011eb91a08e6111e765ad8433f4bf/dmoj-2.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "2db1cabd66880340db9a2d8a9e5ee30f", "sha256": "6f1fca16fe6d1fdda7dc7da465ee8f70540e64eee068c7e0ec26e4a2c991cae8" }, "downloads": -1, "filename": "dmoj-2.1.0.tar.gz", "has_sig": false, "md5_digest": "2db1cabd66880340db9a2d8a9e5ee30f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 183728, "upload_time": "2020-05-11T20:12:51", "upload_time_iso_8601": "2020-05-11T20:12:51.914467Z", "url": "https://files.pythonhosted.org/packages/7a/27/3e25cf59b925ade3c0b66547c4605b54294ac5aff0843e021109d6de1af5/dmoj-2.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "889d7d5d83191af8db3b0aa2ad8f7932", "sha256": "9f964d186963f0391cfeeebe54ff2094dd5f3dca3f4173a258a8743820c63c1a" }, "downloads": -1, "filename": "dmoj-3.0.0.tar.gz", "has_sig": false, "md5_digest": "889d7d5d83191af8db3b0aa2ad8f7932", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 187501, "upload_time": "2021-02-28T01:15:57", "upload_time_iso_8601": "2021-02-28T01:15:57.774398Z", "url": "https://files.pythonhosted.org/packages/e6/ee/db05c20c049fb07ab1fe5f51236255b735465814364cd1e0c12d17249ae9/dmoj-3.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.1": [ { "comment_text": "", "digests": { "md5": "aa2df656d0746822c2b1bd1fda585a80", "sha256": "82bd2536e84fa9083172a72cb2f9e9184599d1fd81c11fa6f7cdb99f45b5d5b7" }, "downloads": -1, "filename": "dmoj-3.0.1.tar.gz", "has_sig": false, "md5_digest": "aa2df656d0746822c2b1bd1fda585a80", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 197097, "upload_time": "2021-02-28T01:28:00", "upload_time_iso_8601": "2021-02-28T01:28:00.306604Z", "url": "https://files.pythonhosted.org/packages/0f/9e/c144c178ff7b55da6b2eb649d4f3470b67338c85ef50b652cceccc14166c/dmoj-3.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "3.0.2": [ { "comment_text": "", "digests": { "md5": "d1abe08a31cd760874826a225000c6d7", "sha256": "7093141798741dd4344c457b7462c200b33e0f38b14d71de2b3ac6c1e6f9f6cb" }, "downloads": -1, "filename": "dmoj-3.0.2.tar.gz", "has_sig": false, "md5_digest": "d1abe08a31cd760874826a225000c6d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 202372, "upload_time": "2021-09-12T00:14:36", "upload_time_iso_8601": "2021-09-12T00:14:36.254073Z", "url": "https://files.pythonhosted.org/packages/a2/6e/2192f83714165dccbf82f507e18ba381fa3543093f1d92302c0f2202c7c4/dmoj-3.0.2.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d1abe08a31cd760874826a225000c6d7", "sha256": "7093141798741dd4344c457b7462c200b33e0f38b14d71de2b3ac6c1e6f9f6cb" }, "downloads": -1, "filename": "dmoj-3.0.2.tar.gz", "has_sig": false, "md5_digest": "d1abe08a31cd760874826a225000c6d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 202372, "upload_time": "2021-09-12T00:14:36", "upload_time_iso_8601": "2021-09-12T00:14:36.254073Z", "url": "https://files.pythonhosted.org/packages/a2/6e/2192f83714165dccbf82f507e18ba381fa3543093f1d92302c0f2202c7c4/dmoj-3.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }