v1.2.0: Enhanced Inspur/Kaytus parser with GPU, PCIe, and storage support
Major improvements: - Add CSV SEL event parser for Kaytus firmware format - Add PCIe device parser with link speed/width detection - Add GPU temperature and PCIe link monitoring - Add disk backplane parser for storage bay information - Fix memory module detection (only show installed DIMMs) Parser enhancements: - Parse RESTful PCIe Device info (max/current link width/speed) - Parse GPU sensor data (core and memory temperatures) - Parse diskbackplane info (slot count, installed drives) - Parse SEL events from CSV format (selelist.csv) - Fix memory Present status logic (check mem_mod_status) Web interface improvements: - Add PCIe link degradation highlighting (red when current < max) - Add storage table with Present status and location - Update memory specification to show only installed modules with frequency - Sort events from newest to oldest - Filter out N/A serial numbers from display Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"html/template"
|
||||
"net/http"
|
||||
"os"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -86,7 +87,17 @@ func (s *Server) handleGetEvents(w http.ResponseWriter, r *http.Request) {
|
||||
jsonResponse(w, []interface{}{})
|
||||
return
|
||||
}
|
||||
jsonResponse(w, result.Events)
|
||||
|
||||
// Sort events by timestamp (newest first)
|
||||
events := make([]models.Event, len(result.Events))
|
||||
copy(events, result.Events)
|
||||
|
||||
// Sort in descending order using sort.Slice (newest first)
|
||||
sort.Slice(events, func(i, j int) bool {
|
||||
return events[i].Timestamp.After(events[j].Timestamp)
|
||||
})
|
||||
|
||||
jsonResponse(w, events)
|
||||
}
|
||||
|
||||
func (s *Server) handleGetSensors(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -145,10 +156,20 @@ func buildSpecification(result *models.AnalysisResult) []SpecLine {
|
||||
spec = append(spec, SpecLine{Category: "Процессор", Name: name, Quantity: count})
|
||||
}
|
||||
|
||||
// Memory - group by size and type
|
||||
// Memory - group by size, type and frequency (only installed modules)
|
||||
memGroups := make(map[string]int)
|
||||
for _, mem := range hw.Memory {
|
||||
key := fmt.Sprintf("%s %dGB", mem.Type, mem.SizeMB/1024)
|
||||
// Skip empty slots (not present or 0 size)
|
||||
if !mem.Present || mem.SizeMB == 0 {
|
||||
continue
|
||||
}
|
||||
// Include frequency if available
|
||||
key := ""
|
||||
if mem.CurrentSpeedMHz > 0 {
|
||||
key = fmt.Sprintf("%s %dGB %dMHz", mem.Type, mem.SizeMB/1024, mem.CurrentSpeedMHz)
|
||||
} else {
|
||||
key = fmt.Sprintf("%s %dGB", mem.Type, mem.SizeMB/1024)
|
||||
}
|
||||
memGroups[key]++
|
||||
}
|
||||
for key, count := range memGroups {
|
||||
|
||||
Reference in New Issue
Block a user