woj-server/internal/service/runner/common.go

100 lines
2.4 KiB
Go
Raw Permalink Normal View History

package runner
import (
"fmt"
2023-07-14 21:47:11 +08:00
"git.0x7f.app/WOJ/woj-server/internal/e"
"git.0x7f.app/WOJ/woj-server/pkg/file"
"go.uber.org/zap"
"os"
"path"
"path/filepath"
)
var (
2024-03-13 20:03:12 +08:00
Prefix = "./resource/runner"
ProblemDir = "./problem/"
UserDir = "./user/"
TmpDir = "./tmp/"
NSJailFile = "./framework/scripts/nsjail"
RootfsFullDir = "./framework/rootfs/full"
RootfsRunDir = "./framework/rootfs/run"
2024-01-27 17:37:27 +08:00
)
type JudgeMetaRun struct {
Version uint // problem version id
User string // user id
Lang string // language
}
type JudgeMetaConfig struct {
All *Config
Lang *ConfigLanguage
}
type JudgeMeta struct {
Run JudgeMetaRun
Cfg JudgeMetaConfig
}
func init() {
wd, err := os.Getwd()
if err != nil {
panic(err)
}
Prefix = path.Join(wd, Prefix)
ProblemDir = path.Join(Prefix, ProblemDir)
UserDir = path.Join(Prefix, UserDir)
TmpDir = path.Join(Prefix, TmpDir)
2024-03-13 20:03:12 +08:00
NSJailFile = path.Join(Prefix, NSJailFile)
RootfsFullDir = path.Join(Prefix, RootfsFullDir)
RootfsRunDir = path.Join(Prefix, RootfsRunDir)
}
func (s *service) ProblemExists(meta *JudgeMeta) bool {
problemPath := filepath.Join(ProblemDir, fmt.Sprintf("%d", meta.Run.Version))
2024-01-06 19:47:16 +08:00
return file.Exist(problemPath)
}
func (s *service) ValidatePath(meta *JudgeMeta) (*JudgeStatus, e.Status) {
gen := func(status e.Status) (*JudgeStatus, e.Status) {
return &JudgeStatus{
Message: fmt.Sprintf("System Error: Problem/User Files Not Found (%d:%s)", status, status.String()),
CompileMessage: "",
Tasks: []TaskStatus{{Verdict: VerdictSystemError, Message: "System Error"}},
}, status
}
if !s.ProblemExists(meta) {
s.log.Error("problem not exists", zap.Uint("version", meta.Run.Version))
return gen(e.RunnerProblemNotExist)
2024-01-06 17:32:05 +08:00
}
userPath := filepath.Join(UserDir, meta.Run.User, fmt.Sprintf("%s.%s", meta.Run.User, meta.Run.Lang))
2024-01-06 19:47:16 +08:00
if !file.Exist(userPath) {
s.log.Error("user program not exists", zap.String("user", meta.Run.User), zap.String("lang", meta.Run.Lang))
return gen(e.RunnerUserNotExist)
2024-01-06 17:32:05 +08:00
}
return nil, e.Success
2024-01-06 17:32:05 +08:00
}
func (s *service) GetConfig(meta *JudgeMeta, skipCheck bool) e.Status {
config, err := s.ParseConfig(meta, skipCheck)
if err != nil {
return e.RunnerProblemParseFailed
2024-01-06 19:21:37 +08:00
}
lang, ok := config.FilterLanguage(meta.Run.Lang)
if !ok {
return e.RunnerLanguageNotSupported
2024-01-06 19:21:37 +08:00
}
meta.Cfg = JudgeMetaConfig{
All: config,
Lang: lang,
}
return e.Success
2024-01-06 19:21:37 +08:00
}