diff --git a/admin/api/claim.go b/admin/api/claim.go index 6a958938..cf545fff 100644 --- a/admin/api/claim.go +++ b/admin/api/claim.go @@ -1,25 +1,21 @@ package api import ( - "bytes" "encoding/json" "fmt" "io/ioutil" "log" - "net" "net/http" "path" "strconv" - "strings" "time" + "srs.epita.fr/fic-server/admin/generation" "srs.epita.fr/fic-server/libfic" "github.com/gin-gonic/gin" ) -var GeneratorSocket string - func declareClaimsRoutes(router *gin.RouterGroup) { // Tasks router.GET("/claims", getClaims) @@ -292,7 +288,7 @@ func clearClaims(c *gin.Context) { } func generateTeamIssuesFile(team fic.Team) error { - if GeneratorSocket == "" { + if generation.GeneratorSocket == "" { if my, err := team.MyIssueFile(); err != nil { return fmt.Errorf("Unable to generate issue FILE (tid=%d): %w", team.Id, err) } else if j, err := json.Marshal(my); err != nil { @@ -301,35 +297,16 @@ func generateTeamIssuesFile(team fic.Team) error { return fmt.Errorf("Unable to write issues' file: %w", err) } } else { - buf, err := json.Marshal(fic.GenStruct{Type: fic.GenTeamIssues, TeamId: team.Id}) - if err != nil { - return fmt.Errorf("Something is wrong with JSON encoder: %w", err) - } - - sockType := "unix" - if strings.Contains(GeneratorSocket, ":") { - sockType = "tcp" - } - - socket, err := net.Dial(sockType, GeneratorSocket) + resp, err := generation.PerformGeneration(fic.GenStruct{Type: fic.GenTeamIssues, TeamId: team.Id}) if err != nil { return err } - defer socket.Close() + defer resp.Body.Close() - httpClient := &http.Client{ - Transport: &http.Transport{ - Dial: func(network, addr string) (net.Conn, error) { - return socket, nil - }, - }, + if resp.StatusCode != http.StatusOK { + v, _ := ioutil.ReadAll(resp.Body) + return fmt.Errorf("%s", string(v)) } - - resp, err := httpClient.Post("http://localhost/enqueue", "application/json", bytes.NewReader(buf)) - if err != nil { - return fmt.Errorf("Unable to enqueue new generation event: %w", err) - } - resp.Body.Close() } return nil } diff --git a/admin/api/settings.go b/admin/api/settings.go index 4213d37a..138a2d1b 100644 --- a/admin/api/settings.go +++ b/admin/api/settings.go @@ -12,6 +12,7 @@ import ( "strconv" "time" + "srs.epita.fr/fic-server/admin/generation" "srs.epita.fr/fic-server/admin/sync" "srs.epita.fr/fic-server/libfic" "srs.epita.fr/fic-server/settings" @@ -47,6 +48,7 @@ func declareSettingsRoutes(router *gin.RouterGroup) { apiNextSettingsRoutes.DELETE("", deleteNextSettings) router.POST("/reset", reset) + router.POST("/full-generation", fullGeneration) router.GET("/prod", func(c *gin.Context) { c.JSON(http.StatusOK, IsProductionEnv) @@ -80,6 +82,21 @@ func NextSettingsHandler(c *gin.Context) { c.Next() } +func fullGeneration(c *gin.Context) { + resp, err := generation.FullGeneration() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "errmsg": err.Error(), + }) + } + defer resp.Body.Close() + + v, _ := io.ReadAll(resp.Body) + c.JSON(resp.StatusCode, gin.H{ + "errmsg": v, + }) +} + func getROSettings(c *gin.Context) { syncMtd := "Disabled" if sync.GlobalImporter != nil { diff --git a/admin/api/sync.go b/admin/api/sync.go index c0630ac2..0ef44ef2 100644 --- a/admin/api/sync.go +++ b/admin/api/sync.go @@ -8,9 +8,9 @@ import ( "path" "strings" + "srs.epita.fr/fic-server/admin/generation" "srs.epita.fr/fic-server/admin/sync" "srs.epita.fr/fic-server/libfic" - "srs.epita.fr/fic-server/settings" "github.com/gin-gonic/gin" ) @@ -292,7 +292,10 @@ func autoSync(c *gin.Context) { sync.EditDeepReport(&sync.SyncReport{Themes: map[string][]string{theTheme.Name: st}}, false) sync.DeepSyncProgress = 255 - settings.ForceRegeneration() + resp, err := generation.FullGeneration() + if err == nil { + defer resp.Body.Close() + } c.JSON(http.StatusOK, st) } diff --git a/admin/generation/generation.go b/admin/generation/generation.go new file mode 100644 index 00000000..ffbaafd9 --- /dev/null +++ b/admin/generation/generation.go @@ -0,0 +1,60 @@ +package generation + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net" + "net/http" + "strings" + + "srs.epita.fr/fic-server/libfic" +) + +var GeneratorSocket string + +func doGeneration(uri string, contenttype string, buf io.Reader) (*http.Response, error) { + sockType := "unix" + if strings.Contains(GeneratorSocket, ":") { + sockType = "tcp" + } + + socket, err := net.Dial(sockType, GeneratorSocket) + if err != nil { + return nil, err + } + defer socket.Close() + + httpClient := &http.Client{ + Transport: &http.Transport{ + Dial: func(network, addr string) (net.Conn, error) { + return socket, nil + }, + }, + } + + return httpClient.Post("http://localhost"+uri, contenttype, buf) +} + +func EnqueueGeneration(gs fic.GenStruct) (*http.Response, error) { + buf, err := json.Marshal(gs) + if err != nil { + return nil, fmt.Errorf("Something is wrong with JSON encoder: %w", err) + } + + return doGeneration("/enqueue", "application/json", bytes.NewReader(buf)) +} + +func PerformGeneration(gs fic.GenStruct) (*http.Response, error) { + buf, err := json.Marshal(gs) + if err != nil { + return nil, fmt.Errorf("Something is wrong with JSON encoder: %w", err) + } + + return doGeneration("/perform", "application/json", bytes.NewReader(buf)) +} + +func FullGeneration() (*http.Response, error) { + return doGeneration("/full", "application/json", nil) +} diff --git a/admin/index.go b/admin/index.go index 7cfeea3e..46c13c15 100644 --- a/admin/index.go +++ b/admin/index.go @@ -128,7 +128,13 @@ const indextpl = `
- + Démarrage dans : {{"{{ startIn }}"}}" diff --git a/admin/main.go b/admin/main.go index c932085e..f4913daf 100644 --- a/admin/main.go +++ b/admin/main.go @@ -14,6 +14,7 @@ import ( "syscall" "srs.epita.fr/fic-server/admin/api" + "srs.epita.fr/fic-server/admin/generation" "srs.epita.fr/fic-server/admin/pki" "srs.epita.fr/fic-server/admin/sync" "srs.epita.fr/fic-server/libfic" @@ -108,7 +109,7 @@ func main() { flag.StringVar(&api.DashboardDir, "dashbord", "./DASHBOARD", "Base directory where save public JSON files") flag.StringVar(&settings.SettingsDir, "settings", settings.SettingsDir, "Base directory where load and save settings") flag.StringVar(&fic.FilesDir, "files", fic.FilesDir, "Base directory where found challenges files, local part") - flag.StringVar(&api.GeneratorSocket, "generator", "./GENERATOR/generator.socket", "Path to the generator socket (used to trigger issues.json generations, use an empty string to generate locally)") + flag.StringVar(&generation.GeneratorSocket, "generator", "./GENERATOR/generator.socket", "Path to the generator socket (used to trigger issues.json generations, use an empty string to generate locally)") flag.StringVar(&localImporterDirectory, "localimport", localImporterDirectory, "Base directory where found challenges files to import, local part") flag.BoolVar(&localImporterSymlink, "localimportsymlink", localImporterSymlink, diff --git a/admin/static/js/app.js b/admin/static/js/app.js index bea958fd..c36d28b3 100644 --- a/admin/static/js/app.js +++ b/admin/static/js/app.js @@ -480,15 +480,16 @@ angular.module("FICApp") } $rootScope.staticFilesNeedUpdate = 0; + $rootScope.staticRegenerationInProgress = false; $rootScope.regenerateStaticFiles = function() { - Settings.get().$promise.then(function(config) { - config.generation = (new Date()).toISOString(); - config.$update(function() { - $rootScope.staticFilesNeedUpdate = 0; - $rootScope.addToast('success', "Regeneration in progress..."); - }, function (response) { - $rootScope.addToast('success', 'An error occurs when saving settings:', response.data.errmsg); - }) + $rootScope.staticRegenerationInProgress = true; + $http.post("api/full-generation").then(function(response) { + $rootScope.staticFilesNeedUpdate = 0; + $rootScope.staticRegenerationInProgress = false; + $rootScope.addToast('success', 'Regeneration ended'); + }, function (response) { + $rootScope.staticRegenerationInProgress = false; + $rootScope.addToast('error', 'An error occurs when saving settings:', response.data.errmsg); }) } @@ -633,11 +634,6 @@ angular.module("FICApp") $scope.addToast('danger', 'An error occurs when saving settings:', response.data.errmsg); }); } - $scope.regenerate = function() { - this.config.generation = (new Date()).toISOString(); - $rootScope.settings.generation = new Date(this.config.generation); - $scope.saveSettings("Regeneration in progress..."); - } $scope.launchChallenge = function() { var ts = Date.now() - Date.now() % 60000; var d = new Date(ts + 120000); diff --git a/admin/static/views/settings.html b/admin/static/views/settings.html index ca51cae1..9a0c9b06 100644 --- a/admin/static/views/settings.html +++ b/admin/static/views/settings.html @@ -31,8 +31,6 @@