@@ -3,54 +3,41 @@ import {cat, exec, mkdir, rm, touch, head} from 'shelljs'
33import { RunJob , RunResult } from '../types/job'
44import * as path from 'path'
55import * as fs from 'fs'
6+ import { Scenario } from 'types/scenario.js'
67
78rm ( '-rf' , config . RUNBOX . DIR )
89mkdir ( '-p' , config . RUNBOX . DIR )
910
10- async function execRun ( job : RunJob ) : Promise < RunResult > {
11- let currentJobDir = path . join ( config . RUNBOX . DIR , job . id . toString ( ) )
12- mkdir ( '-p' , currentJobDir )
13- const LANG_CONFIG = config . LANGS [ job . lang ]
14-
15- fs . writeFileSync ( path . join ( currentJobDir , LANG_CONFIG . SOURCE_FILE ) ,
16- ( new Buffer ( job . source , 'base64' ) ) . toString ( 'ascii' ) )
17- fs . writeFileSync ( path . join ( currentJobDir , 'run.stdin' ) ,
18- ( new Buffer ( job . stdin , 'base64' ) ) . toString ( 'ascii' ) )
19-
20- exec ( `docker run \\
21- --cpus="${ LANG_CONFIG . CPU_SHARE } " \\
22- --memory="${ LANG_CONFIG . MEM_LIMIT } " \\
23- --ulimit nofile=64:64 \\
24- --rm \\
25- --read-only \\
26- -v "${ currentJobDir } ":/usr/src/runbox \\
27- -w /usr/src/runbox \\
28- codingblocks/judge-worker-${ job . lang } \\
29- /bin/judge.sh -t ${ job . timelimit || 5 }
30- ` )
31-
32- const stdout = exec ( `
33- head -c 65536 ${ path . join ( currentJobDir , 'run.stdout' ) }
34- ` )
35-
36- // Check for compile_stderr if can't find a stdout file ; stdout can be ''
37- const compile_stderr = cat ( path . join ( currentJobDir , 'compile.stderr' ) ) . toString ( )
38- let stderr = compile_stderr || cat ( ( path . join ( currentJobDir , 'run.stderr' ) ) . toString ( ) )
39-
40- const run_time = cat ( path . join ( currentJobDir , 'runguard.time' ) ) . toString ( )
41- const code = cat ( path . join ( currentJobDir , 'runguard.code' ) ) . toString ( )
42-
43- rm ( '-rf' , currentJobDir )
44-
45- return {
46- id : job . id ,
47- stderr : ( new Buffer ( stderr ) ) . toString ( 'base64' ) ,
48- stdout : ( new Buffer ( stdout ) ) . toString ( 'base64' ) ,
49- time : + run_time ,
50- code : + code
11+ class RunScenario implements Scenario {
12+ setup ( currentJobDir : string , job : RunJob ) {
13+ const LANG_CONFIG = config . LANGS [ job . lang ]
14+
15+ fs . writeFileSync ( path . join ( currentJobDir , LANG_CONFIG . SOURCE_FILE ) ,
16+ ( new Buffer ( job . source , 'base64' ) ) . toString ( 'ascii' ) )
17+ fs . writeFileSync ( path . join ( currentJobDir , 'run.stdin' ) ,
18+ ( new Buffer ( job . stdin , 'base64' ) ) . toString ( 'ascii' ) )
5119 }
52- }
5320
54- export {
55- execRun
21+ async result ( currentJobDir : string , jobId : number ) : Promise < RunResult > {
22+ const stdout = exec ( `
23+ head -c 65536 ${ path . join ( currentJobDir , 'run.stdout' ) }
24+ ` )
25+
26+ // Check for compile_stderr if can't find a stdout file ; stdout can be ''
27+ const compile_stderr = cat ( path . join ( currentJobDir , 'compile.stderr' ) ) . toString ( )
28+ let stderr = compile_stderr || cat ( ( path . join ( currentJobDir , 'run.stderr' ) ) . toString ( ) )
29+
30+ const run_time = cat ( path . join ( currentJobDir , 'runguard.time' ) ) . toString ( )
31+ const code = cat ( path . join ( currentJobDir , 'runguard.code' ) ) . toString ( )
32+
33+ return {
34+ id : jobId ,
35+ stderr : ( new Buffer ( stderr ) ) . toString ( 'base64' ) ,
36+ stdout : ( new Buffer ( stdout ) ) . toString ( 'base64' ) ,
37+ time : + run_time ,
38+ code : + code
39+ }
40+ }
5641}
42+
43+ export default new RunScenario ( )
0 commit comments