rbx.cp 0.5.72__py3-none-any.whl → 0.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. rbx/annotations.py +21 -1
  2. rbx/box/cli.py +24 -8
  3. rbx/box/code.py +140 -3
  4. rbx/box/contest/build_contest_statements.py +44 -34
  5. rbx/box/contest/contest_utils.py +25 -0
  6. rbx/box/contest/main.py +24 -0
  7. rbx/box/contest/schema.py +52 -8
  8. rbx/box/contest/statements.py +53 -25
  9. rbx/box/download.py +19 -1
  10. rbx/box/fields.py +35 -0
  11. rbx/box/lang.py +27 -0
  12. rbx/box/package.py +1 -1
  13. rbx/box/packaging/boca/packager.py +48 -5
  14. rbx/box/packaging/contest_main.py +13 -0
  15. rbx/box/packaging/main.py +13 -2
  16. rbx/box/packaging/packager.py +4 -4
  17. rbx/box/packaging/pkg/packager.py +142 -0
  18. rbx/box/packaging/polygon/packager.py +2 -24
  19. rbx/box/packaging/polygon/upload.py +35 -17
  20. rbx/box/remote.py +2 -2
  21. rbx/box/schema.py +68 -18
  22. rbx/box/solutions.py +6 -1
  23. rbx/box/statements/build_statements.py +44 -27
  24. rbx/box/statements/builders.py +18 -10
  25. rbx/box/statements/expander.py +49 -0
  26. rbx/box/statements/latex_jinja.py +61 -4
  27. rbx/box/statements/schema.py +33 -9
  28. rbx/box/testcase_utils.py +19 -47
  29. rbx/box/tooling/__init__.py +0 -0
  30. rbx/box/tooling/boca/__init__.py +0 -0
  31. rbx/box/tooling/boca/main.py +13 -0
  32. rbx/box/tooling/boca/scrape.py +34 -0
  33. rbx/box/{packaging/boca/upload.py → tooling/boca/scraper.py} +77 -8
  34. rbx/box/tooling/main.py +8 -0
  35. rbx/box/ui/screens/run_explorer.py +1 -1
  36. rbx/box/ui/widgets/interaction_box.py +19 -1
  37. rbx/grading/caching.py +18 -2
  38. rbx/grading/judge/sandbox.py +48 -5
  39. rbx/grading/judge/sandboxes/isolate.py +1 -0
  40. rbx/grading/judge/sandboxes/stupid_sandbox.py +11 -5
  41. rbx/grading/judge/sandboxes/timeit.py +36 -15
  42. rbx/grading/processing_context.py +62 -78
  43. rbx/grading/steps.py +91 -40
  44. rbx/resources/packagers/boca/checker.sh +4 -1
  45. rbx/resources/packagers/boca/compile/c +2 -6
  46. rbx/resources/packagers/boca/compile/cc +2 -6
  47. rbx/resources/packagers/boca/compile/cpp +2 -6
  48. rbx/resources/packagers/boca/compile/java +1 -6
  49. rbx/resources/packagers/boca/compile/kt +24 -28
  50. rbx/resources/packagers/boca/compile/py2 +2 -6
  51. rbx/resources/packagers/boca/compile/py3 +2 -6
  52. rbx/resources/packagers/boca/interactive/c +15 -62
  53. rbx/resources/packagers/boca/interactive/cc +15 -62
  54. rbx/resources/packagers/boca/interactive/cpp +15 -61
  55. rbx/resources/packagers/boca/interactive/java +15 -67
  56. rbx/resources/packagers/boca/interactive/kt +15 -67
  57. rbx/resources/packagers/boca/interactive/py2 +15 -67
  58. rbx/resources/packagers/boca/interactive/py3 +15 -65
  59. rbx/resources/packagers/boca/interactor_compile.sh +5 -2
  60. rbx/resources/packagers/boca/interactor_run.sh +174 -0
  61. rbx/resources/packagers/boca/safeexec.c +530 -0
  62. rbx/resources/packagers/boca/safeexec_compile.sh +49 -0
  63. rbx/resources/presets/default/contest/contest.rbx.yml +9 -8
  64. rbx/resources/presets/default/problem/problem.rbx.yml +27 -26
  65. rbx/resources/templates/rbx.h +2 -3
  66. {rbx_cp-0.5.72.dist-info → rbx_cp-0.6.0.dist-info}/METADATA +2 -1
  67. {rbx_cp-0.5.72.dist-info → rbx_cp-0.6.0.dist-info}/RECORD +70 -59
  68. rbx/resources/packagers/boca/compile/pas +0 -172
  69. {rbx_cp-0.5.72.dist-info → rbx_cp-0.6.0.dist-info}/LICENSE +0 -0
  70. {rbx_cp-0.5.72.dist-info → rbx_cp-0.6.0.dist-info}/WHEEL +0 -0
  71. {rbx_cp-0.5.72.dist-info → rbx_cp-0.6.0.dist-info}/entry_points.txt +0 -0
