diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 00000000..e34d8c32 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1 @@ +backend diff --git a/backend/main.go b/backend/main.go new file mode 100644 index 00000000..e20b7644 --- /dev/null +++ b/backend/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "flag" + "io/ioutil" + "log" + "os" + "path" + "strings" + + "golang.org/x/exp/inotify" + "srs.epita.fr/fic-server/libfic" +) + +var SubmissionDir string +var BaseURL string + +func watchsubdir(watcher *inotify.Watcher, pathname string) error { + log.Println("Watch new directory:", pathname) + if err := watcher.AddWatch(pathname, inotify.IN_CLOSE_WRITE|inotify.IN_CREATE); err != nil { + return err + } + + if ds, err := ioutil.ReadDir(pathname); err != nil { + return err + } else { + for _, d := range ds { + p := path.Join(pathname, d.Name()) + if d.IsDir() { + if err := watchsubdir(watcher, p); err != nil { + return err + } + } + } + return nil + } +} + +func main() { + var dbfile = flag.String("db", "fic.db", "Path to the DB") + flag.StringVar(&BaseURL, "baseurl", "http://fic.srs.epita.fr/", "URL prepended to each URL") + flag.StringVar(&SubmissionDir, "submission", "./submissions", "Base directory where save submissions") + flag.Parse() + + SubmissionDir = path.Clean(SubmissionDir) + + log.Println("Creating submission directory...") + if _, err := os.Stat(SubmissionDir); os.IsNotExist(err) { + if err := os.MkdirAll(SubmissionDir, 0777); err != nil { + log.Fatal("Unable to create submission directory: ", err) + } + } + + log.Println("Opening DB...") + if err := fic.DBInit(*dbfile); err != nil { + log.Fatal("Cannot open the database: ", err) + os.Exit(1) + + } + defer fic.DBClose() + + log.Println("Registering directory events...") + watcher, err := inotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + + if err := watchsubdir(watcher, SubmissionDir); err != nil { + log.Fatal(err) + } + + for { + select { + case ev := <-watcher.Event: + if ev.Mask&inotify.IN_CREATE == inotify.IN_CREATE { + // Register new subdirectory + if d, err := os.Stat(ev.Name); err == nil && d.IsDir() { + if err := watchsubdir(watcher, ev.Name); err != nil { + log.Println(err) + } + } + } else if ev.Mask&inotify.IN_CLOSE_WRITE == inotify.IN_CLOSE_WRITE { + // Extract + spath := strings.Split(strings.TrimPrefix(ev.Name, SubmissionDir), "/") + + if err := treatSubmission(ev.Name, spath[1], spath[2]); err != nil { + log.Println("An error occurs during treating:", err) + } + } + case err := <-watcher.Error: + log.Println("error:", err) + } + } +} diff --git a/backend/submission.go b/backend/submission.go new file mode 100644 index 00000000..eb4c91af --- /dev/null +++ b/backend/submission.go @@ -0,0 +1,37 @@ +package main + +import ( + "bufio" + "log" + "os" + "strconv" + + "srs.epita.fr/fic-server/libfic" +) + +func treatSubmission(pathname string, team_id string, exercice_id string) error { + log.Println("Treating", pathname) + + if tid, err := strconv.Atoi(team_id); err != nil { + return err + } else if eid, err := strconv.Atoi(exercice_id); err != nil { + return err + } else if team, err := fic.GetTeam(tid); err != nil { + return err + } else if exercice, err := fic.GetExercice(eid); err != nil { + return err + } else if file, err := os.Open(pathname); err != nil { + return err + } else { + defer file.Close() + + cnt := "" + scanner := bufio.NewScanner(file) + for scanner.Scan() { + cnt += scanner.Text() + } + log.Println(team, exercice, cnt) + + return nil + } +}