язык BASH для проверки решений

Обсуждение вопросов, связанных с системой проведения турниров ejudge.
Post Reply
kai977
Posts:33
Joined:10 January 2011, 17:03
язык BASH для проверки решений

Post by kai977 » 04 February 2014, 11:51

Коллеги! Подскажите, пожалуйста, как подключить язык BASH для проверки решений на этом языке? Последняя версия ejudge установлена на Ubuntu 13.10. Почитал wiki про установку языковых процессоров. Может у кого-то есть уже готовые скрипты?

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: язык BASH для проверки решений

Post by cher » 07 February 2014, 11:27

Попробуйте сделать его, взяв за основу, например, python

kai977
Posts:33
Joined:10 January 2011, 17:03

Re: язык BASH для проверки решений

Post by kai977 » 10 February 2014, 18:20

Здравствуйте, Александр!

Пока добавить язык bash в систему не удалось.

Вот как я это делал.

1. В директории /ejudge/scripts создал два файла, взяв за основу аналогичные файлы для python:
bash.in
bash-version.in

2. Скопировал эти файлы в директорию /inst-ejudge/libexec/ejudge/lang/in

3. Запустил ejudge-configure-compilers. Настройщик увидел язык bash, написал, что он доступен. При выходе из программы я сохранил новые конфигурационные файлы.

4. В директории judges/compile/conf обновился конфигурационный файл compile.cfg. В нем добавился раздел

[language]
id = 90
short_name = "bash"
long_name = "Bash"
src_sfx = ".sh"
cmd = "bash"
arch = "linux-shared"

5. В директории /judges/compile/conf/lang.d появился файл bash.cfg следующего содержания

version="4.2.45(1)-release"
arg=""
long_name="Bash"
src_sfx=".sh"
arch="linux-shared"
BASHPATH="/bin/bash"

6. В директории judges/compile/scripts появились два файла со скриптами
bash
bash-version

7. В файл lang_ids.cfg из директории inst-ejudge/libexec/ejudge/lang дописал вручную строку
bash=90

8. Остановил и снова запустил ejudge командами
./ejudge-control stop
./ejudge-control start

9. Зашел на сервер через serve-control - но в списке языков Language settings для соревнований язык bash не появился.
10. Попробовал дописать язык вручную в файл serve.cfg конкретного соревнования - все равно языка в списке доступных языков (активных и неактивных) нет.
11. Пробовал создань новый контест, но язык все-равно не появляется.

Наверное, я что-то пропустил.

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: язык BASH для проверки решений

Post by cher » 11 February 2014, 15:21

Вроде все правильно.
Что выводится, если запустить команду
[cmd]
bash-version -r
[/cmd]

из командной строки?

kai977
Posts:33
Joined:10 January 2011, 17:03

Re: язык BASH для проверки решений

Post by kai977 » 11 February 2014, 16:32

Запустил команду

./bash-version -r

ту, которая в директории

judges/compile/scripts

получил вот такой вывод

version="4.2.45(1)-release"
arg=""
long_name="Bash"
src_sfx=".sh"
arch="linux-shared"
BASHPATH="/bin/bash"

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: язык BASH для проверки решений

Post by cher » 13 February 2014, 22:02

Если запустить ejudge-configure-compilers, то язык "bash" находится?

kai977
Posts:33
Joined:10 January 2011, 17:03

Re: язык BASH для проверки решений

Post by kai977 » 14 February 2014, 14:40

Проблему решил, язык BASH теперь работает.

Немного поменял последовательность действий и исправил маленькую ошибку в bash-version скрипте (там в самых последних двух строках исправил ключ -V, который остался от скрипта для python, на ключ --version).

Итак,
1. в директории judges/compile/scripts создаю директорию in
2. в созданной директории judges/compile/scripts/in создаю два файла с соответствующими скриптами
bash.in
bash-version.in
3. из директории inst-ejudge/bin запускаю программу ./ejudge-configure-compilers. Она находит язык, и указывает
в списке доступных языков номер (id) языка bash. В моем случае это 90.
4. в файл inst-ejudge/libexec/ejudge/lang/lang_ids.cfg в конец добавляю строку bash=90.
5. из директории inst-ejudge/bin/ запускаю
./ejudge-control stop
./ejudge-control start
6. Все готово. при запуске serve-control в списке языков в Language settings появился язык Bash.

Все работает, задачи проверяются! Спасибо!

Единственный маленький вопрос. Чтобы задачи проверялись, пришлось поставить в настройках
Run programs securely: NO

Можно ли настроить язык так, чтобы эта настройка была YES. Или для скриптовых языков всегда NO?

cher
Posts:1153
Joined:13 March 2004, 17:00
Contact:

Re: язык BASH для проверки решений

Post by cher » 14 February 2014, 20:58

В безопасном режиме запрещено создание других процессов. Поэтому вряд ли можно заставить bash работать в безопасном режиме.

Если необходимо, можно использовать disable_security

rotkart
Posts:17
Joined:07 October 2013, 14:49

Re: язык BASH для проверки решений

Post by rotkart » 20 February 2014, 08:27

kai977 wrote:Проблему решил, язык BASH теперь работает.
Простите за нахальство - не поделитесь конфигурационными файлами?

kai977
Posts:33
Joined:10 January 2011, 17:03

bash.in

Post by kai977 » 20 February 2014, 17:46