@@ -41,22 +41,22 @@
41
41
 
42
42
  umask 0022
43
43
  if [ "$1" == "" ]; then
44
- echo "parameter problem"
45
- exit 43
44
+ echo "parameter problem"
45
+ exit 43
46
46
  fi
47
47
  name="$1"
48
48
  if [ ! -r "$1" ]; then
49
- echo "$1 not found or it's not readable"
50
- exit 44
49
+ echo "$1 not found or it's not readable"
50
+ exit 44
51
51
  fi
52
52
  id -u bocajail >/dev/null 2>/dev/null
53
53
  if [ $? == 0 ]; then
54
- bocau=`id -u bocajail`
55
- bocag=`id -g bocajail`
54
+ bocau=$(id -u bocajail)
55
+ bocag=$(id -g bocajail)
56
56
  chown bocajail.nogroup .
57
57
  else
58
- bocau=`id -u nobody`
59
- bocag=`id -g nobody`
58
+ bocau=$(id -u nobody)
59
+ bocag=$(id -g nobody)
60
60
  chown nobody.nogroup .
61
61
  fi
62
62
  if [ "$bocau" == "" -o "$bocag" == "" ]; then
@@ -67,10 +67,10 @@ fi
67
67
  mkdir -p src
68
68
  if [ "${name##*.}" == "zip" -a "${name##*.}" == "ZIP" ]; then
69
69
  unzip "$name" -d src
70
- if [ "${name##*.}" == "zip" ]; then
71
- name=`basename $name .zip`
70
+ if [ "${name##*.}" == "zip" ]; then
71
+ name=$(basename $name .zip)
72
72
  else
73
- name=`basename $name .ZIP`
73
+ name=$(basename $name .ZIP)
74
74
  fi
75
75
  else
76
76
  cp "$name" src
@@ -80,42 +80,38 @@ chmod -R 700 src
80
80
 
81
81
  # this script makes use of safeexec to execute the code with less privilegies
82
82
  # make sure that directories below are correct.
83
- sf=`which safeexec`
83
+ sf=$(which safeexec)
84
84
  [ -x "$sf" ] || sf=/usr/bin/safeexec
85
85
  if [ ! -x $sf ]; then
86
- echo "$sf not found or it's not executable"
87
- exit 46
86
+ echo "$sf not found or it's not executable"
87
+ exit 46
88
88
  fi
89
89
 
90
90
  # setting up the timelimit according to the problem
91
- if [ "$3" == "" ]; then
92
- time=5
93
- else
94
- time=$3
95
- fi
96
- let "ttime = $time + 30"
91
+ time=30
92
+ ttime=30
97
93
 
98
94
  maxm=1024
99
95
  if [ "$4" != "" -a "$4" -gt "1024" ]; then
100
- maxm=$4
96
+ maxm=$4
101
97
  fi
102
98
 
103
99
  maxms=100
104
100
 
105
101
  if [ "$2" == "" ]; then
106
- jarfile=run.jar
102
+ jarfile=run.jar
107
103
  else
