package main import ( "bufio" "encoding/csv" "flag" "fmt" "io/ioutil" "log" "net/http" "os" "path" "path/filepath" "time" ) var students [][]string var rendusDir string var title string func Serve(w http.ResponseWriter, r *http.Request) { log.Printf("Handling %s request from %s: %s [%s]\n", r.Method, r.RemoteAddr, r.URL.Path, r.UserAgent()) w.Header().Set("Content-Type", "text/html") w.Write([]byte(` ` + title + `

` + title + `

`)) if dirs, err := ioutil.ReadDir(rendusDir); err == nil { w.Write([]byte(``)) for _, dir := range dirs { if dir.IsDir() { w.Write([]byte(``)) } } w.Write([]byte(``)) for _, student := range students { login := student[2] w.Write([]byte(``)) for _, dir := range dirs { if dir.IsDir() { if fi, err := os.Stat(path.Join(rendusDir, dir.Name(), login)); err == nil { w.Write([]byte(``)) } else { w.Write([]byte(``)) } } } w.Write([]byte(``)) } } w.Write([]byte(`
` + dir.Name() + `
` + login + `` + fi.ModTime().Format(time.UnixDate) + `
`)) } func main() { var studentsFile string var bind = flag.String("bind", "0.0.0.0:8081", "Bind port/socket") flag.StringVar(&studentsFile, "students", "./students.csv", "Path to a CSV file containing in the third column the name of the directory to look for") flag.StringVar(&rendusDir, "path", "./rendu/", "Path to the submissions directory (each subdirectory is a project)") flag.StringVar(&title, "title", "Rendus VIRLI", "Title of the page") flag.Parse() var err error if rendusDir, err = filepath.Abs(rendusDir); err != nil { log.Fatal(err) } else if dirs, err := ioutil.ReadDir(rendusDir); err != nil { log.Fatal(err) } else { var projects []string nbProj := 0 for _, dir := range dirs { if dir.IsDir() { projects = append(projects, dir.Name()) nbProj++ } } log.Println(nbProj, "projects found:", projects) } // Read and parse students list log.Println("Reading students files...") if studentsFile, err = filepath.Abs(studentsFile); err != nil { log.Fatal(err) } else if fi, err := os.Open(studentsFile); err != nil { log.Fatal(err) } else { r := csv.NewReader(bufio.NewReader(fi)) if students, err = r.ReadAll(); err != nil { log.Fatal(err) } } log.Println(len(students), "students loaded.") log.Println("Registering handlers...") http.HandleFunc("/", Serve) log.Println(fmt.Sprintf("Ready, listening on %s", *bind)) if err := http.ListenAndServe(*bind, nil); err != nil { log.Fatal("Unable to listen and serve: ", err) } }