Конечно поделюсь!

bash.in

Code: Select all

#!/bin/bash
# $Id: bash.in 5550 2009-02-19 18:14:43Z cher $
# Copyright (c) 2003-2008 Alexander Chernov <cher@ejudge.ru>

# This is a `compilation' script for the Bash language.
# The idea is to append "#!${BASHPATH}" string
# to the beginning of the file.
# Usage: bash <input> <output>

# using EJUDGE_FLAGS we may pass additional flags

LANG_CONFIG_DIR="@lang_config_dir@"
[ "${EJUDGE_LANG_CONFIG}" = "" ] && EJUDGE_LANG_CONFIG="${LANG_CONFIG_DIR}/bash.cfg"

if [ -f "${EJUDGE_LANG_CONFIG}" ]
then
  . "${EJUDGE_LANG_CONFIG}"
else
  version="unknown"
  BASHPATH="/bin/bash"
fi

if [ x"${version}" = x ]
then
  echo "This language is not supported." >&2
  exit 1
fi

echo "#!${BASHPATH} ${EJUDGE_FLAGS}" > $2
echo "# coding: latin1" >> $2
echo >> $2
cat $1 >> $2
chmod +x $2
exit 0

kai977
Posts:33
Joined:10 January 2011, 17:03

bash-version.in

Post by kai977 » 20 February 2014, 17:48

Code: Select all

#!/bin/bash
# $Id: bash-version.in 5550 2009-02-19 18:14:43Z cher $
# Copyright (c) 2005-2008 Alexander Chernov <cher@ejudge.ru>

LANG_CONFIG_DIR="@lang_config_dir@"

common_config() {
  echo 'long_name="Bash"'
  echo 'src_sfx=".sh"'
  echo 'arch="linux-shared"'
}

failure() {
  rm -f conftest*
  echo 'version='
  echo 'arg="'"${arg}"'"'
  common_config
  echo 'BASHPATH=/bin/false'
  [ "${verbose}" = 1 ] && echo "no" >&2
  exit 1
}

unset LANG
unset LC_ALL
unset LC_MESSAGES
unset LANGUAGE

if [ x"$1" = x-v ]
then
  verbose=1
  shift
fi

# recheck the language
if [ x"$1" = x-r ]
then  
  arg="$2"    
  [ x"$2" != x ] && bash="$2"    
  [ "${bash}" = "" ] && bash="bash"  
  [ "${verbose}" = 1 ] && echo -n "checking whether Bash is available..." >&2
    
  "${bash}" --version >/dev/null 2>&1 || failure  
  
  version=`"${bash}" --version 2>&1 | head -n1 | gawk '{ print $4; }'` || failure
  [ "${version}" != "" ] || failure  
  BASHPATH=`which "${bash}"` || failure
  [ "${BASHPATH}" != "" ] || failure
  
  echo "#! ${BASHPATH}" > conftest.sh
  echo 'echo "OK"' >> conftest.sh
  chmod +x ./conftest.sh || failure
  ./conftest.sh >/dev/null 2>&1 || failure

  rm -f ./conftest*
  echo 'version="'"${version}"'"'
  echo 'arg="'"${arg}"'"'
  common_config
  echo 'BASHPATH="'"${BASHPATH}"'"'
  [ "${verbose}" = 1 ] && echo "yes, ${BASHPATH}, ${version}" >&2
  exit 0
fi

if [ x"$1" = x-l ]
then
  echo "Bash interpreter [http://www.bash.org]"
  exit 0
fi

[ "${EJUDGE_LANG_CONFIG}" = "" ] && EJUDGE_LANG_CONFIG="${LANG_CONFIG_DIR}/bash.cfg"

if [ -f "${EJUDGE_LANG_CONFIG}" ]
then
  . "${EJUDGE_LANG_CONFIG}"
else
  BASHPATH="/bin/bash"
fi

if [ x"${BASHPATH}" = x -o x"${BASHPATH}" = x/bin/false ]
then
  echo "This language is not supported." >&2
  exit 1
fi

if [ x"$1" = x-p ]
then
    echo "${BASHPATH}"
    exit 0
fi

"${BASHPATH}" -version 2>/dev/null >/dev/null || exit 1
    
[ x"$1" = x-f ] && echo -n "Bash "

"${BASHPATH}" -version 2>&1 | head -n1 | gawk '{ print $4; }'



kai977
Posts:33
Joined:10 January 2011, 17:03

язык BASH и безопасность

Post by kai977 » 20 February 2014, 17:55

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

rotkart
Posts:17
Joined:07 October 2013, 14:49

Re: bash.in

Post by rotkart » 20 February 2014, 18:00

kai977 wrote:Конечно поделюсь!
Большое спасибо! Думаю, будет интересно. Завтра добавлю себе.

rotkart
Posts:17
Joined:07 October 2013, 14:49

Re: язык BASH и безопасность

Post by rotkart » 20 February 2014, 22:40

kai977 wrote:BASH я в систему добавил, но проблему с безопасностью пока не решил. К сожалению, запискаемый на проверку скрипт может натворить много бед. Есть ли способ ограничить права запускаемого скрипта, чтобы с его помощью
нельзя было что-либо делать в других директориях, кроме той, в которой он запускается?
В голову только одно пока приходит: запустить chroot, а в нём скрипт.
Надо подумать как.

Post Reply