func (h *HTTP) mirrorStatsHandler(w http.ResponseWriter, r *http.Request, ctx *Context) { rconn := h.redis.Get() defer rconn.Close() // Get all mirrors ID mirrorsIDs, err := redis.Strings(rconn.Do("LRANGE", "MIRRORS", "0", "-1")) if err != nil { http.Error(w, "Cannot fetch the list of mirrors", http.StatusInternalServerError) return } // <dlstats> rconn.Send("MULTI") // Get all mirrors stats for _, id := range mirrorsIDs { today := time.Now().Format("2006_01_02") rconn.Send("HGET", "STATS_MIRROR_"+today, id) rconn.Send("HGET", "STATS_MIRROR_BYTES_"+today, id) } stats, err := redis.Values(rconn.Do("EXEC")) if err != nil { http.Error(w, "Cannot fetch stats", http.StatusInternalServerError) return } var results []MirrorStats var index int64 for _, id := range mirrorsIDs { var downloads int64 if v, _ := redis.String(stats[index], nil); v != "" { downloads, _ = strconv.ParseInt(v, 10, 64) } var bytes int64 if v, _ := redis.String(stats[index+1], nil); v != "" { bytes, _ = strconv.ParseInt(v, 10, 64) } s := MirrorStats{ ID: id, Downloads: downloads, Bytes: bytes, } results = append(results, s) index += 2 } sort.Sort(ByDownloadNumbers{results}) // </dlstats> // <map> var mlist []mirrors.Mirror mlist = make([]mirrors.Mirror, 0, len(mirrorsIDs)) for _, mirrorID := range mirrorsIDs { var mirror mirrors.Mirror reply, err := redis.Values(rconn.Do("HGETALL", fmt.Sprintf("MIRROR_%s", mirrorID))) if err != nil { continue } if len(reply) == 0 { err = redis.ErrNil continue } err = redis.ScanStruct(reply, &mirror) if err != nil { continue } mirror.CountryFields = strings.Fields(mirror.CountryCodes) mlist = append(mlist, mirror) } // </map> w.Header().Set("Content-Type", "text/html; charset=utf-8") err = ctx.Templates().mirrorstats.ExecuteTemplate(ctx.ResponseWriter(), "base", MirrorStatsPage{results, mlist}) if err != nil { log.Errorf("HTTP error: %s", err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } }