Документация для проекта 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
). Поле необязательно