2022-10-22 17:38:39 +08:00
|
|
|
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/utils"
|
2022-10-22 17:38:39 +08:00
|
|
|
"go.uber.org/zap"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"path"
|
|
|
|
"path/filepath"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
Prefix = "./resource/runner"
|
2022-10-23 17:29:35 +08:00
|
|
|
ProblemDir = "./problem/"
|
2022-10-22 17:38:39 +08:00
|
|
|
ScriptsDir = "./scripts/"
|
2022-10-23 17:29:35 +08:00
|
|
|
UserDir = "./user/"
|
2022-10-22 17:38:39 +08:00
|
|
|
TmpDir = "./tmp/"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
wd, err := os.Getwd()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
Prefix = path.Join(wd, Prefix)
|
|
|
|
ProblemDir = path.Join(Prefix, ProblemDir)
|
|
|
|
ScriptsDir = path.Join(Prefix, ScriptsDir)
|
|
|
|
UserDir = path.Join(Prefix, UserDir)
|
|
|
|
TmpDir = path.Join(Prefix, TmpDir)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *service) execute(script string, args ...string) error {
|
|
|
|
p := filepath.Join(ScriptsDir, script)
|
|
|
|
cmd := exec.Command(p, args...)
|
|
|
|
cmd.Dir = ScriptsDir
|
2022-10-28 21:57:28 +08:00
|
|
|
if s.verbose {
|
|
|
|
cmd.Stdout = os.Stderr
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
}
|
2022-10-22 17:38:39 +08:00
|
|
|
return cmd.Run()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *service) checkAndExecute(version uint, user string, lang string, script string, fail e.Status) e.Status {
|
2022-10-23 17:29:35 +08:00
|
|
|
if !s.ProblemExists(version) {
|
2022-10-22 17:38:39 +08:00
|
|
|
s.log.Info("problem not exists", zap.Uint("version", version))
|
|
|
|
return e.RunnerProblemNotExist
|
|
|
|
}
|
|
|
|
|
|
|
|
if !s.userExists(user, fmt.Sprintf("%s.%s", user, lang)) {
|
|
|
|
s.log.Info("user program not exists", zap.String("user", user), zap.String("lang", lang))
|
|
|
|
return e.RunnerUserNotExist
|
|
|
|
}
|
|
|
|
|
2022-10-23 17:29:35 +08:00
|
|
|
err := s.execute(script, fmt.Sprintf("%d", version), user, lang)
|
2022-10-22 17:38:39 +08:00
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
s.log.Info("execute failed",
|
|
|
|
zap.Error(err),
|
|
|
|
zap.Uint("version", version),
|
|
|
|
zap.String("user", user),
|
|
|
|
zap.String("lang", lang))
|
|
|
|
return fail
|
|
|
|
}
|
|
|
|
|
|
|
|
return e.Success
|
|
|
|
}
|
|
|
|
|
2022-10-23 17:29:35 +08:00
|
|
|
func (s *service) ProblemExists(version uint) bool {
|
2022-10-22 17:38:39 +08:00
|
|
|
problemPath := filepath.Join(ProblemDir, fmt.Sprintf("%d", version))
|
|
|
|
return utils.FileExist(problemPath)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *service) userExists(user string, file string) bool {
|
2022-10-23 17:29:35 +08:00
|
|
|
userPath := filepath.Join(UserDir, user, file)
|
2022-10-22 17:38:39 +08:00
|
|
|
return utils.FileExist(userPath)
|
|
|
|
}
|