package main import ( "flag" "fmt" "log" "net/http" "os" "path" "time" fronttime "srs.epita.fr/fic-server/frontend/time" "srs.epita.fr/fic-server/settings" ) const startedFile = "started" var TeamsDir string var SubmissionDir string var TmpSubmissionDir string var touchTimer *time.Timer = nil func touchStartedFile() { if fd, err := os.Create(path.Join(SubmissionDir, startedFile)); err == nil { log.Println("Started! Go, Go, Go!!") fd.Close() } else { log.Fatal("Unable to start challenge:", err) } } func reloadSettings(config settings.FICSettings) { if fronttime.ChallengeStart != config.Start || fronttime.ChallengeEnd != config.End { if touchTimer != nil { touchTimer.Stop() } startSub := config.Start.Sub(time.Now()) if startSub > 0 { log.Println("Challenge will starts at", config.Start, "in", startSub) if _, err := os.Stat(path.Join(SubmissionDir, startedFile)); !os.IsNotExist(err) { os.Remove(path.Join(SubmissionDir, startedFile)) } touchTimer = time.AfterFunc(config.Start.Sub(time.Now().Add(time.Duration(1 * time.Second))), touchStartedFile) } else { log.Println("Challenge started at", config.Start, "since", -startSub) touchStartedFile() } log.Println("Challenge ends on", config.End) fronttime.ChallengeStart = config.Start fronttime.ChallengeEnd = config.End } else { log.Println("Configuration reloaded, but start/end times doesn't change.") } enableResolutionRoute = config.EnableResolutionRoute denyNameChange = config.DenyNameChange allowRegistration = config.AllowRegistration } func main() { var bind = flag.String("bind", "127.0.0.1:8080", "Bind port/socket") var prefix = flag.String("prefix", "", "Request path prefix to strip (from proxy)") flag.StringVar(&TeamsDir, "teams", "./TEAMS", "Base directory where save teams JSON files") flag.StringVar(&SubmissionDir, "submission", "./submissions/", "Base directory where save submissions") flag.Parse() log.SetPrefix("[frontend] ") SubmissionDir = path.Clean(SubmissionDir) TmpSubmissionDir = path.Join(SubmissionDir, ".tmp") log.Println("Creating submission directory...") if _, err := os.Stat(TmpSubmissionDir); os.IsNotExist(err) { if err := os.MkdirAll(TmpSubmissionDir, 0700); err != nil { log.Fatal("Unable to create submission directory: ", err) } } // Load configuration settings.LoadAndWatchSettings(path.Join(TeamsDir, settings.SettingsFile), reloadSettings) // Register handlers http.Handle(fmt.Sprintf("%s/chname/", *prefix), http.StripPrefix(fmt.Sprintf("%s/chname/", *prefix), ChNameHandler{})) http.Handle(fmt.Sprintf("%s/openhint/", *prefix), http.StripPrefix(fmt.Sprintf("%s/openhint/", *prefix), HintHandler{})) http.Handle(fmt.Sprintf("%s/registration", *prefix), http.StripPrefix(fmt.Sprintf("%s/registration", *prefix), RegistrationHandler{})) http.Handle(fmt.Sprintf("%s/resolution/", *prefix), http.StripPrefix(fmt.Sprintf("%s/resolution/", *prefix), ResolutionHandler{})) http.Handle(fmt.Sprintf("%s/submission/", *prefix), http.StripPrefix(fmt.Sprintf("%s/submission/", *prefix), SubmissionHandler{})) http.Handle(fmt.Sprintf("%s/time.json", *prefix), http.StripPrefix(*prefix, fronttime.TimeHandler{})) // Serve pages 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) } }