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

108 lines
2.4 KiB
Go

package runner
import (
"fmt"
"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 (
Prefix = "./resource/runner"
ProblemDir = "./problem/"
UserDir = "./user/"
TmpDir = "./tmp/"
)
var (
ContainerImageFull string
ContainerImageRun string
)
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)
fmt.Println("ImageFull:", ContainerImageFull)
fmt.Println("ImageRun:", ContainerImageRun)
if ContainerImageFull == "" {
ContainerImageFull = "git.0x7f.app/woj/ubuntu-full:latest"
}
if ContainerImageRun == "" {
ContainerImageRun = "git.0x7f.app/woj/ubuntu-run:latest"
}
}
func (s *service) ProblemExists(meta *JudgeMeta) bool {
problemPath := filepath.Join(ProblemDir, fmt.Sprintf("%d", meta.Run.Version))
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)
}
userPath := filepath.Join(UserDir, meta.Run.User, fmt.Sprintf("%s.%s", meta.Run.User, meta.Run.Lang))
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)
}
return nil, e.Success
}
func (s *service) GetConfig(meta *JudgeMeta, skipCheck bool) e.Status {
config, err := s.ParseConfig(meta, skipCheck)
if err != nil {
return e.RunnerProblemParseFailed
}
lang, ok := config.FilterLanguage(meta.Run.Lang)
if !ok {
return e.RunnerLanguageNotSupported
}
meta.Cfg = JudgeMetaConfig{
All: config,
Lang: lang,
}
return e.Success
}