package feta import "time" import "net/http" import "encoding/json" import "github.com/gin-gonic/gin" type hash map[string]interface{} func (a *TootArchiverAPIServer) instances() []hash { resp := make([]hash, 0) now := time.Now() for _, v := range a.archiver.manager.listInstances() { i := make(hash) // FIXME figure out why a very short lock here deadlocks v.Lock() i["hostname"] = v.hostname i["nextCheck"] = v.nextFetch.UTC().Format(time.RFC3339) i["nextCheckAfter"] = (-1 * now.Sub(v.nextFetch)).String() i["successCount"] = v.successCount i["errorCount"] = v.errorCount i["identified"] = v.identified i["status"] = v.status i["software"] = "unknown" i["version"] = "unknown" if v.identified { i["software"] = v.serverImplementationString i["version"] = v.serverVersionString } v.Unlock() resp = append(resp, i) } return resp } func (a *TootArchiverAPIServer) getIndexHandler() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { index := &gin.H{ "page": "index", "instances": a.instances(), "status": "ok", "now": time.Now().UTC().Format(time.RFC3339), "uptime": a.archiver.Uptime().String(), } json, err := json.Marshal(index) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.Write(json) } } func (a *TootArchiverAPIServer) getHealthCheckHandler() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { resp := &gin.H{ "status": "ok", "now": time.Now().UTC().Format(time.RFC3339), "uptime": a.archiver.Uptime().String(), } json, err := json.Marshal(resp) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.Write(json) } }