108
- jarfile=$2
104
+ jarfile=$2
109
105
  fi
110
106
 
111
- cdir=`pwd`
107
+ cdir=$(pwd)
112
108
  echo "Current directory is $cdir" >&2
113
- mainname=`echo $name | cut -d'.' -f1`
109
+ mainname=$(echo $name | cut -d'.' -f1)
114
110
  if [ "$mainname" == "" ]; then
115
- mainname=Main
111
+ mainname=Main
116
112
  fi
117
113
 
118
- cat <<EOF > compileit.sh
114
+ cat <<EOF >compileit.sh
119
115
  #!/bin/bash
120
116
  kotlinc=/snap/kotlin/24/bin/kotlinc
121
117
  [ -x "\$kotlinc" ] || kotlinc=/snap/bin/kotlinc
@@ -147,7 +143,7 @@ if [ "$ret" != "0" ]; then
147
143
  echo "Compilation Error: $ret"
148
144
  exit $ret
149
145
  fi
150
- ret=`cat compileit.retcode`
146
+ ret=$(cat compileit.retcode)
151
147
  if [ "$ret" != "0" ]; then
152
148
  echo "Compilation Error: $ret"
153
149
  ret=1
@@ -92,12 +92,8 @@ if [ "$4" != "" ]; then
92
92
  fi
93
93
 
94
94
  # setting up the timelimit according to the problem
95
- if [ "$3" == "" ]; then
96
- time=5
97
- else
98
- time=$3
99
- fi
100
- let "ttime = $time + 30"
95
+ time=15
96
+ let "ttime = $time * 2"
101
97
 
102
98
  if [ "$2" == "" ]; then
103
99
  exe=run.exe
@@ -92,12 +92,8 @@ if [ "$4" != "" ]; then
92
92
  fi
93
93
 
94
94
  # setting up the timelimit according to the problem
95
- if [ "$3" == "" ]; then
96
- time=5
97
- else
98
- time=$3
99
- fi
100
- let "ttime = $time + 30"
95
+ time=15
96
+ let "ttime = $time * 2"
101
97
 
102
98
  if [ "$2" == "" ]; then
103
99
  exe=run.exe
@@ -61,6 +61,10 @@ fi
61
61
  # make sure that directories below are correct.
62
62
  sf=$(which safeexec)
63
63
  [ -x "$sf" ] || sf=/usr/bin/safeexec
64
+ if [ -x "../safeexec.exe" ]; then
65
+ cp "../safeexec.exe" "safeexec.exe"
66
+ sf="./safeexec.exe"
67
+ fi
64
68
 
65
69
  if [ "$1" == "" -o "$2" == "" -o "$3" == "" ]; then
66
70
  echo "parameter problem"
@@ -80,8 +84,9 @@ if [ ! -x "$sf" ]; then
80
84
  fi
81
85
 
82
86
  time=$3
83
- if [ "$time" -gt "0" ]; then
84
- let "ttime = $time * 4"
87
+ rtime=$(awk "BEGIN {print int($time+0.9999999)}")
88
+ if [ "$rtime" -gt "0" ]; then
89
+ let "ttime = $rtime * 4"
85
90
  else
86
91
  time=1
87
92
  ttime=4
@@ -89,8 +94,8 @@ fi
89
94
 
90
95
  nruns=1
91
96
  if [ "$4" != "" ]; then
92
- if [ "$4" -gt "0" ]; then
93
- nruns=$4
97
+ if [ "$4" -gt "1" ]; then
98
+ echo "WARNING: nruns is set to $4, but it will be ignored because it's not supported by interactive problems"
94
99
  fi
95
100
  fi
96
101
  maxm=512000
@@ -120,58 +125,9 @@ cdir=$(pwd)
120
125
  echo "Current directory is $cdir -- chrooting on it" >&2
121
126
 
122
127
  ### START OF BOCA RUN COMMAND
