Новости Сервисы и чекеры. Курс молодого бойца-2 : через тернии к звёздам.

Argenet
, 29 October 2008

Эта статья в определённом смысле является продолжением статьи Сервисы и чекеры. Курс молодого бойца, написанной dmitrisimus'ом.

Написать её меня побудило то, что на последних тренировках команды стала часто использоваться жюрейская система, созданная Гансом Христианом Эсперером и впервые встретившаяся SiBears на сентябрьском контесте DA-Op3n'08. Жюрейка имеет ряд ощутимых плюсов,  и потому было принято решение использовать её впредь для проведения некоторых из тренировок. Поскольку формат чекеров для неё местами отличается от чекеров для жюрейки от организаторов C.I.P.H.E.R., то возникла необходимость в кратком и понятном описании особенностей тестовых скриптов, предназначенных для геймсервера от hc. Не мудрствуя лукаво, я решил перевести руководство по написанию чекеров, которое приводится на сайте Ганса Христиана :)

Базовая информация.

Жюрейская система взаимодействует с игровыми сервисами через чекеры, или тестовые скрипты.

Для каждого из сервисов необходим свой чекер. Он может быть написан на любом языке программирования, единственное требование - выбранный язык должен поддерживать возможность возврата значения, которое является результатом работы программы, интерпретатору командной строки. Например, для написания чекера может быть использован C/C++, python, ruby, perl...

Не рекомендуется использовать для создания чекеров языки вроде Java, которые отличаются хорошей производительностью при долгой работе программы, но очень медленно работают, если программа запускается и завершается несколько раз в течение короткого промежутка времени (такой режим запуска характерен для тестовых скриптов).

Все чекеры помещаются в подкаталог scripts/ жюрейской системы. Они должны быть доступны для исполнения (самый простой способ добиться этого - выполнить chmod 0755 scripts/*).

Выполнение чекера.

Чекер исполняется жюрейской системой в следующем виде:

scripts/TESTSCRIPT store|retrieve IP FLAGID FLAG

Первый параметр определяет действие: "поместить" или "получить".

store означает, что тестовый скрипт должен поместить флаг на сервис, доступный по указанному IP-адресу.

retrieve означает, что скрипт должен попытаться получить флаг с указанного адреса.

Чекеры обязаны возвращать значение, указывающее, было ли действие произведено успешно.

Возвращаемые значения.

0 - всё отлично (Everything OK)

Код возврата 0 означает, что запрошенная операция (store или retrieve) завершилась успешно.

1 - Ошибка соединения (Connection error)

Попытка соединиться с сервисом завершилась неудачно.

Это значение нужно возвращать в том случае, если чекер не смог установить соединение с сервисом на сетевом уровне.

5 - Неправильный флаг (Wrong flag)

Сервис корректно ответил на запросы согласно прикладному протоколу, но не вернул флаг либо вернул неправильный флаг.

Это значение нужно возвращать в случае, когда полученный флаг не совпадает с флагом, переданным чекеру через аргументы командной строки.

9 - Нарушена функциональность сервиса (Service lacks functionality)

Сервис не предоставляет какую-то функциональность, не связанную напрямую с помещением или получением флагов.

Важно проверять, что сервис работает корректно в целом, а не только способен получать или отдавать флаги. Если чекер обнаружил, что заложенная в сервисе функциональность недоступна, он должен вернуть именно этот код.

13 - Превышено ожидание отклика от сервиса (Service response timeout)

Сервис не ответил вовремя.

Чаще всего, создателю чекера не требуется самому обрабатывать этот случай. Если ваш тестовый скрипт не прекратил работу в течение минуты, он принудительно завершается жюрейской системой.

17 - Статус неизвестен (Status unknown)

Жюрейская система не в состоянии выяснить текущий статус сервиса.

Автор жюрейской системы настоятельно рекомендует НЕ использовать этот код возврата без явной на то необходимости.

21 - Ошибка (Error)

Произошла ошибка.

Этот код используется для ошибок, не подходящих под другие случаи. Ошибка может быть описана строкой не более 256 символов, переданной чекером в стандартный поток ошибок (stderr).

25 - Нарушение протокола (Protocol Violation)

Сервис нарушил некоторые правила прикладного протокола взаимодействия.

Этот код возврата используется в том случае, если существует некоторый стандартный протокол для взаимодействия с сервисом (допустим, описанный в RFC или разработанный создателем сервиса), и сервис работает с ним некорректно.

Для каждого из кодов возврата чекер может возвращать некоторую строку подсказки, которая будет добавлена жюрейской системой к статусу сервиса на веб-странице. Эта строка должна быть передана в стандартный поток ошибок непосредственно перед выходом из тестового скрипта.

Флаги и их идентификаторы.

Несмотря на то, что идентификатор флага генерируется жюрейской системой, Вы можете использовать свой собственный, генерируя его в тестовом скрипте. Идентификатор, передаваемый чекеру, получается путём применения хэш-функции SHA1 к  флагу и взятия первых восьми байт его шестнадцатиричного представления. но это впоследствии может измениться.

Если Вам необходимо, чтобы идентификатор флага имел какой-то конкретный формат - например, содержал только цифры - вы можете генерировать его самостоятельно. Используйте любую удобную хэш-функцию, либо можете взять в качестве идентификатора часть самого флага. Важно лишь, чтобы ваш метод генерации идентификаторов был стоек к коллизиям для примерно 200 - 20000 флагов (точное число зависит от величины интервала, с которым флаги помещаются на сервис, и. длительности игры).

Вместо заключения

Текст представляет собой вольный перевод руководств, располагающихся по этой и этой ссылкам. Также к статье прилагаются примеры чекеров для сервисов с контеста DA-Op3n и шаблон чекера на языке python.

Что касается непосредственно самой жюрейки - инструкции по установке и настройке можно найти на сайте создателя. Переводить их и постить сюда не вижу смысла - в отличие от чекеров, которые придётся писать всем, жюрейкой могут заниматься 1-2 человека в каждой команде. Если кто-то будет настраивать жюрейку от hc и столкнётся с проблемами - пишите, может чего смогу посоветовать :)

Удачной игры!