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(`` + dir.Name() + ` | `))
}
}
w.Write([]byte(`
`))
for _, student := range students {
login := student[2]
w.Write([]byte(`` + login + ` | `))
for _, dir := range dirs {
if dir.IsDir() {
if fi, err := os.Stat(path.Join(rendusDir, dir.Name(), login)); err == nil {
w.Write([]byte(`` + fi.ModTime().Format(time.UnixDate) + ` | `))
} else {
w.Write([]byte(` | `))
}
}
}
w.Write([]byte(`
`))
}
}
w.Write([]byte(`
`))
}
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)
}
}