123
- cat <<EOF >runit.sh
124
- #!/bin/bash
125
- mkfifo fifo.in fifo.out
126
-
127
- echo "Running solution as \$@" >&2
128
-
129
- "\$@" >fifo.out <fifo.in 2>/dev/null &
130
- SFPID=\$!
131
-
132
- ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
133
- INTPID=\$!
134
-
135
- wait \$INTPID
136
- ECINT=\$?
137
-
138
- ECSF=0
139
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
140
- # kill the solution
141
- kill -9 \$SFPID
142
- else
143
- wait \$SFPID
144
- ECSF=\$?
145
- fi
146
-
147
- rm -rf fifo.in fifo.out
148
-
149
- echo "Ran solution as \$@" &>>stderr0
150
- echo "interactor exitcode \$ECINT" &>>stderr0
151
- echo "solution exitcode \$ECSF" &>>stderr0
152
-
153
- RTE=0
154
- if [[ \$ECSF -eq -13 ]]; then
155
- RTE=0
156
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
157
- echo "Found EOF RTE" &>>stderr0
158
- RTE=1
159
- fi
160
-
161
- ret=0
162
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]] && [[ \$RTE -eq 0 ]]; then
163
- echo "testlib exitcode \$ECINT" >stdout0
164
- ret=0
165
- elif [[ \$ECSF -ne 0 ]]; then
166
- ret=\$ECSF
167
- elif [[ \$ECINT -ne 0 ]]; then
168
- ret=9
169
- fi
170
-
171
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
172
- exit \$ret
128
+ cat >runit.sh <<"EOF"
129
+ {{runit_content}}
173
130
  EOF
174
-
175
131
  chmod 755 runit.sh
176
132
 
177
133
  ret=0
@@ -183,13 +139,14 @@ if [ $? -eq 0 ]; then
183
139
  cd "$cdir"
184
140
  [ -f /proc/cpuinfo ] || /bin/mount -t proc proc /proc
185
141
  [ -d /sys/kernel ] || /bin/mount -t sysfs sysfs /sys
186
- "$sf" -F10 -f$maxf -r$nruns -n0 -C. -U$bocau -G$bocag -d$maxm -m$maxm -t$time -T$ttime -ostdout0 -estderr0 -- ./runit.sh ./run.exe
142
+ ./runit.sh "$cdir" "$sf" "$ttime" -F10 -f$maxf -r$nruns -n0 -C. -U$bocau -G$bocag -d$maxm -m$maxm -t$time -T$ttime -- ./run.exe
187
143
  retval=\$?
188
144
  echo \$retval > runch.exitcode
189
145
  if [ ! -d /bocajail ]; then
190
146
  /bin/umount /proc 2>/dev/null
191
147
  /bin/umount /sys 2>/dev/null
192
148
  fi
149
+ rm -rf fifo.in fifo.out
193
150
  EOF
194
151
  chmod 755 runch.sh
195
152
  chroot /bocajail $cdir/runch.sh
@@ -201,12 +158,8 @@ EOF
201
158
  exit 49
202
159
  fi
203
160
  else
204
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
205
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
206
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
207
-
208
- "$sf" -F10 -f$maxf -r$nruns -n0 -C. -U$bocau -G$bocag -d$maxm -m$maxm -t$time -T$ttime -ostdout0 -estderr0 -- ./runit.sh ./run.exe
209
- ret=$?
161
+ echo "ERROR: CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
162
+ exit 48
210
163
  fi
211
164
  ### END OF BOCA RUN COMMAND
212
165
 
@@ -61,6 +61,10 @@ fi
61
61
  # make sure that directories below are correct.
62
62
  sf=$(which safeexec)
63
63
  [ -x "$sf" ] || sf=/usr/bin/safeexec
64
+ if [ -x "../safeexec.exe" ]; then
65
+ cp "../safeexec.exe" "safeexec.exe"
66
+ sf="./safeexec.exe"
67
+ fi
64
68
 
65
69
  if [ "$1" == "" -o "$2" == "" -o "$3" == "" ]; then
66
70
  echo "parameter problem"
@@ -80,8 +84,9 @@ if [ ! -x "$sf" ]; then
80
84
  fi
