Документация для проекта taker
This project is maintained by taker-project
Для запуска и компиляции решений, генераторов и т. д. используются специальные программы для запуска (runner). Хотя бы одна программа для запуска должна быть установлена для корректной работы.
Runner взаимодействует с основной системой следующим образом. На stdin передаются параметры в формате JSON. Runner должен запустить другую программу, согласно параметрам и вывести результат работы в формате JSON на stdout. Если входные данные некорректны, то результат неопределен (runner может, например, упасть с ошибкой, вывести сообщение об ошибке на stdout или stderr, либо игнорировать ошибки во вводе).
При запуске runner’а с ключом -? он должен вывести следующую информацию в формате JSON:
"name" (тип string) - название"description" (тип string) - описание"author" (тип string) - автор runner’а"version" (тип string) - версия runner’а"version-number" (тип int) - номер версии runner’а в числовом виде (чем больше число, тем больше номер версии)"license" (тип string) - информация о лицензии. Например, если runner распространяется по лицензии GNU GPL 3 или более поздней, то поле должно иметь значение GPL-3+"features" (тип list) - список дополнительных возможностей. Возможные элементы списка:
isolate: runner поддерживает изолированный запускВходной JSON имеет следующие поля:
"time-limit" (тип double) - ограничения процессорного времени в секундах"idle-limit" (тип double) - ограничения реального времени в секундах"memory-limit" (тип double) - ограничения памяти в мегабайтах"executable" (тип string) - исполняемый файл, который необходимо запустить"clear-env" (тип bool) - равен true, если необходимо очистить переменные среды, false иначе"env" (тип object) - словарь пар ключ/значение, задающий переменные среды, которые добавляются для запускаемой программы"args" (тип array) - массив аргументов запускаемой программы"working-dir" (тип string) - рабочая папка для запускаемой программы (если строка пуста, то используется текущая папка)"stdin-redir" (тип string) - файл, в который будет перенаправлен stdin запускаемой программы (если строка пуста, то программа не должна получать ничего на ввод)"stdout-redir" (тип string) - файл, в который будет перенаправлен stdout запускаемой программы (если строка пуста, то вывод игнорируется)"stderr-redir" (тип string) - файл, в который будет перенаправлен stderr запускаемой программы (если строка пуста, то вывод игнорируется)В случае поддержки изолированного запуска следует учитывать еще и эти поля:
"isolate-dir" (тип string) - папка, вне которой программа не должна иметь доступ к файлам. Исключение составляют:
"stdin-redir", "stdout-redir", "stderr-redir"К этим файлам программа должна иметь доступ, хотя они не обязательно расположены в isolate-dir. Если строка пуста, то используется текущая папка.
"isolate-policy" (тип string) - принимает одно из следующих значений:
none: программа не должна изолироватьсяnormal: программа не должна иметь доступ к файлам, кроме описанных в пункте вышеcompile: программа должна иметь доступ к файлам как normal плюс к системным файлам, необходимым для компиляции. Такое значение isolate-policy используется для компиляторовstrict: программа имеет право только читать из "stdin-redir" и писать в "stdout-redir" и "stderr-redir"; любые другие действия с файлами запрещеныТакже могут присутствовать и дололнительные поля; они должны игнорироваться.
Если какое-либо поле пропущено во вводе, runner может как установить для него некоторое значение по умолчанию (для совместимости со старыми версиями Taker), так и упасть с ошибкой.
Все относительные пути, указанные в параметрах (например, в полях "executable", "stdin-redir", "stdout-redir", "isolate-dir") указаны относительно относительно рабочей папки запускаемой программы. Исключение составляет поле "working-dir", указываемое относительно рабочей папки самого runner’а.
Выходной JSON должен иметь следующие поля:
"time" (тип double) - использованное процессорное время в секундах"clock-time" (тип double) - использованное реальное время в секундах"memory" (тип double) - использованный объем памяти в мегабайтах"exitcode" (тип int) - код возврата запускаемой программы"signal" (тип int) - сигнал, с которым завершилась запускаемая программа (или 0, если программа завершилась без сигнала). Если поле не существует, оно считается равным 0"signal-name" (тип string) - текстовое описание сигнала. Поле необязательно"status" (тип string) - принимает одно из следующих значений:
ok: программа завершилась нормальноtime-limit: превышен предел процессорного времениidle-limit: превышен предел реального времениmemory-limit: превышен предел памятиruntime-error: ошибка во время выполнения (ненулевой exitcode или signal)security-error: программа попыталась обратиться к ресурсам, к которым у нее нет доступа. Такой status характерен для runner’ов, реализующий изолированный (sandboxed) запускrun-fail: невозможно запустить программу (например, ошибка в формате исполняемого файла) либо внутренняя ошибка runner’а"comment" (тип string) - комментарий runner’а (произвольная строка, с помощью которой runner может передать, например, дополнительную информацию об ошибке в случае run-fail). Поле необязательно