115 lines
2.1 KiB
Go
115 lines
2.1 KiB
Go
package exporter
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"encoding/json"
|
|
"io"
|
|
|
|
"git.mchus.pro/mchus/logpile/internal/models"
|
|
)
|
|
|
|
// Exporter handles data export in various formats
|
|
type Exporter struct {
|
|
result *models.AnalysisResult
|
|
}
|
|
|
|
// New creates a new exporter
|
|
func New(result *models.AnalysisResult) *Exporter {
|
|
return &Exporter{result: result}
|
|
}
|
|
|
|
// ExportCSV exports serial numbers to CSV format
|
|
func (e *Exporter) ExportCSV(w io.Writer) error {
|
|
writer := csv.NewWriter(w)
|
|
defer writer.Flush()
|
|
|
|
// Header
|
|
if err := writer.Write([]string{"Component", "Serial Number", "Manufacturer", "Location"}); err != nil {
|
|
return err
|
|
}
|
|
|
|
if e.result == nil {
|
|
return nil
|
|
}
|
|
|
|
// FRU data
|
|
for _, fru := range e.result.FRU {
|
|
if fru.SerialNumber == "" {
|
|
continue
|
|
}
|
|
name := fru.ProductName
|
|
if name == "" {
|
|
name = fru.Description
|
|
}
|
|
if err := writer.Write([]string{
|
|
name,
|
|
fru.SerialNumber,
|
|
fru.Manufacturer,
|
|
fru.PartNumber,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Hardware data
|
|
if e.result.Hardware != nil {
|
|
// Memory
|
|
for _, mem := range e.result.Hardware.Memory {
|
|
if mem.SerialNumber == "" {
|
|
continue
|
|
}
|
|
location := mem.Location
|
|
if location == "" {
|
|
location = mem.Slot
|
|
}
|
|
if err := writer.Write([]string{
|
|
mem.PartNumber,
|
|
mem.SerialNumber,
|
|
mem.Manufacturer,
|
|
location,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Storage
|
|
for _, stor := range e.result.Hardware.Storage {
|
|
if stor.SerialNumber == "" {
|
|
continue
|
|
}
|
|
if err := writer.Write([]string{
|
|
stor.Model,
|
|
stor.SerialNumber,
|
|
stor.Manufacturer,
|
|
stor.Slot,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// PCIe devices
|
|
for _, pcie := range e.result.Hardware.PCIeDevices {
|
|
if pcie.SerialNumber == "" {
|
|
continue
|
|
}
|
|
if err := writer.Write([]string{
|
|
pcie.DeviceClass,
|
|
pcie.SerialNumber,
|
|
pcie.Manufacturer,
|
|
pcie.Slot,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ExportJSON exports all data to JSON format
|
|
func (e *Exporter) ExportJSON(w io.Writer) error {
|
|
encoder := json.NewEncoder(w)
|
|
encoder.SetIndent("", " ")
|
|
return encoder.Encode(e.result)
|
|
}
|