81
85
 
82
86
  time=$3
83
- if [ "$time" -gt "0" ]; then
84
- let "ttime = $time * 4"
87
+ rtime=$(awk "BEGIN {print int($time+0.9999999)}")
88
+ if [ "$rtime" -gt "0" ]; then
89
+ let "ttime = $rtime * 4"
85
90
  else
86
91
  time=1
87
92
  ttime=4
@@ -89,8 +94,8 @@ fi
89
94
 
90
95
  nruns=1
91
96
  if [ "$4" != "" ]; then
92
- if [ "$4" -gt "0" ]; then
93
- nruns=$4
97
+ if [ "$4" -gt "1" ]; then
98
+ echo "WARNING: nruns is set to $4, but it will be ignored because it's not supported by interactive problems"
94
99
  fi
95
100
  fi
96
101
  maxm=512000
@@ -120,58 +125,9 @@ cdir=$(pwd)
120
125
  echo "Current directory is $cdir -- chrooting on it" >&2
121
126
 
122
127
  ### START OF BOCA RUN COMMAND
123
- cat <<EOF >runit.sh
124
- #!/bin/bash
125
- mkfifo fifo.in fifo.out
126
-
127
- echo "Running solution as \$@" >&2
128
-
129
- "\$@" >fifo.out <fifo.in 2>/dev/null &
130
- SFPID=\$!
131
-
132
- ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
133
- INTPID=\$!
134
-
135
- wait \$INTPID
136
- ECINT=\$?
137
-
138
- ECSF=0
139
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
140
- # kill the solution
141
- kill -9 \$SFPID
142
- else
143
- wait \$SFPID
144
- ECSF=\$?
145
- fi
146
-
147
- rm -rf fifo.in fifo.out
148
-
149
- echo "Ran solution as \$@" &>>stderr0
150
- echo "interactor exitcode \$ECINT" &>>stderr0
151
- echo "solution exitcode \$ECSF" &>>stderr0
152
-
153
- RTE=0
154
- if [[ \$ECSF -eq -13 ]]; then
155
- RTE=0
156
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
157
- echo "Found EOF RTE" &>>stderr0
158
- RTE=1
159
- fi
160
-
161
- ret=0
162
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]] && [[ \$RTE -eq 0 ]]; then
163
- echo "testlib exitcode \$ECINT" >stdout0
164
- ret=0
165
- elif [[ \$ECSF -ne 0 ]]; then
166
- ret=\$ECSF
167
- elif [[ \$ECINT -ne 0 ]]; then
168
- ret=9
169
- fi
170
-
171
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
172
- exit \$ret
128
+ cat >runit.sh <<"EOF"
129
+ {{runit_content}}
173
130
  EOF
174
-
175
131
  chmod 755 runit.sh
176
132
 
177
133
  ret=0
@@ -183,13 +139,14 @@ if [ $? -eq 0 ]; then
183
139
  cd "$cdir"
184
140
  [ -f /proc/cpuinfo ] || /bin/mount -t proc proc /proc
185
141
  [ -d /sys/kernel ] || /bin/mount -t sysfs sysfs /sys
186
- "$sf" -F10 -f$maxf -r$nruns -n0 -C. -U$bocau -G$bocag -d$maxm -m$maxm -t$time -T$ttime -ostdout0 -estderr0 -- ./runit.sh ./run.exe
142
+ ./runit.sh "$cdir" "$sf" "$ttime" -F10 -f$maxf -r$nruns -n0 -C. -U$bocau -G$bocag -d$maxm -m$maxm -t$time -T$ttime -- ./run.exe
187
143
  retval=\$?
188
144
  echo \$retval > runch.exitcode
189
145
  if [ ! -d /bocajail ]; then
190
146
  /bin/umount /proc 2>/dev/null
191
147
  /bin/umount /sys 2>/dev/null
192
148
  fi
149
+ rm -rf fifo.in fifo.out
193
150
  EOF
194
151
  chmod 755 runch.sh
