frontend: copy settings.json on settings reload (to handle delayed settings propagation)

This commit is contained in:
nemunaire 2020-01-23 13:06:39 +01:00
parent 4820d42327
commit caea02bb4d
6 changed files with 29 additions and 4 deletions

1
.gitignore vendored
View File

@ -2,6 +2,7 @@ DASHBOARD/
FILES/
PKI/
SETTINGS/
SETTINGSDIST/
TEAMS/
submissions/
admin/sync/README.html

View File

@ -157,7 +157,7 @@ server {
add_header Cache-Control no-cache;
}
location = /settings.json {
root /srv/SETTINGS/;
root /srv/SETTINGSDIST/;
expires epoch;
add_header X-FIC-time $msec;
add_header Cache-Control no-cache;

View File

@ -149,7 +149,7 @@ server {
add_header Cache-Control no-cache;
}
location = /settings.json {
root /srv/SETTINGS/;
root /srv/SETTINGSDIST/;
expires epoch;
add_header X-FIC-time $msec;
add_header Cache-Control no-cache;

View File

@ -138,7 +138,7 @@ services:
- /www/htdocs-frontend:/srv/htdocs-frontend:ro
- /var/lib/fic/files:/srv/FILES:ro
- /var/lib/fic/pki:/srv/PKI:ro
- /var/lib/fic/settings:/srv/SETTINGS:ro
- /var/lib/fic/settingsdist:/srv/SETTINGSDIST:ro
- /var/lib/fic/startingblock:/srv/startingblock:ro
- /var/lib/fic/teams:/srv/TEAMS:ro
net: /run/netns/nginx
@ -150,6 +150,7 @@ services:
- /var/lib/fic/files
- /var/lib/fic/pki
- /var/lib/fic/startingblock
- /var/lib/fic/settingsdist
- /var/lib/fic/teams
- name: fic-frontend
image: nemunaire/fic-frontend:latest
@ -158,6 +159,7 @@ services:
- /etc/hosts:/etc/hosts:ro
- /var/lib/fic/files:/srv/FILES:ro
- /var/lib/fic/settings:/srv/SETTINGS:ro
- /var/lib/fic/settingsdist:/srv/SETTINGSDIST
- /var/lib/fic/startingblock:/srv/startingblock
- /var/lib/fic/submissions:/srv/submissions
- /var/lib/fic/teams:/srv/TEAMS:ro
@ -166,6 +168,7 @@ services:
mkdir:
- /var/lib/fic/files
- /var/lib/fic/settings
- /var/lib/fic/settingsdist
- /var/lib/fic/startingblock
- /var/lib/fic/submissions
- /var/lib/fic/teams

View File

@ -21,6 +21,7 @@ func main() {
var prefix = flag.String("prefix", "/", "Request path prefix to strip (from proxy)")
var teamsDir = flag.String("teams", "./TEAMS/", "Base directory where find existing teams")
flag.StringVar(&settings.SettingsDir, "settings", settings.SettingsDir, "Base directory where read settings")
flag.StringVar(&SettingsDistDir, "settingsDist", SettingsDistDir, "Directory where place settings to distribute")
flag.StringVar(&startedFile, "startedFile", startedFile, "Path to the file to create/remove whether or not the challenge is running")
flag.StringVar(&SubmissionDir, "submission", "./submissions/", "Base directory where save submissions")
var simulator = flag.String("simulator", "", "Team to simulate (for development only)")
@ -40,6 +41,13 @@ func main() {
}
}
log.Println("Creating settingsDist directory...")
if _, err := os.Stat(SettingsDistDir); os.IsNotExist(err) {
if err = os.MkdirAll(SettingsDistDir, 0755); err != nil {
log.Fatal("Unable to create settingsdist directory:", err)
}
}
*prefix = strings.TrimRight(*prefix, "/")
// Load configuration
@ -67,7 +75,7 @@ func main() {
http.Handle(fmt.Sprintf("%s/teams.json", *prefix), http.StripPrefix(*prefix, http.FileServer(http.Dir(*teamsDir))))
http.Handle(fmt.Sprintf("%s/themes.json", *prefix), http.StripPrefix(*prefix, http.FileServer(http.Dir(*teamsDir))))
http.Handle(fmt.Sprintf("%s/stats.json", *prefix), http.StripPrefix(*prefix, http.FileServer(http.Dir(*teamsDir))))
http.Handle(fmt.Sprintf("%s/settings.json", *prefix), http.StripPrefix(*prefix, http.FileServer(http.Dir(settings.SettingsDir))))
http.Handle(fmt.Sprintf("%s/settings.json", *prefix), http.StripPrefix(*prefix, http.FileServer(http.Dir(SettingsDistDir))))
// Serve static assets
http.Handle(fmt.Sprintf("%s/css/", *prefix), http.StripPrefix(*prefix, http.FileServer(http.Dir(staticDir))))

View File

@ -1,8 +1,10 @@
package main
import (
"io/ioutil"
"log"
"os"
"path"
"time"
"srs.epita.fr/fic-server/settings"
@ -10,6 +12,8 @@ import (
var startedFile = "started"
var SettingsDistDir = "./SETTINGSDIST/"
var touchTimer *time.Timer = nil
var challengeStart time.Time
var challengeEnd time.Time
@ -24,6 +28,15 @@ func touchStartedFile() {
}
func reloadSettings(config settings.FICSettings) {
// Copy the new settings file for distribution
if data, err := ioutil.ReadFile(path.Join(settings.SettingsDir, settings.SettingsFile)); err != nil {
log.Println("Unable to read settings file:", err)
} else if err = ioutil.WriteFile(path.Join(SettingsDistDir, settings.SettingsFile + ".tmp"), data, 0644); err != nil {
log.Println("Unable to write tmp settings file:", err)
} else if err := os.Rename(path.Join(SettingsDistDir, settings.SettingsFile + ".tmp"), path.Join(SettingsDistDir, settings.SettingsFile)); err != nil {
log.Println("Unable to move new settings file:", err)
}
if challengeStart != config.Start || challengeEnd != config.End {
if touchTimer != nil {
touchTimer.Stop()