Версия 2.1.34 (20050108) ======================== Если в результате тестирования этой версии не будет обнаружено ошибок, следующая версия (полностью совпадающая с текущей) получит номер 2.2.0. Таким образом произойдёт переход к новой стабильной версии системы ejudge. В данной версии исправлено значительное количество ошибок и внесены некоторые улучшения во все программы системы. Реализованы новые программы, в частности управление турниром из командной строки. Начата работа по переносу программ `compile' и `run' на платформу Windows. Вся серверная часть по-прежнему пока работает только под Linux. Перенос `compile' и `run' позволит сделать доступными участникам все системы и языки программирования, доступные для Windows. Естественно, для компиляции и проверки потребуется (помимо сервера) компьютер под Windows. Работы предполагается завершить в следующей версии системы. configure --------- Добавлена опция `--enable-super-serve-socket', которая позволяет установить путь по умолчанию к командному сокету программы `super-serve'. Эта программа принимает команды управления турнирами через указанный Unix-сокет аналогично программам `userlist-server' и `serve'. На данный момент поддержка управляющих команд реализована лишь частично и не рекомендуется для использования. Окончательная реализация предполагается в следующей версии. ejudge-setup ------------ Поддерживается редактирования значения пути к командному сокету программы `super-serve' (см. опцию `--enable-super-serve-socket' выше). serve-cmd --------- Новая программа, предназначенная для управления сервером турнира `serve' из командной строки. На настоящий момент реализовано подмножество команд управления турниром, доступных через интерактивную CGI-программу `master'. Программа serve-cmd поддерживает следующие команды управления турниром из командной строки: serve-cmd CONTEST-ID login SESSION-ID-FILE LOGIN PASSWORD Команда входа в систему. Данную команду необходимо выполнить до любой операции. Здесь CONTEST-ID - это идентификатор турнира, то есть число. SESSION-ID-FILE - это имя файла, в который будет записан идентификатор сессии (cookie). Файл с идентификатором сессии необходимо будет указать во всех командах. LOGIN - регистрационное имя пользователя, PASSWORD - пароль пользователя. Пользователь должен иметь биты полномочий MASTER_LOGIN или JUDGE_LOGIN для данного турнира. serve-cmd CONTEST-ID logout SESSION-ID-FILE Команда завершения работы. После выполнения данной команды идентификатор сессии, находящийся в файле SESSION-ID-FILE, становится недействительным. Если команда logout не выполнена, идентификатор сессии действует 24 часа с момента выполнения команды login. serve-cmd CONTEST-ID write-xml-runs SESSION-ID-FILE Данная команда выводит на стандартный поток вывода журнал посылок во внутреннем формате. См. далее описание команды "write XML runs" в документации на CGI-программу `master'. serve-cmd CONTEST-ID export-xml-runs SESSION-ID-FILE Данная команда выводит на стандартный поток вывода журнал посылок во внешнем формате. См. далее описание команды "export XML runs" в документации на CGI-программу `master'. serve-cmd CONTEST-ID dump-runs SESSION-ID-FILE Данная команда выводит на стандартный поток вывода журнал посылок в формате CSV, то есть в формате, в котором одна запись занимает одну строку, а поля записи разделяются символом ';' (точка с запятой). См. далее описание команды "dump XML runs" в документации на CGI-программу `master'. serve-cmd CONTEST-ID soft-update-stand SESSION-ID-FILE Данная команда обновляет таблицу текущих результатов. При этом учитывается промежуток времени, когда таблица текущих результатов не должна обновляться. В это время данная команда не производит никакого эффекта. Эта команда может использоваться после того, когда в турнир были проимпортированы новые посылки с помощью команды import-xml-runs. serve-cmd CONTEST-ID import-xml-runs SESSION-ID-FILE XML-FILE Данная команда импортирует новые посылки в работающий турнир. XML-FILE - это файл с XML-журналом посылок, который может быть либо во внешнем, либо во внутреннем формате. См. далее описание команды "import XML runs" в документации на CGI-программу `master'. Обратите внимание, что команда import-xml-runs не выполнится, если в текущий момент в турнире, в который импортируются посылки, есть посылки в состоянии компиляции или выполнения. serve-cmd CONTEST-ID dump-source SESSION-ID-FILE RUN-ID Данная команда выводит на стандартный поток вывода исходный код посылки с номером RUN-ID. serve-cmd CONTEST-ID dump-report SESSION-ID-FILE RUN-ID Данная команда выводит на стандартный поток вывода судейский протокол тестирования посылки с номером RUN-ID. serve-cmd CONTEST-ID dump-team-report SESSION-ID-FILE RUN-ID Данная команда выводит на стандартный поток вывода пользовательский протокол тестирования посылки с номером RUN-ID. serve-cmd CONTEST-ID dump-master-runs SESSION-ID-FILE FILTER-EXPR FIRST-RUN LAST-RUN Данная команда выводит на стандартный поток вывода список посылок, удовлетворяющих заданному критерию, как при задании выражения фильтра на главной странице программы `master'. FILTER-EXPR - это выражение фильтра, описание которого дано в соответствующем разделе документации. FIRST-RUN - это номер первой посылки, а LAST-RUN - это номер последней посылки. Отобранные посылки выводятся в формате CSV, в котором каждая запись занимает одну строку текста, а поля записи разделены символом '&'. Этот символ используется, так как он не может использоваться в полях. Запись имеет следующие поля: [0] run_id [1] imported_flag [2] hidden_flag [3] read_only_flag [4] absolute_time [5] absolute_time_nsec [6] time_from_start [7] ip_address [8] size [9] hash_value [10] user_id [11] user_login [12] user_name [13] problem [14] variant [15] language [16] language_suffix [17] status_num [18] status_str [19] tests_passed/failed_test [20] score_gained [21] base_score [22] score_multiplier [23] attempt [24] run_penalty [25] date_penalty [26] score_adjustment serve-control ------------- Новая CGI-программа для управлением сервером серверов турнира `super-serve'. Программа `serve-control' использует управляющий сокет программы `super-serve' для взаимодействия аналогично тому, как программа `master' использует управляющий сокет для взаимодействия с программой `serve'. Путь по умолчанию к управляющему сокету программы `super-serve' задаётся с помощью опции `--enable-super-serve-socket' скрипта `configure'. В текущей версии системы ejudge требуемая функциональность реализована в `serve-control' лишь частично. Так, в настоящее время доступны лишь функции просмотра состояния турнира. Для работы с программой `serve-control' у пользователя должен быть установлен бит MASTER_LOGIN или JUDGE_LOGIN в глобальном конфигурационном файле `ejudge.xml'. slice-userlist -------------- Новая программа, которая строит "срез" базы пользователей по указанному множеству турниров. Программа используется следующим образом: slice-userlist [ -i CONTEST ]... [CONFIG_FILE] здесь CONFIG_FILE - это путь к конфигурационному файлу ejudge.xml. Если путь к конфигурационному файлу совпадает с указанным в опции `--enable-ejudge-xml' скрипта `configure', то есть с путём по умолчанию, то путь CONFIG_FILE можно не указывать. CONTEST - это номер турнира. Опция -i может быть указана несколько раз. В этом случае в "срез" базы пользователей попадут все пользователи, зарегистрированные хотя бы в одном из указанных турниров. Срез базы печатается на стандартный поток вывода. Пример использования программы: slice-userlist -i 10 -i 12 Обратите внимание, что для построения среза используется база пользователей, находящяяся в файле базы, а не её текущее состояние, хранящееся в памяти программы `userlist-server'. Если состояние в памяти и состояние в файле рассогласованы, срез базы окажется построенным по файлу, то есть будет немного устаревшим. run --- Исправлена ошибка, которая приводила к аварийному завершению программы `run' по нехватке памяти в случае, если тестируемая программа генерировала очень большой вывод на стандартный поток вывода или стандартный поток ошибок (размер файла вывода должен составлять 10 и более Мб в зависимости от размера оперативной памяти). В предыдущей версии все выходные файлы тестируемой программы считывались в память, а в текущей версии считываются в память только файлы, размер которых не превышает максимального размера, задаваемого с помощью глобальной конфигурационной переменной `max_file_length' конфигурационного файла `serve.cfg'. serve ----- В случае, если в момент времени, на который было запланировано начало турнира (scheduled start time), программа `serve' не работала, а была запущена позднее, в качестве времени начала турнира устанавливается запланированное время старта турнира, а не текущее время, как в предыдущей версии. serve ----- Исправлены многочисленные ошибки в коде слияния журналов посылки (import XML logs). В частности, исправлена ошибка, приводившая к очистке архивов посылок при слиянии журналов. Исправлена ошибка, приводившая к появлению дубликатов записей в журнале посылок. serve,master,judge ------------------ Добавлен новый статус посылки RUN_DISQUALIFIED (дисквалифицирован). Статус может использоваться, например, для снятия "списанных" посылок. Статус DISQUALIFIED аналогичен статусу IGNORED, но при подсчёте очков учитывается как одна попытка, и соответственно, за неё начисляется штраф, задаваемый параметром run_penalty секции описания задачи конфигурационного файла serve.cfg. В выражении фильтра посылок данный статус задаётся как DQ, например, "status == DQ". contest.xml ----------- В формат конфигурационного файла описания турнира добавлены три новых элемента: , , и новый атрибут "invisible" элемента . Атрибут "invisible" элемента может принимать значения "yes" или "no". Если атрибут установлен в "yes", то данный турнир не отображается в списке турниров в программе `serve-control'. Значение атрибута по умолчанию - "no". Элемент позволяет задать ограничение на IP-адрес для управления турниром с помощью программы `serve-control'. Элемент позволяет задать пользователя, под которым будет запускаться программа `run', если турнир управляется программой `super-serve', а элемент позволяет задать группу, под которой будет запускаться программа `run'. Если какой-либо из элементов не задан, будет использоваться значение соответствующего элемента или , а если и они не заданы, программа `run' будет запускаться под тем же пользователем/группой, под которой запущена программа `super-serve'. serve ----- Исправлена ошибка, которая не позволяла сравнивать программы, которые хранились в сжатом виде. В предыдущей версии выдавалась ошибка "System call failed". userlist.xml ------------ Добавлен новый атрибут "privileged" элемента описания пользователя. Атрибут может принимать значения "yes" или "no" (по умолчанию - "no"). Если атрибут установлен в "yes", данный пользователь считается привилегированным, то есть для того, чтобы выполнить действие с этим пользователем, необходим более высокий уровень полномочий, чем для обычного пользователя. Например, чтобы редактировать данные обычных пользователей достаточно бита полномочий EDIT_USER, а для редактирования привилегированных пользователей необходим бит полномочий PRIV_EDIT_USER. edit-userlist ------------- Поддерживается редактирование атрибута "privileged" (см. выше). userlist-server --------------- Поддерживается редактирование атрибута "privileged" пользователей. Пользователь, у которого атрибут "privileged" не установлен, не может устанавливать или сбрасывать этот атрибут у других пользователей. Привилегированный пользователь может только установить атрибут "privileged", но не сбросить его. ejudge.xml ---------- В конфигурационный файл системы ejudge добавлены новые элементы - путь к управляющему сокету программы super-serve, - идентификатор системного пользователя, под которым будет запущена программа super-serve, - идентификатор системной группы, под которой будет запущена программа super-serve, - идентификатор системного пользователя, под которым будет запущена программа userlist-server, - идентификатор системной группы, под которой будет запущена программа userlist-server. В текущей версии системы запуск программ userlist-server и super-serve под другими идентификаторами пользователей пока не поддерживается. serve,master,judge ------------------ В журнал посылок добавлено поле `score_adj'. Данное поле используется в режимах турнира KIROV или OLYMPIAD и хранит дополнительную поправку к количеству баллов за посылку, полученному в результате автоматического тестирования. Поле `score_adj' может принимать значения от -128 до 127 (1 знаковый байт). Например, если по результатам автоматического тестирования посылка получила 50 баллов, а дополнительная поправка score_adj для данной посылки равна -20 баллам, посылка будет оценена в 30 баллов, из которых будет затем вычтен штраф за попытки или за время сдачи. Если значение score_adj положительно и получается, что балл за посылку превышает максимальный балл, установленный в конфигурационной переменной `full_score' описания задачи, такая посылка будет оценена в полный бал, как установлено переменной `full_score'. Добавлена новая конфигурационная переменная `score_multiplier' секции описания задачи конфигурационного файла `serve.cfg'. Эта переменная позволяет задать коэффициент, на который будет умножено количество баллов, заданное в поле `score' записи в журнале посылок. По умолчанию значение мультипликатора равно 1. Таким образом, балл за посылку в системе KIROV или OLYMPIAD вычисляется по следующей формуле: S = I * M - A * P + D + J здесь I - исходное количество баллов, хранящееся в поле `score', то есть, как правило, количество баллов, полученное в результате автоматического тестирования. Обратите внимание, что если статус посылки - OK, и для данной задачи не установлена конфигурационная переменная `variable_full_score', то в качестве исходного количества баллов всегда будет выбран полный балл за задачу (переменная `full_score' секции описания задачи) независимо от значения поля `score' записи в журнале посылок. M - это мультипликатор (переменная `score_multiplier' секции описания задачи, или 1 по умолчанию). A - количество предыдущих попыток по данной задаче данного пользователя. P - штраф за одну попытку (переменная `run_penalty' секции описания задачи). D - календарный штраф (переменная `date_penalty' секции описания задачи). J - дополнительная поправка к баллам (переменная score_adj секции описания задачи). Полученное значение S не может быть большее значения переменной `full_score' секции описания задачи (тогда берётся значение `full_score') либо быть меньше 0 (берётся 0). serve,master,judge,team ----------------------- В режиме турнира KIROV или OLYMPIAD в поле "баллы" таблицы посылок пользователя отображается формула, по которой вычислялись баллы за данную посылку. Формула отображается следующим образом: S (то есть просто количество баллов), если M == 1 && (A == 0 || P == 0) && D == 0 && J == 0, то есть тогда, когда исходное количество баллов I не модифицируется. Второй вид отображения формулы - полный: S = I [ * M ] [ - A * P ] [ +/- D ] [ +/- J ] если M == 1, то соответствующая часть формулы не отображается, аналогично для A * P == 0, D == 0, J == 0. serve,master,judge ------------------ Для поддержки новых возможностей управления пользователями переработана страница просмотра участников турнира. Теперь вместо трёх кнопок "Ban", "Make Invisible" и т. д. добавлена ссылка на страницу отображения информации об участнике. На странице отображения информации об участнике отображаются его идентификатор, регистрационное имя, является ли данный пользователь привилегированным, является ли он невидимым и кнопка изменения статуса невидимости (если текущий пользователь имеет достаточно полномочий), является ли участник дисквалифицированным (banned) и кнопка изменения статуса дисквалификации (если текущий пользователь имеет достаточно полномочий), является ли участник заблокированным (locked) и кнопка изменения статуса блокировки, количество посылок, общий размер посылок, количество сообщений, общий размер сообщений, общее число напечатанных страниц, дополнительный статус участника (см. ниже) и кнопка изменения дополнительного статуса участника (если достаточно полномочий), общее количество предупреждений (см. ниже), все вынесенные предупреждения, а также форма нового предупреждения (если достаточно полномочий). Поддерживается возможность выносить участникам турнира предупреждения (например, за нарушение правил и т. п.). Чтобы пользователь мог просматривать список участников турнира, он должен иметь полномочия MASTER_LOGIN или JUDGE_LOGIN и LIST_CONTEST_USERS. Чтобы пользователь мог просматривать подробную информацию об участниках, он должен дополнительно иметь полномочия GET_USER. Чтобы иметь возможность изменять параметры участника турнира (то есть делать невидимым, выносить предупреждения, менять статус и т. д.), необходим бит полномочий EDIT_REG. serve ----- Добавлена возможность спецификации дополнительного статуса участника. Дополнительный статус - это произвольная строка. Множество дополнительных статусов участников задаётся в конфигурационном файле турнира serve.cfg, далее на страцице просмотра и редактирования информации об участнике статус может быть изменён. Общее количество различных статусов задаётся с помощью глобальной конфигурационной переменной `contestant_status_num', затем с помощью конфигурационной переменной `contestant_status_legend' должны быть заданы строки для всех статусов. Первый статус получает номер 0, второй - 1 и т. д. Каждый участник турнира получит статус по умолчанию, равный 0, который затем может быть изменён. Пример задания статусов: contestant_status_num = 3 contestant_status_legend = "Status 0" contestant_status_legend = "Status 1" contestant_status_legend = "Status 2" Дополнительно для части или всех статусов может быть задан HTML-атрибут, с которым будет отображаться строка таблицы текущих результатов участников турнира с данным статусом. Для этого используется глобальная конфигурационная переменная `contestant_status_row_attr'. Переменная может не использоваться в конфигурационном файле, но если она используется, дополнительные атрибуты должны быть заданы для всех статусов. Дополнительные атрибуты задаются в том же порядке, что и значения статусов, например: contestant_status_row_attr = ' bgcolor="#ff00ff"' contestant_status_row_attr = "" contestant_status_row_attr = ' bgcolor="#00ff00"' установит для статуса `Status 0' дополнительный атрибут строки ` bgcolor="#ff00ff"', для статуса `Status 2' - ` bgcolor="#00ff00"', а для `Status 1' - пустая строка, что эквивалентно отсутствию атрибута. Обратите внимание на пробел в начале значения атрибута. Он необходим для разделения тега HTML-таблицы и дополнительного атрибута. С помощью глобальной переменной `stand_show_contestant_status' можно включить отображение столбца статуса участников. Для каждого участника будет напечатан его статус, как задано в переменной `contestant_status_legend'. С помощью глобальной конфигурационной переменной `stand_contestant_status_attr' можно задать дополнительные атрибуты этого столбца, например: stand_show_contestant_status stand_contestant_status_attr = ' width = "10%"' Обратите внимание на пробел в начале значения атрибута. Он необходим для разделения тега и значения атрибута. serve,master,judge,team ----------------------- Добавлена возможность вынесения участникам турнира предупреждений. Каждое вынесенное участнику предупреждение отображается на его персональной странице в её начале. Участнику доступен основной текст предупреждения и время отправки предупреждения. Если пользователь имеет достаточно полномочий для просмотра подробной информации об участнике (т. е. установлены биты полномочий MASTER_LOGIN/JUDGE_LOGIN + LIST_CONTEST_USERS + GET_USER, на странице подробной информации для участника турнира отображаются предупреждения, вынесенные участнику, при этом отображается: 1) время выдачи предупреждения, 2) имя пользователя, который выдал предупреждение, 3) IP-адрес компьютера, с которого было выдано предупреждение, 3) основной текст предупреждения, 4) дополнительный текст предупреждения, доступный только привилегированным пользователям. Если пользователь к тому же имеет бит полномочий EDIT_REG, он может выносить предупреждения. Для этого он должен задать основной текст предупреждения, который будет доступен участнику, и может задать дополнительный текст предупреждения, который будет доступен только привилегированным пользователям. Затем необходимо нажать кнопку "Issue Warning". Если установлена глобальная конфигурационная переменая `stand_show_warn_number' (см. ниже) файла `serve.cfg', в таблице текущих результатов отображается общее количество предупреждений, полученных каждым участником. serve ----- Добавлена новая глобальная конфигурационная переменная `stand_show_warn_number'. Если эта переменная установлена, в таблице текущих результатов печатается столбец с общим количеством предупреждений для каждого участника. С помощью глобальной конфигурационной переменной `stand_warn_number_attr' можно задать HTML-атрибуты этого столбца, например: stand_show_warn_number stand_warn_number_attr = ' width = "5%"' Обратите внимание на пробел в начале значения атрибута. Он необходим для разделения тега и значения атрибута. serve ----- Для хранения предупреждений и статуса участника турнира изменён формат XML-файла дополнительной информации об участнике. Формат совместим снизу вверх с форматом предыдущей версии программы ejudge. В формат добавлены новые элементы , , , , и новые атрибуты "ussuer_id", "issuer_ip", "date" для элемента . serve ----- При генерации таблицы текущих результатов невиртуальных турниров посылки, время которых больше текущего времени, игнорируются. Такая ситуация может возникать при проведении турнира в нескольких точках, когда моменты начала турнира существенно различаются. serve ----- Если в архивных каталогах отсутствует какой-либо файл (исходный текст, протокол или пользовательский протокол), при попытке его просмотра выдаётся ошибка, что файл не существует, вместо ошибки "System call failed". serve ----- Добавлена конфигурационная переменная `personal_deadline' секции описания задачи конфигурационного файла `serve.cfg'. Данная переменная позволяет устанавливать крайний строк сдачи данной задачи для указанного пользователя. Переменная может быть использована несколько раз в описании задачи, и каждое использование задаёт крайний срок для одного пользователя. Формат конфигурационной переменной следующий: LOGIN [DATE [TIME]] здесь LOGIN - это регистрационное имя пользователя, для которого устанавливается крайний срок сдачи задания, TIME - необязательное время суток в формате HH:MM:SS, а DATE - дата в формате YYYY/MM/DD. Если TIME отсутствует, принимается значение времени, равное 00:00:00, а если TIME и DATE отсутствуют, крайний срок устанавливается в 2038/01/19 00:00:00. Персональный крайний срок имеет приоритет над крайним сроком для всех пользователей, устанавливаемым с помощью конфигурационной переменной `deadline' секции описания задачи. serve,master,judge,team ----------------------- В выпадающем меню выбора задачи при сдаче решения помимо крайнего срока сдачи указывается календарный штраф, который будет наложен на посылку. master ------ При установке запланированного времени начала турнира возможно как задание времени начала в краткой форме в формате HH:MM, так и задание времени начала в полной форме в формате "YYYY/MM/DD hh:mm:ss". Таким образом можно задавать время начала турнира не в текущих сутках. serve ----- Добавлена опция командной строки `-f'. Если опция указана, перед созданием управляющего сокета старый файл сокета удаляется. Данная опция полезна при перезапуске системы после аварийного завершения работы программы или операционной системы. Добавлена опция командной строки `-i'. Если опция указана, производятся все действия по инициализации турнира (создание необходимых каталогов и файлов), а затем программа завершает работу. Исправлена ошибка, из-за которой программа `serve' могла "подвисать" для всех пользователей, так как была заблокирована из-за ожидания завершения передачи данных по медленному каналу. При выполнении привилегированных команд не требуется указание корректного идентификатора пользователя в структуре пакета команды. Идентификатор пользователя берётся из структуры, описывающей соединение, по которому пришёл управляющий пакет. userlist-server --------------- Добавлена опция командной строки `-f'. Если опция указана, перед созданием управляющего сокета старый файл сокета удаляется. Данная опция полезна при перезапуске системы после аварийного завершения работы программы или операционной системы. Исправлена ошибка, из-за которой программа `userlist-server' могла "подвисать" для всех пользователей, так как была заблокирована из-за ожидания завершения передачи данных по медленному каналу. Один и тот же cookie может использоваться для привилегированного входа в различные турниры, если у пользователя достаточно на это полномочий. В предыдущей версии ejudge каждый привилегированный cookie жёстко привязывался к одному турниру. Если запрашиваемый уровень привилегий при привилегированном входе в турнир выше, чем максимально допустимый (т. е., например, запрашивается уровень привилегий ADMIN, хотя данный пользователь имеет только уровень привилегий JUDGE), уровень привилегий понижается. В предыдущей версии в этом случае выдавалась ошибка "Permission denied". При привилегированном входе идентификатор турнира может быть равен 0, в этом случае предполагается, что пользователь входит в программу serve-control. Тогда проверяемые полномочия пользователя берутся из глобального конфигурационного файла ejudge.xml. При генерации случайных паролей пароли не генерируются для невидимых, заблокированных, дисквалифицированных и привилегированных пользователей. run --- Исправлена критическая ошибка, связанная с тем, что проверяющей программе на вход передавался путь к файлу исходных данных теста в текущем каталоге, то есть в рабочем каталоге тестируемой программы. При некоторых условиях тестируемая программа могла модифицировать свой входной файл. В текущей версии в качестве пути к входному файлу теста передаётся путь к входному файлу в архивном каталоге.