195
152
  chroot /bocajail $cdir/runch.sh
@@ -201,12 +158,8 @@ EOF
201
158
  exit 49
202
159
  fi
203
160
  else
204
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
205
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
206
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
207
-
208
- "$sf" -F10 -f$maxf -r$nruns -n0 -C. -U$bocau -G$bocag -d$maxm -m$maxm -t$time -T$ttime -ostdout0 -estderr0 -- ./runit.sh ./run.exe
209
- ret=$?
161
+ echo "ERROR: CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
162
+ exit 48
210
163
  fi
211
164
  ### END OF BOCA RUN COMMAND
212
165
 
@@ -61,6 +61,10 @@ fi
61
61
  # make sure that directories below are correct.
62
62
  sf=$(which safeexec)
63
63
  [ -x "$sf" ] || sf=/usr/bin/safeexec
64
+ if [ -x "../safeexec.exe" ]; then
65
+ cp "../safeexec.exe" "safeexec.exe"
66
+ sf="./safeexec.exe"
67
+ fi
64
68
 
65
69
  if [ "$1" == "" -o "$2" == "" -o "$3" == "" ]; then
66
70
  echo "parameter problem"
@@ -80,8 +84,9 @@ if [ ! -x "$sf" ]; then
80
84
  fi
81
85
 
82
86
  time=$3
83
- if [ "$time" -gt "0" ]; then
84
- let "ttime = $time * 4"
87
+ rtime=$(awk "BEGIN {print int($time+0.9999999)}")
88
+ if [ "$rtime" -gt "0" ]; then
89
+ let "ttime = $rtime * 4"
85
90
  else
86
91
  time=1
87
92
  ttime=4
@@ -89,8 +94,8 @@ fi
89
94
 
90
95
  nruns=1
91
96
  if [ "$4" != "" ]; then
92
- if [ "$4" -gt "0" ]; then
93
- nruns=$4
97
+ if [ "$4" -gt "1" ]; then
98
+ echo "WARNING: nruns is set to $4, but it will be ignored because it's not supported by interactive problems"
94
99
  fi
95
100
  fi
96
101
  maxm=512000
@@ -120,57 +125,9 @@ cdir=$(pwd)
120
125
  echo "Current directory is $cdir -- chrooting on it" >&2
121
126
 
122
127
  ### START OF BOCA RUN COMMAND
123
- cat <<EOF >runit.sh
124
- #!/bin/bash
125
- mkfifo fifo.in fifo.out
126
-
127
- echo "Running solution as \$@" >&2
128
-
129
- "\$@" >fifo.out <fifo.in 2>/dev/null &
130
- SFPID=\$!
131
-
132
- ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
133
- INTPID=\$!
134
-
135
- wait \$INTPID
136
- ECINT=\$?
137
-
138
- ECSF=0
139
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
140
- # kill the solution
141
- kill -9 \$SFPID
142
- else
143
- wait \$SFPID
144
- ECSF=\$?
145
- fi
146
-
147
- rm -rf fifo.in fifo.out
148
-
149
- echo "Ran solution as \$@" &>>stderr0
150
- echo "interactor exitcode \$ECINT" &>>stderr0
151
- echo "solution exitcode \$ECSF" &>>stderr0
152
-
153
- RTE=0
154
- if [[ \$ECSF -eq -13 ]]; then
155
- RTE=0
156
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
157
- echo "Found EOF RTE" &>>stderr0
158
- RTE=1
159
- fi
160
- ret=0
161
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]] && [[ \$RTE -eq 0 ]]; then
162
- echo "testlib exitcode \$ECINT" >stdout0
163
- ret=0
164
- elif [[ \$ECSF -ne 0 ]]; then
165
- ret=\$ECSF
166
- elif [[ \$ECINT -ne 0 ]]; then
167
- ret=9
168
- fi
169
-
170
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
171
- exit \$ret
128
+ cat >runit.sh <<"EOF"
129
+ {{runit_content}}
172
130
  EOF
