From 007efc6118a88cfa410cd8b7eff6969d835fcf39 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Wed, 29 Jan 2020 11:35:01 +0100 Subject: [PATCH] health: done --- admin/api/health.go | 25 +++++++++++++++++++++---- admin/pki/team.go | 4 ++++ admin/static/js/app.js | 12 ++++++++++++ admin/static/views/home.html | 32 +++++++++++++++++++++----------- 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/admin/api/health.go b/admin/api/health.go index 43f3da77..f3cf2e27 100644 --- a/admin/api/health.go +++ b/admin/api/health.go @@ -8,6 +8,8 @@ import ( "strings" "time" + "srs.epita.fr/fic-server/admin/pki" + "github.com/julienschmidt/httprouter" ) @@ -30,17 +32,32 @@ func init() { router.GET("/api/health.json", apiHandler(GetHealth)) } -func getHealth(pathname string) (ret []string) { +type healthFileReport struct { + IdTeam string `json:"id_team,omitempty"` + Path string `json:"path"` + Error string `json:"error"` +} + +func getHealth(pathname string) (ret []healthFileReport) { if ds, err := ioutil.ReadDir(pathname); err != nil { - ret = append(ret, fmt.Sprintf("%s: unable to ReadDir: %s", strings.TrimPrefix(pathname, TimestampCheck), err)) + ret = append(ret, healthFileReport{ + Path: strings.TrimPrefix(pathname, TimestampCheck), + Error: fmt.Sprintf("unable to ReadDir: %s", err), + }) return } else { for _, d := range ds { p := path.Join(pathname, d.Name()) if d.IsDir() && d.Name() != ".tmp" && d.Mode()&os.ModeSymlink == 0 { ret = append(ret, getHealth(p)...) - } else if !d.IsDir() && d.Mode()&os.ModeSymlink == 0 { - ret = append(ret, fmt.Sprintf("%s/%s: existing untreated file.", strings.TrimPrefix(pathname, TimestampCheck), d.Name())) + } else if !d.IsDir() && d.Mode()&os.ModeSymlink == 0 && time.Since(d.ModTime()) > 2 * time.Second { + teamDir := strings.TrimPrefix(pathname, TimestampCheck) + idteam, _ := pki.GetAssociation(path.Join(TeamsDir, teamDir)) + ret = append(ret, healthFileReport{ + IdTeam: idteam, + Path: path.Join(teamDir, d.Name()), + Error: "existing untreated file", + }) } } return diff --git a/admin/pki/team.go b/admin/pki/team.go index 08b9eef8..8168be64 100644 --- a/admin/pki/team.go +++ b/admin/pki/team.go @@ -16,6 +16,10 @@ func GetCertificateAssociation(serial uint64) string { return fmt.Sprintf(SymlinkPrefix + "%0[2]*[1]X", serial, int(math.Ceil(math.Log2(float64(serial))/8)*2)) } +func GetAssociation(dirname string) (assocs string, err error) { + return os.Readlink(dirname) +} + func GetAssociations(dirname string) (assocs []string, err error) { if ds, errr := ioutil.ReadDir(dirname); errr != nil { return nil, errr diff --git a/admin/static/js/app.js b/admin/static/js/app.js index 6e819d82..128e03dd 100644 --- a/admin/static/js/app.js +++ b/admin/static/js/app.js @@ -136,6 +136,9 @@ angular.module("FICApp") .factory("Timestamp", function($resource) { return $resource("/api/timestamps.json") }) + .factory("Health", function($resource) { + return $resource("/api/health.json") + }) .factory("Monitor", function($resource) { return $resource("/api/monitor/:machineId", { machineId: '@id' }) }) @@ -416,6 +419,15 @@ angular.module("FICApp") $scope.$on('$destroy', function () { $interval.cancel(myinterval); }); }) + .controller("HealthController", function($scope, $interval, Health) { + var refresh = function() { + $scope.health = Health.query(); + } + refresh(); + var myinterval = $interval(refresh, 2500); + $scope.$on('$destroy', function () { $interval.cancel(myinterval); }); + }) + .controller("MonitorController", function($scope, Monitor) { $scope.monitor = Monitor.get(); }) diff --git a/admin/static/views/home.html b/admin/static/views/home.html index c5d49dd7..3544a9c8 100644 --- a/admin/static/views/home.html +++ b/admin/static/views/home.html @@ -1,14 +1,24 @@

Interface d'administration du challenge

-

- Sélectionnez une action dans le menu ci-dessus. -

-
-

- Version de l'API : {{ v.version }} -

-

- Latence frontend-backend :
- Dernière synchronisation du frontend : {{ t.frontend | date:"mediumTime" }} -

+
+
+

+ Version de l'API : {{ v.version }} +

+

+ Latence frontend-backend :
+ Dernière synchronisation du frontend : {{ t.frontend | date:"mediumTime" }} +

+
+ +
+ +
+