feat: add language selection for build;feat: file and line number for debug messages;fix:add error handling for chdir call
This commit is contained in:
parent
157eafc58b
commit
858b2e7fd7
7 changed files with 18 additions and 31 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +1,6 @@
|
||||||
[submodule "proto"]
|
[submodule "proto"]
|
||||||
path = proto
|
path = proto
|
||||||
url = https://git.sch9.ru/new_gate/contracts
|
url = https://git.sch9.ru/new_gate/contracts
|
||||||
|
[submodule "languages"]
|
||||||
|
path = languages
|
||||||
|
url = https://git.sch9.ru/new_gate/languages
|
||||||
|
|
1
languages
Submodule
1
languages
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 8a7e22c121766e865752f492af978f7225b2a95a
|
5
main.go
5
main.go
|
@ -2,7 +2,6 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
runner "git.sch9.ru/new_gate/ms-runner/runner"
|
runner "git.sch9.ru/new_gate/ms-runner/runner"
|
||||||
"fmt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -10,8 +9,4 @@ func main() {
|
||||||
if(err != nil) {
|
if(err != nil) {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
fmt.Println(runnerService)
|
|
||||||
runnerService.Build([]string{},"");
|
|
||||||
//limits := runner.Limits{Core: 3,Memory: 10000000, Time: 1000}
|
|
||||||
//runner.IsolatedRun([]string{"/bin/echo", "123"}, limits)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package runner
|
package runner
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"io"
|
"io"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
@ -11,6 +10,7 @@ import (
|
||||||
cgroups "github.com/containerd/cgroups"
|
cgroups "github.com/containerd/cgroups"
|
||||||
rand "math/rand"
|
rand "math/rand"
|
||||||
"time"
|
"time"
|
||||||
|
"git.sch9.ru/new_gate/ms-runner/languages"
|
||||||
)
|
)
|
||||||
|
|
||||||
const runIdLength = 20
|
const runIdLength = 20
|
||||||
|
@ -43,7 +43,6 @@ func int32ToString(n int32) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyFile(src string,dst string) error {
|
func copyFile(src string,dst string) error {
|
||||||
log.Println(src,dst)
|
|
||||||
srcFile,err := os.Open(src)
|
srcFile,err := os.Open(src)
|
||||||
if(err!=nil) {return err}
|
if(err!=nil) {return err}
|
||||||
defer srcFile.Close()
|
defer srcFile.Close()
|
||||||
|
@ -115,15 +114,15 @@ func NewRunnerService() (*RunnerService, error) {
|
||||||
return &runnerService,nil
|
return &runnerService,nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (runnerService RunnerService) Build(buildCmd []string, filename string) {
|
func (runnerService RunnerService) Build(languageId int32, filename string) {
|
||||||
core := <-runnerService.CoreFreed
|
core := <-runnerService.CoreFreed
|
||||||
runId := genRunId()
|
runId := genRunId()
|
||||||
err := os.Mkdir("runs/" + runId, 0777)
|
err := os.Mkdir("runs/" + runId, 0777)
|
||||||
if(err!=nil) { log.Fatal(err) }
|
if(err!=nil) { log.Fatal(err) }
|
||||||
os.Chmod("runs/" + runId, 0777)
|
os.Chmod("runs/" + runId, 0777)
|
||||||
copyFile("starter/shared/main.c","runs/"+runId+"/main.c")//FIXME add source and file extension
|
copyFile(filename,"runs/"+runId+"/src")
|
||||||
runnerService.IsolatedRun([]string{"/usr/bin/gcc","/shared/main.c","-o","/shared/executable","-save-temps=obj"},"../runs/"+runId,Limits{Processes: 10,Core:core,Memory:BuildMemory,Time:BuildTime});
|
runnerService.IsolatedRun(languages.Languages[languageId].CompileCmd,"../runs/"+runId,Limits{Processes: 10,Core:core,Memory:BuildMemory,Time:BuildTime});
|
||||||
copyFile("runs/"+runId+"/executable","destination")//FIXME add destination
|
copyFile("runs/"+runId+"/executable","executable")
|
||||||
os.RemoveAll("runs/" + runId)
|
os.RemoveAll("runs/" + runId)
|
||||||
go func() {
|
go func() {
|
||||||
runnerService.CoreFreed <- core
|
runnerService.CoreFreed <- core
|
||||||
|
@ -133,17 +132,10 @@ func (runnerService RunnerService) Build(buildCmd []string, filename string) {
|
||||||
func (runnerService RunnerService) IsolatedRun(command []string, sharedFolder string, limits Limits) {
|
func (runnerService RunnerService) IsolatedRun(command []string, sharedFolder string, limits Limits) {
|
||||||
args := []string{int32ToString(limits.Processes),int32ToString(limits.Core), int32ToString(limits.Memory), int32ToString(limits.Time), sharedFolder}
|
args := []string{int32ToString(limits.Processes),int32ToString(limits.Core), int32ToString(limits.Memory), int32ToString(limits.Time), sharedFolder}
|
||||||
args = append(args, command...)
|
args = append(args, command...)
|
||||||
log.Println(limits.Processes)
|
log.Println("running isolated process with command:",args)
|
||||||
log.Println(string(limits.Processes))
|
|
||||||
log.Println(args)
|
|
||||||
cmd := exec.Command("starter/starter", args...)
|
cmd := exec.Command("starter/starter", args...)
|
||||||
var stdBuffer bytes.Buffer
|
|
||||||
mw := io.MultiWriter(os.Stdout, &stdBuffer)
|
|
||||||
cmd.Stdout = mw
|
|
||||||
err := cmd.Run();
|
err := cmd.Run();
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(123)
|
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
//cmd.Wait()
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,16 +11,10 @@ static void procfs_prepare()
|
||||||
#define hostname "runner"
|
#define hostname "runner"
|
||||||
|
|
||||||
#define put_old "oldfs"
|
#define put_old "oldfs"
|
||||||
//#define shared_folder "../shared"
|
|
||||||
//#define shared_mountpoint "shared"
|
|
||||||
void mnt_prepare(char* rootfs, char* shared_mountpoint) {
|
void mnt_prepare(char* rootfs, char* shared_mountpoint) {
|
||||||
//char* shared_folder = malloc(strlen(shared_mountpoint)+4);
|
|
||||||
//strcpy(shared_folder,"../");
|
|
||||||
//strcat(shared_folder,shared_mountpoint);
|
|
||||||
char* shared_folder=NULL;
|
char* shared_folder=NULL;
|
||||||
asprintf(&shared_folder,"../%s",shared_mountpoint);
|
asprintf(&shared_folder,"../%s",shared_mountpoint);
|
||||||
if (mount(rootfs,rootfs,"ext4",MS_BIND,"")) die("failed to mount %s: %m", rootfs);
|
if (mount(rootfs,rootfs,"ext4",MS_BIND,"")) die("failed to mount %s: %m", rootfs);
|
||||||
//if (mount(shared_mountpoint,shared_mountpoint,"ext4",MS_BIND,"")) die("failed to mount %s: %m",shared_mountpoint);
|
|
||||||
if (chdir(rootfs)) die("falied to cd:%m");
|
if (chdir(rootfs)) die("falied to cd:%m");
|
||||||
//if (mount("/sys","sys","sysfs",0,"")) die("failed to mount sysfs: %m");
|
//if (mount("/sys","sys","sysfs",0,"")) die("failed to mount sysfs: %m");
|
||||||
//if (mount("/dev","dev","udev",0,"")) die("failed to mount: %m");
|
//if (mount("/dev","dev","udev",0,"")) die("failed to mount: %m");
|
||||||
|
@ -58,15 +52,15 @@ static int nsrun(void* arg) {
|
||||||
await_setup(params->fd[0]);
|
await_setup(params->fd[0]);
|
||||||
char cwd[PATH_MAX];
|
char cwd[PATH_MAX];
|
||||||
if(getcwd(cwd,sizeof(cwd))==NULL) die("getcwd error: %m");
|
if(getcwd(cwd,sizeof(cwd))==NULL) die("getcwd error: %m");
|
||||||
if(chdir(params->shared_folder)) die("failed to chdir: %m");
|
if(chdir(params->shared_folder)) die("failed to chdir to shared folder: %m")
|
||||||
int out_fd=open("out",O_WRONLY|O_CREAT,0666);
|
int out_fd=open("out",O_WRONLY|O_CREAT,0666);
|
||||||
if(out_fd==-1) die("unable to open output file:%m");
|
if(out_fd==-1) die("unable to open output file:%m")
|
||||||
else dup2(out_fd,STDOUT_FILENO);
|
else dup2(out_fd,STDOUT_FILENO);
|
||||||
int in_fd=open("in",O_RDONLY|O_CREAT,0666);
|
int in_fd=open("in",O_RDONLY|O_CREAT,0666);
|
||||||
if(in_fd==-1) die("unable to open input file:%m");
|
if(in_fd==-1) die("unable to open input file:%m")
|
||||||
else dup2(in_fd,STDIN_FILENO);
|
else dup2(in_fd,STDIN_FILENO);
|
||||||
int err_fd=open("err",O_WRONLY|O_CREAT,0666);
|
int err_fd=open("err",O_WRONLY|O_CREAT,0666);
|
||||||
if(err_fd==-1) die("unable to open error file:%m");
|
if(err_fd==-1) die("unable to open error file:%m")
|
||||||
else dup2(err_fd,STDERR_FILENO);
|
else dup2(err_fd,STDERR_FILENO);
|
||||||
if(chdir(cwd)) die("failed to chdir: %m");
|
if(chdir(cwd)) die("failed to chdir: %m");
|
||||||
mnt_prepare("minrootfs",params->shared_folder);
|
mnt_prepare("minrootfs",params->shared_folder);
|
||||||
|
|
|
@ -141,7 +141,7 @@ int main(int argc,char** argv) {
|
||||||
if (waitpid(nsrun_pid, NULL, 0) == -1) die("Failed to wait pid %d: %m\n", nsrun_pid);
|
if (waitpid(nsrun_pid, NULL, 0) == -1) die("Failed to wait pid %d: %m\n", nsrun_pid);
|
||||||
kill(kill_pid,SIGKILL);//kill killer
|
kill(kill_pid,SIGKILL);//kill killer
|
||||||
int time = getmstime()-time_start;
|
int time = getmstime()-time_start;
|
||||||
chdir(params.shared_folder);
|
if(chdir(params.shared_folder)) die("Failed to chdir to shared folder:%m");
|
||||||
if(time>=limits.time) {
|
if(time>=limits.time) {
|
||||||
write_file("time", "-1");
|
write_file("time", "-1");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
|
#define die(...) {fprintf(stderr,"file %s,line %d\n",__FILE__,__LINE__);die_func(__VA_ARGS__);}
|
||||||
void remove_cgroup();
|
void remove_cgroup();
|
||||||
|
|
||||||
static void die(const char *fmt, ...)
|
static void die_func(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list params;
|
va_list params;
|
||||||
va_start(params, fmt);
|
va_start(params, fmt);
|
||||||
vfprintf(stderr, fmt, params);
|
vfprintf(stderr, fmt, params);
|
||||||
|
puts("\n");
|
||||||
va_end(params);
|
va_end(params);
|
||||||
remove_cgroup();
|
remove_cgroup();
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
Loading…
Reference in a new issue