173
-
174
131
  chmod 755 runit.sh
175
132
 
176
133
  ret=0
@@ -182,13 +139,14 @@ if [ $? -eq 0 ]; then
182
139
  cd "$cdir"
183
140
  [ -f /proc/cpuinfo ] || /bin/mount -t proc proc /proc
184
141
  [ -d /sys/kernel ] || /bin/mount -t sysfs sysfs /sys
185
- "$sf" -F10 -f$maxf -r$nruns -n0 -C. -U$bocau -G$bocag -d$maxm -m$maxm -t$time -T$ttime -ostdout0 -estderr0 -- ./runit.sh ./run.exe
142
+ ./runit.sh "$cdir" "$sf" "$ttime" -F10 -f$maxf -r$nruns -n0 -C. -U$bocau -G$bocag -d$maxm -m$maxm -t$time -T$ttime -- ./run.exe
186
143
  retval=\$?
187
144
  echo \$retval > runch.exitcode
188
145
  if [ ! -d /bocajail ]; then
189
146
  /bin/umount /proc 2>/dev/null
190
147
  /bin/umount /sys 2>/dev/null
191
148
  fi
149
+ rm -rf fifo.in fifo.out
192
150
  EOF
193
151
  chmod 755 runch.sh
194
152
  chroot /bocajail $cdir/runch.sh
@@ -200,12 +158,8 @@ EOF
200
158
  exit 49
201
159
  fi
202
160
  else
203
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
204
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
205
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
206
-
207
- "$sf" -F10 -f$maxf -r$nruns -n0 -C. -U$bocau -G$bocag -d$maxm -m$maxm -t$time -T$ttime -ostdout0 -estderr0 -- ./runit.sh ./run.exe
208
- ret=$?
161
+ echo "ERROR: CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
162
+ exit 48
209
163
  fi
210
164
  ### END OF BOCA RUN COMMAND
211
165
 
@@ -61,6 +61,10 @@ fi
61
61
  # make sure that directories below are correct.
62
62
  sf=$(which safeexec)
63
63
  [ -x "$sf" ] || sf=/usr/bin/safeexec
64
+ if [ -x "../safeexec.exe" ]; then
65
+ cp "../safeexec.exe" "safeexec.exe"
66
+ sf="./safeexec.exe"
67
+ fi
64
68
 
65
69
  if [ "$1" == "" -o "$2" == "" -o "$3" == "" ]; then
66
70
  echo "parameter problem"
@@ -98,8 +102,9 @@ if [ ! -x "$sf" ]; then
98
102
  fi
99
103
 
100
104
  time=$3
101
- if [ "$time" -gt "0" ]; then
102
- let "ttime = $time * 4"
105
+ rtime=$(awk "BEGIN {print int($time+0.9999999)}")
106
+ if [ "$rtime" -gt "0" ]; then
107
+ let "ttime = $rtime * 4"
103
108
  else
104
109
  time=1
105
110
  ttime=4
@@ -107,8 +112,8 @@ fi
107
112
 
108
113
  nruns=1
109
114
  if [ "$4" != "" ]; then
110
- if [ "$4" -gt "0" ]; then
111
- nruns=$4
115
+ if [ "$4" -gt "1" ]; then
116
+ echo "WARNING: nruns is set to $4, but it will be ignored because it's not supported by interactive problems"
112
117
  fi
113
118
  fi
114
119
  maxm=512000
@@ -133,58 +138,9 @@ cdir=$(pwd)
133
138
  echo "Current directory is $cdir -- chrooting on it" >&2
134
139
 
135
140
  ### START OF BOCA RUN COMMAND
136
- cat <<EOF >runit.sh
137
- #!/bin/bash
138
- mkfifo fifo.in fifo.out
139
-
140
- echo "Running solution as \$@" >&2
141
-
142
- "\$@" >fifo.out <fifo.in 2>/dev/null &
143
- SFPID=\$!
144
-
145
- ./interactor.exe "stdin0" "stdout0" <fifo.out >fifo.in 2>stderr0 &
146
- INTPID=\$!
147
-
148
- wait \$INTPID
149
- ECINT=\$?
150
-
151
- ECSF=0
152
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]]; then
153
- # kill the solution
154
- kill -9 \$SFPID
155
- else
156
- wait \$SFPID
157
- ECSF=\$?
158
- fi
159
-
160
- rm -rf fifo.in fifo.out
161
-
162
- echo "Ran solution as \$@" &>>stderr0
163
- echo "interactor exitcode \$ECINT" &>>stderr0
164
- echo "solution exitcode \$ECSF" &>>stderr0
165
-
166
- RTE=0
167
- if [[ \$ECSF -eq -13 ]]; then
168
- RTE=0
169
- elif [[ \$ECSF -ne 0 ]] && cat stderr0 | grep -q "wrong output format Unexpected end of file"; then
170
- echo "Found EOF RTE" &>>stderr0
171
- RTE=1
172
- fi
173
-
174
- ret=0
175
- if [[ \$ECINT -ge 1 ]] && [[ \$ECINT -le 4 ]] && [[ \$RTE -eq 0 ]]; then
176
- echo "testlib exitcode \$ECINT" >stdout0
177
- ret=0
178
- elif [[ \$ECSF -ne 0 ]]; then
179
- ret=\$ECSF
180
- elif [[ \$ECINT -ne 0 ]]; then
181
- ret=9
182
- fi
183
-
184
- echo "exitting from runit.sh with exit code \$ret" &>>stderr0
185
- exit \$ret
141
+ cat >runit.sh <<"EOF"
142
+ {{runit_content}}
186
143
  EOF
187
-
188
144
  chmod 755 runit.sh
189
145
 
190
146
  ret=0
@@ -202,13 +158,14 @@ if [ $? -eq 0 ]; then
202
158
  echo "\$java not found or it's not executable"
203
159
  exit 47
204
160
  fi
205
- "$sf" -r$nruns -t$time -T$ttime -istdin0 -F256 -u256 -ostdout0 -estderr0 -U$bocau -G$bocag -n0 -C. -f20000 -d20000000 -m20000000 -- ./runit.sh "\$java" -jar run.jar -Xmx${maxm}K -Xss${maxms}K -Xms${maxm}K
161
+ ./runit.sh "$cdir" "$sf" "$ttime" -r$nruns -t$time -T$ttime -F256 -u256 -U$bocau -G$bocag -n0 -C. -f20000 -d20000000 -m20000000 -- "\$java" -jar run.jar -Xmx${maxm}K -Xss${maxms}K -Xms${maxm}K
206
162
  retval=\$?
207
163
  echo \$retval > runch.exitcode
208
164
  if [ ! -d /bocajail ]; then
209
165
  /bin/umount /proc 2>/dev/null
210
166
  /bin/umount /sys 2>/dev/null
211
167
  fi
168
+ rm -rf fifo.in fifo.out
212
169
  EOF
213
170
  chmod 755 runch.sh
214
171
  chroot /bocajail $cdir/runch.sh
@@ -220,17 +177,8 @@ EOF
220
177
  exit 49
221
178
  fi
222
179
  else
223
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
224
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
225
- echo "CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
226
- java=$(which java)
227
- [ -x "$java" ] || java=/usr/bin/java
228
- if [ ! -x "$java" ]; then
229
- echo "$java not found or it's not executable"
230
- exit 47
231
- fi
232
- "$sf" -r$nruns -t$time -T$ttime -istdin0 -F256 -u256 -U$bocau -G$bocag -ostdout0 -estderr0 -n0 -C. -d20000000 -m20000000 -- ./runit.sh "$java" -jar run.jar -Xmx${maxm}K -Xss${maxms}K -Xms${maxm}K
233
- ret=$?
180
+ echo "ERROR: CODE NOT BEING CHROOTED. DO NOT RUN THIS ON THE MAIN SERVER" >&2
181
+ exit 48
234
182
  fi
235
183
  ### END OF BOCA RUN COMMAND
236
184