180 lines
4.5 KiB
Go
180 lines
4.5 KiB
Go
package collector
|
|
|
|
import (
|
|
"bee/audit/internal/schema"
|
|
"fmt"
|
|
)
|
|
|
|
func finalizeSnapshot(snap *schema.HardwareSnapshot, collectedAt string) {
|
|
snap.Memory = filterMemory(snap.Memory)
|
|
snap.Storage = filterStorage(snap.Storage)
|
|
snap.PowerSupplies = filterPSUs(snap.PowerSupplies)
|
|
|
|
setComponentStatusMetadata(snap, collectedAt)
|
|
deduplicateComponentSerials(snap)
|
|
}
|
|
|
|
func filterMemory(dimms []schema.HardwareMemory) []schema.HardwareMemory {
|
|
out := make([]schema.HardwareMemory, 0, len(dimms))
|
|
for _, dimm := range dimms {
|
|
if dimm.Present != nil && !*dimm.Present {
|
|
continue
|
|
}
|
|
if dimm.Status != nil && *dimm.Status == statusEmpty {
|
|
continue
|
|
}
|
|
if dimm.SerialNumber == nil || *dimm.SerialNumber == "" {
|
|
continue
|
|
}
|
|
out = append(out, dimm)
|
|
}
|
|
return out
|
|
}
|
|
|
|
func filterStorage(disks []schema.HardwareStorage) []schema.HardwareStorage {
|
|
out := make([]schema.HardwareStorage, 0, len(disks))
|
|
for _, disk := range disks {
|
|
if disk.SerialNumber == nil || *disk.SerialNumber == "" {
|
|
continue
|
|
}
|
|
out = append(out, disk)
|
|
}
|
|
return out
|
|
}
|
|
|
|
func filterPSUs(psus []schema.HardwarePowerSupply) []schema.HardwarePowerSupply {
|
|
out := make([]schema.HardwarePowerSupply, 0, len(psus))
|
|
for _, psu := range psus {
|
|
if psu.SerialNumber == nil || *psu.SerialNumber == "" {
|
|
continue
|
|
}
|
|
out = append(out, psu)
|
|
}
|
|
return out
|
|
}
|
|
|
|
func setComponentStatusMetadata(snap *schema.HardwareSnapshot, collectedAt string) {
|
|
for i := range snap.CPUs {
|
|
setStatusCheckedAt(&snap.CPUs[i].HardwareComponentStatus, collectedAt)
|
|
}
|
|
for i := range snap.Memory {
|
|
setStatusCheckedAt(&snap.Memory[i].HardwareComponentStatus, collectedAt)
|
|
}
|
|
for i := range snap.Storage {
|
|
setStatusCheckedAt(&snap.Storage[i].HardwareComponentStatus, collectedAt)
|
|
}
|
|
for i := range snap.PCIeDevices {
|
|
setStatusCheckedAt(&snap.PCIeDevices[i].HardwareComponentStatus, collectedAt)
|
|
}
|
|
for i := range snap.PowerSupplies {
|
|
setStatusCheckedAt(&snap.PowerSupplies[i].HardwareComponentStatus, collectedAt)
|
|
}
|
|
}
|
|
|
|
func setStatusCheckedAt(status *schema.HardwareComponentStatus, collectedAt string) {
|
|
if status == nil || status.Status == nil || *status.Status == "" {
|
|
return
|
|
}
|
|
if status.StatusCheckedAt == nil {
|
|
status.StatusCheckedAt = &collectedAt
|
|
}
|
|
}
|
|
|
|
func deduplicateComponentSerials(snap *schema.HardwareSnapshot) {
|
|
deduplicateCPUSerials(snap.CPUs)
|
|
deduplicateMemorySerials(snap.Memory)
|
|
deduplicateStorageSerials(snap.Storage)
|
|
deduplicatePCIeSerials(snap.PCIeDevices)
|
|
deduplicatePSUSerials(snap.PowerSupplies)
|
|
}
|
|
|
|
func deduplicateCPUSerials(items []schema.HardwareCPU) {
|
|
seen := map[string]int{}
|
|
seq := 1
|
|
for i := range items {
|
|
if items[i].SerialNumber == nil || *items[i].SerialNumber == "" {
|
|
continue
|
|
}
|
|
model := derefString(items[i].Model)
|
|
key := model + "\x00" + *items[i].SerialNumber
|
|
seen[key]++
|
|
if seen[key] > 1 {
|
|
repl := fmt.Sprintf("NO_SN-%08d", seq)
|
|
seq++
|
|
items[i].SerialNumber = &repl
|
|
}
|
|
}
|
|
}
|
|
|
|
func deduplicateMemorySerials(items []schema.HardwareMemory) {
|
|
seen := map[string]int{}
|
|
seq := 1
|
|
for i := range items {
|
|
if items[i].SerialNumber == nil || *items[i].SerialNumber == "" {
|
|
continue
|
|
}
|
|
model := derefString(items[i].PartNumber)
|
|
key := model + "\x00" + *items[i].SerialNumber
|
|
seen[key]++
|
|
if seen[key] > 1 {
|
|
repl := fmt.Sprintf("NO_SN-%08d", seq)
|
|
seq++
|
|
items[i].SerialNumber = &repl
|
|
}
|
|
}
|
|
}
|
|
|
|
func deduplicateStorageSerials(items []schema.HardwareStorage) {
|
|
seen := map[string]int{}
|
|
seq := 1
|
|
for i := range items {
|
|
if items[i].SerialNumber == nil || *items[i].SerialNumber == "" {
|
|
continue
|
|
}
|
|
model := derefString(items[i].Model)
|
|
key := model + "\x00" + *items[i].SerialNumber
|
|
seen[key]++
|
|
if seen[key] > 1 {
|
|
repl := fmt.Sprintf("NO_SN-%08d", seq)
|
|
seq++
|
|
items[i].SerialNumber = &repl
|
|
}
|
|
}
|
|
}
|
|
|
|
func deduplicatePCIeSerials(items []schema.HardwarePCIeDevice) {
|
|
seen := map[string]int{}
|
|
seq := 1
|
|
for i := range items {
|
|
if items[i].SerialNumber == nil || *items[i].SerialNumber == "" {
|
|
continue
|
|
}
|
|
model := derefString(items[i].Model)
|
|
key := model + "\x00" + *items[i].SerialNumber
|
|
seen[key]++
|
|
if seen[key] > 1 {
|
|
repl := fmt.Sprintf("NO_SN-%08d", seq)
|
|
seq++
|
|
items[i].SerialNumber = &repl
|
|
}
|
|
}
|
|
}
|
|
|
|
func deduplicatePSUSerials(items []schema.HardwarePowerSupply) {
|
|
seen := map[string]int{}
|
|
seq := 1
|
|
for i := range items {
|
|
if items[i].SerialNumber == nil || *items[i].SerialNumber == "" {
|
|
continue
|
|
}
|
|
model := derefString(items[i].Model)
|
|
key := model + "\x00" + *items[i].SerialNumber
|
|
seen[key]++
|
|
if seen[key] > 1 {
|
|
repl := fmt.Sprintf("NO_SN-%08d", seq)
|
|
seq++
|
|
items[i].SerialNumber = &repl
|
|
}
|
|
}
|
|
}
|