diff --git a/.gitmodules b/.gitmodules index b358abe..85ae4dc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "proto"] path = proto url = https://git.sch9.ru/new_gate/contracts +[submodule "languages"] + path = languages + url = https://git.sch9.ru/new_gate/languages diff --git a/languages b/languages new file mode 160000 index 0000000..8a7e22c --- /dev/null +++ b/languages @@ -0,0 +1 @@ +Subproject commit 8a7e22c121766e865752f492af978f7225b2a95a diff --git a/main.go b/main.go index cfba019..237f0a2 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,6 @@ package main import ( runner "git.sch9.ru/new_gate/ms-runner/runner" - "fmt" ) func main() { @@ -10,8 +9,4 @@ func main() { if(err != nil) { panic(err) } - fmt.Println(runnerService) - runnerService.Build([]string{},""); - //limits := runner.Limits{Core: 3,Memory: 10000000, Time: 1000} - //runner.IsolatedRun([]string{"/bin/echo", "123"}, limits) } diff --git a/runner/runner.go b/runner/runner.go index aecea30..daf957d 100644 --- a/runner/runner.go +++ b/runner/runner.go @@ -1,7 +1,6 @@ package runner import ( - "bytes" "io" "fmt" "log" @@ -11,6 +10,7 @@ import ( cgroups "github.com/containerd/cgroups" rand "math/rand" "time" + "git.sch9.ru/new_gate/ms-runner/languages" ) const runIdLength = 20 @@ -43,7 +43,6 @@ func int32ToString(n int32) string { } func copyFile(src string,dst string) error { - log.Println(src,dst) srcFile,err := os.Open(src) if(err!=nil) {return err} defer srcFile.Close() @@ -115,15 +114,15 @@ func NewRunnerService() (*RunnerService, error) { return &runnerService,nil } -func (runnerService RunnerService) Build(buildCmd []string, filename string) { +func (runnerService RunnerService) Build(languageId int32, filename string) { core := <-runnerService.CoreFreed runId := genRunId() err := os.Mkdir("runs/" + runId, 0777) if(err!=nil) { log.Fatal(err) } os.Chmod("runs/" + runId, 0777) - copyFile("starter/shared/main.c","runs/"+runId+"/main.c")//FIXME add source and file extension - 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}); - copyFile("runs/"+runId+"/executable","destination")//FIXME add destination + copyFile(filename,"runs/"+runId+"/src") + runnerService.IsolatedRun(languages.Languages[languageId].CompileCmd,"../runs/"+runId,Limits{Processes: 10,Core:core,Memory:BuildMemory,Time:BuildTime}); + copyFile("runs/"+runId+"/executable","executable") os.RemoveAll("runs/" + runId) go func() { 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) { args := []string{int32ToString(limits.Processes),int32ToString(limits.Core), int32ToString(limits.Memory), int32ToString(limits.Time), sharedFolder} args = append(args, command...) - log.Println(limits.Processes) - log.Println(string(limits.Processes)) - log.Println(args) + log.Println("running isolated process with command:",args) cmd := exec.Command("starter/starter", args...) - var stdBuffer bytes.Buffer - mw := io.MultiWriter(os.Stdout, &stdBuffer) - cmd.Stdout = mw err := cmd.Run(); if err != nil { - log.Println(123) log.Println(err) } - //cmd.Wait() } diff --git a/starter/ns_exec.c b/starter/ns_exec.c index 3e673bd..8503837 100644 --- a/starter/ns_exec.c +++ b/starter/ns_exec.c @@ -11,16 +11,10 @@ static void procfs_prepare() #define hostname "runner" #define put_old "oldfs" -//#define shared_folder "../shared" -//#define shared_mountpoint "shared" 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; asprintf(&shared_folder,"../%s",shared_mountpoint); 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 (mount("/sys","sys","sysfs",0,"")) die("failed to mount sysfs: %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]); char cwd[PATH_MAX]; 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); - 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); 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); 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); if(chdir(cwd)) die("failed to chdir: %m"); mnt_prepare("minrootfs",params->shared_folder); diff --git a/starter/starter.c b/starter/starter.c index ee618c8..d1ece92 100644 --- a/starter/starter.c +++ b/starter/starter.c @@ -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); kill(kill_pid,SIGKILL);//kill killer 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) { write_file("time", "-1"); } diff --git a/starter/util.h b/starter/util.h index 7463939..835656c 100644 --- a/starter/util.h +++ b/starter/util.h @@ -1,10 +1,12 @@ +#define die(...) {fprintf(stderr,"file %s,line %d\n",__FILE__,__LINE__);die_func(__VA_ARGS__);} void remove_cgroup(); -static void die(const char *fmt, ...) +static void die_func(const char *fmt, ...) { va_list params; va_start(params, fmt); vfprintf(stderr, fmt, params); + puts("\n"); va_end(params); remove_cgroup(); exit(1);