feat: read from config file
This commit is contained in:
parent
4441012e0d
commit
b252a54a83
34
README.md
34
README.md
|
@ -3,21 +3,27 @@
|
||||||
In order to register sandbox executor, you need to run go-judge before running this program.
|
In order to register sandbox executor, you need to run go-judge before running this program.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ make clean && make && ./build/joj3
|
$ make clean && make && ./_example/simple/run.sh
|
||||||
rm -rf ./build/*
|
rm -rf ./build/*
|
||||||
rm -rf *.out
|
rm -rf *.out
|
||||||
go build -o ./build/joj3 ./cmd/joj3
|
go build -o ./build/joj3 ./cmd/joj3
|
||||||
2024/03/04 01:00:33 INFO stage start name=compile
|
++ dirname -- ./_example/simple/run.sh
|
||||||
2024/03/04 01:00:33 INFO sandbox run cmd="{Args:[/usr/bin/g++ a.cc -o a] Env:[PATH=/usr/bin:/bin] Files:[0xc00007e380 0xc00007e3c0 0xc00007e400] CPULimit:10000000000 RealCPULimit:0 ClockLimit:0 MemoryLimit:104857600 StackLimit:0 ProcLimit:50 CPURateLimit:0 CPUSetLimit: CopyIn:map[a.cc:{Src:<nil> Content:0xc0000245f0 FileID:<nil> Name:<nil> Max:<nil> Symlink:<nil> StreamIn:false StreamOut:false Pipe:false}] CopyInCached:map[] CopyOut:[stdout stderr] CopyOutCached:[a] CopyOutMax:0 CopyOutDir: TTY:false StrictMemoryLimit:false DataSegmentLimit:false AddressSpaceLimit:false}"
|
+ DIRNAME=./_example/simple
|
||||||
2024/03/04 01:00:33 INFO sandbox run ret="results:{status:Accepted time:327939000 runTime:328796901 memory:57540608 files:{key:\"stderr\" value:\"\"} files:{key:\"stdout\" value:\"\"} fileIDs:{key:\"a\" value:\"YCYTGTCQ\"}}"
|
+ cd ./_example/simple
|
||||||
2024/03/04 01:00:33 INFO executor done result="{Status:Accepted ExitStatus:0 Error: Time:327.939ms RunTime:328.796901ms Memory:54.9 MiB Files:map[stderr:len:0 stdout:len:0] FileIDs:map[a:YCYTGTCQ] FileError:[]}"
|
+ ./../../build/joj3
|
||||||
2024/03/04 01:00:33 INFO parser done result="&{Score:100 Comment:compile done, executor status: run time: 328796901 ns, memory: 57540608 bytes}"
|
2024/03/04 02:09:42 INFO stage start name=compile
|
||||||
2024/03/04 01:00:33 INFO stage start name=run
|
2024/03/04 02:09:42 INFO sandbox run cmd="{Args:[/usr/bin/g++ a.cc -o a] Env:[PATH=/usr/bin:/bin] Files:[0xc00007f540 0xc00007f580 0xc00007f5c0] CPULimit:10000000000 RealCPULimit:0 ClockLimit:0 MemoryLimit:104857600 StackLimit:0 ProcLimit:50 CPURateLimit:0 CPUSetLimit: CopyIn:map[] CopyInCached:map[] CopyInCwd:true CopyOut:[stdout stderr] CopyOutCached:[a] CopyOutMax:0 CopyOutDir: TTY:false StrictMemoryLimit:false DataSegmentLimit:false AddressSpaceLimit:false}"
|
||||||
2024/03/04 01:00:33 INFO sandbox run cmd="{Args:[a] Env:[PATH=/usr/bin:/bin] Files:[0xc00007e440 0xc00007e480 0xc00007e4c0] CPULimit:10000000000 RealCPULimit:0 ClockLimit:0 MemoryLimit:104857600 StackLimit:0 ProcLimit:50 CPURateLimit:0 CPUSetLimit: CopyIn:map[] CopyInCached:map[a:a] CopyOut:[stdout stderr] CopyOutCached:[] CopyOutMax:0 CopyOutDir: TTY:false StrictMemoryLimit:false DataSegmentLimit:false AddressSpaceLimit:false}"
|
2024/03/04 02:09:42 INFO sandbox run copyInCwd=true
|
||||||
2024/03/04 01:00:33 INFO sandbox run ret="results:{status:Accepted time:1334000 runTime:2083023 memory:15384576 files:{key:\"stderr\" value:\"\"} files:{key:\"stdout\" value:\"2\\n\"}}"
|
2024/03/04 02:09:42 INFO sandbox run ret="results:{status:Accepted time:321003000 runTime:321988110 memory:57888768 files:{key:\"stderr\" value:\"\"} files:{key:\"stdout\" value:\"\"} fileIDs:{key:\"a\" value:\"T6BQPS5B\"}}"
|
||||||
2024/03/04 01:00:33 INFO executor done result="{Status:Accepted ExitStatus:0 Error: Time:1.334ms RunTime:2.083023ms Memory:14.7 MiB Files:map[stderr:len:0 stdout:len:2] FileIDs:map[] FileError:[]}"
|
2024/03/04 02:09:42 INFO executor done result="{Status:Accepted ExitStatus:0 Error: Time:321.003ms RunTime:321.98811ms Memory:55.2 MiB Files:map[stderr:len:0 stdout:len:0] FileIDs:map[a:T6BQPS5B] FileError:[]}"
|
||||||
2024/03/04 01:00:33 INFO parser done result="&{Score:100 Comment:run done, executor status: run time: 2083023 ns, memory: 15384576 bytes}"
|
2024/03/04 02:09:42 INFO parser done result="&{Score:100 Comment:compile done, executor status: run time: 321988110 ns, memory: 57888768 bytes}"
|
||||||
compile: score: 100, comment: compile done, executor status: run time: 328796901 ns, memory: 57540608 bytes
|
2024/03/04 02:09:42 INFO stage start name=run
|
||||||
run: score: 100, comment: run done, executor status: run time: 2083023 ns, memory: 15384576 bytes
|
2024/03/04 02:09:42 INFO sandbox run cmd="{Args:[./a] Env:[PATH=/usr/bin:/bin] Files:[0xc00007f600 0xc00007f640 0xc00007f680] CPULimit:10000000000 RealCPULimit:0 ClockLimit:0 MemoryLimit:104857600 StackLimit:0 ProcLimit:50 CPURateLimit:0 CPUSetLimit: CopyIn:map[] CopyInCached:map[a:a] CopyInCwd:false CopyOut:[stdout stderr] CopyOutCached:[] CopyOutMax:0 CopyOutDir: TTY:false StrictMemoryLimit:false DataSegmentLimit:false AddressSpaceLimit:false}"
|
||||||
2024/03/04 01:00:33 INFO sandbox cleanup
|
2024/03/04 02:09:42 INFO sandbox run ret="results:{status:Accepted time:1446000 runTime:2284978 memory:15384576 files:{key:\"stderr\" value:\"\"} files:{key:\"stdout\" value:\"2\\n\"}}"
|
||||||
|
2024/03/04 02:09:42 INFO executor done result="{Status:Accepted ExitStatus:0 Error: Time:1.446ms RunTime:2.284978ms Memory:14.7 MiB Files:map[stderr:len:0 stdout:len:2] FileIDs:map[] FileError:[]}"
|
||||||
|
2024/03/04 02:09:42 INFO parser done result="&{Score:100 Comment:run done, executor status: run time: 2284978 ns, memory: 15384576 bytes}"
|
||||||
|
2024/03/04 02:09:42 INFO stage result name=compile score=100 comment="compile done, executor status: run time: 321988110 ns, memory: 57888768 bytes"
|
||||||
|
2024/03/04 02:09:42 INFO stage result name=run score=100 comment="run done, executor status: run time: 2284978 ns, memory: 15384576 bytes"
|
||||||
|
2024/03/04 02:09:42 INFO sandbox cleanup
|
||||||
|
+ cd -
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"flag"
|
||||||
|
"log/slog"
|
||||||
|
"os"
|
||||||
|
|
||||||
_ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/executors"
|
_ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/executors"
|
||||||
_ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers"
|
_ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers"
|
||||||
|
@ -9,74 +11,22 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
tomlConfig := `
|
tomlPath := flag.String("c", "conf.toml", "file path of the toml config")
|
||||||
[[stages]]
|
flag.Parse()
|
||||||
name = "compile"
|
tomlConfig, err := os.ReadFile(*tomlPath)
|
||||||
[stages.executor]
|
if err != nil {
|
||||||
name = "sandbox"
|
slog.Error("read toml config", "error", err)
|
||||||
[stages.executor.with]
|
os.Exit(1)
|
||||||
args = [ "/usr/bin/g++", "a.cc", "-o", "a" ]
|
}
|
||||||
env = [ "PATH=/usr/bin:/bin" ]
|
|
||||||
cpuLimit = 10_000_000_000
|
|
||||||
memoryLimit = 104_857_600
|
|
||||||
procLimit = 50
|
|
||||||
copyOut = [ "stdout", "stderr" ]
|
|
||||||
copyOutCached = [ "a" ]
|
|
||||||
[stages.executor.with.copyIn."a.cc"]
|
|
||||||
content = """
|
|
||||||
#include <iostream>
|
|
||||||
int main() {
|
|
||||||
int a, b;
|
|
||||||
std::cin >> a >> b;
|
|
||||||
std::cout << a + b << '\\n';
|
|
||||||
}"""
|
|
||||||
[[stages.executor.with.files]]
|
|
||||||
content = ""
|
|
||||||
[[stages.executor.with.files]]
|
|
||||||
name = "stdout"
|
|
||||||
max = 4_096
|
|
||||||
[[stages.executor.with.files]]
|
|
||||||
name = "stderr"
|
|
||||||
max = 4_096
|
|
||||||
[stages.parser]
|
|
||||||
name = "dummy"
|
|
||||||
[stages.parser.with]
|
|
||||||
score = 100
|
|
||||||
comment = "compile done"
|
|
||||||
[[stages]]
|
|
||||||
name = "run"
|
|
||||||
[stages.executor]
|
|
||||||
name = "sandbox"
|
|
||||||
[stages.executor.with]
|
|
||||||
args = [ "a" ]
|
|
||||||
env = [ "PATH=/usr/bin:/bin" ]
|
|
||||||
cpuLimit = 10_000_000_000
|
|
||||||
memoryLimit = 104_857_600
|
|
||||||
procLimit = 50
|
|
||||||
copyOut = [ "stdout", "stderr" ]
|
|
||||||
[stages.executor.with.copyInCached]
|
|
||||||
a = "a"
|
|
||||||
[[stages.executor.with.files]]
|
|
||||||
content = "1 1"
|
|
||||||
[[stages.executor.with.files]]
|
|
||||||
name = "stdout"
|
|
||||||
max = 4_096
|
|
||||||
[[stages.executor.with.files]]
|
|
||||||
name = "stderr"
|
|
||||||
max = 4_096
|
|
||||||
[stages.parser]
|
|
||||||
name = "dummy"
|
|
||||||
[stages.parser.with]
|
|
||||||
score = 100
|
|
||||||
comment = "run done"
|
|
||||||
`
|
|
||||||
defer stage.Cleanup()
|
defer stage.Cleanup()
|
||||||
stages := stage.ParseStages(tomlConfig)
|
stages := stage.ParseStages(tomlConfig)
|
||||||
results := stage.Run(stages)
|
results := stage.Run(stages)
|
||||||
for _, result := range results {
|
for _, result := range results {
|
||||||
fmt.Printf(
|
slog.Info(
|
||||||
"%s: score: %d, comment: %s\n",
|
"stage result",
|
||||||
result.Name, result.Score, result.Comment,
|
"name", result.Name,
|
||||||
|
"score", result.Score,
|
||||||
|
"comment", result.Comment,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ func (e *Sandbox) Run(cmd stage.Cmd) (*stage.Result, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if cmd.CopyInCwd {
|
if cmd.CopyInCwd {
|
||||||
|
slog.Info("sandbox run", "copyInCwd", true)
|
||||||
err := filepath.Walk(".",
|
err := filepath.Walk(".",
|
||||||
func(path string, info os.FileInfo, err error) error {
|
func(path string, info os.FileInfo, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -7,9 +7,9 @@ import (
|
||||||
"github.com/pelletier/go-toml/v2"
|
"github.com/pelletier/go-toml/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ParseStages(tomlConfig string) []Stage {
|
func ParseStages(tomlConfig []byte) []Stage {
|
||||||
var stagesConfig StagesConfig
|
var stagesConfig StagesConfig
|
||||||
err := toml.Unmarshal([]byte(tomlConfig), &stagesConfig)
|
err := toml.Unmarshal(tomlConfig, &stagesConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("parse stages config", "error", err)
|
slog.Error("parse stages config", "error", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user