Add raw export reanalyze flow for Redfish snapshots
This commit is contained in:
104
internal/server/raw_export.go
Normal file
104
internal/server/raw_export.go
Normal file
@@ -0,0 +1,104 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"git.mchus.pro/mchus/logpile/internal/models"
|
||||
)
|
||||
|
||||
const rawExportFormatV1 = "logpile.raw-export.v1"
|
||||
|
||||
type RawExportPackage struct {
|
||||
Format string `json:"format"`
|
||||
ExportedAt time.Time `json:"exported_at"`
|
||||
Source RawExportSource `json:"source"`
|
||||
Analysis *models.AnalysisResult `json:"analysis_result,omitempty"`
|
||||
}
|
||||
|
||||
type RawExportSource struct {
|
||||
Kind string `json:"kind"` // file_bytes | live_redfish | snapshot_json
|
||||
Filename string `json:"filename,omitempty"`
|
||||
MIMEType string `json:"mime_type,omitempty"`
|
||||
Encoding string `json:"encoding,omitempty"` // base64
|
||||
Data string `json:"data,omitempty"`
|
||||
Protocol string `json:"protocol,omitempty"`
|
||||
TargetHost string `json:"target_host,omitempty"`
|
||||
RawPayloads map[string]any `json:"raw_payloads,omitempty"`
|
||||
CollectLogs []string `json:"collect_logs,omitempty"`
|
||||
CollectMeta *CollectRequestMeta `json:"collect_meta,omitempty"`
|
||||
}
|
||||
|
||||
func newRawExportFromUploadedFile(filename, mimeType string, payload []byte, result *models.AnalysisResult) *RawExportPackage {
|
||||
return &RawExportPackage{
|
||||
Format: rawExportFormatV1,
|
||||
ExportedAt: time.Now().UTC(),
|
||||
Source: RawExportSource{
|
||||
Kind: "file_bytes",
|
||||
Filename: filename,
|
||||
MIMEType: mimeType,
|
||||
Encoding: "base64",
|
||||
Data: base64.StdEncoding.EncodeToString(payload),
|
||||
Protocol: resultProtocol(result),
|
||||
TargetHost: resultTargetHost(result),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func newRawExportFromLiveCollect(result *models.AnalysisResult, req CollectRequest, logs []string) *RawExportPackage {
|
||||
rawPayloads := map[string]any{}
|
||||
if result != nil && result.RawPayloads != nil {
|
||||
for k, v := range result.RawPayloads {
|
||||
rawPayloads[k] = v
|
||||
}
|
||||
}
|
||||
meta := CollectRequestMeta{
|
||||
Host: req.Host,
|
||||
Protocol: req.Protocol,
|
||||
Port: req.Port,
|
||||
Username: req.Username,
|
||||
AuthType: req.AuthType,
|
||||
TLSMode: req.TLSMode,
|
||||
}
|
||||
return &RawExportPackage{
|
||||
Format: rawExportFormatV1,
|
||||
ExportedAt: time.Now().UTC(),
|
||||
Source: RawExportSource{
|
||||
Kind: "live_redfish",
|
||||
Protocol: req.Protocol,
|
||||
TargetHost: req.Host,
|
||||
RawPayloads: rawPayloads,
|
||||
CollectLogs: append([]string(nil), logs...),
|
||||
CollectMeta: &meta,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func parseRawExportPackage(payload []byte) (*RawExportPackage, bool, error) {
|
||||
var pkg RawExportPackage
|
||||
if err := json.Unmarshal(payload, &pkg); err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
if pkg.Format != rawExportFormatV1 {
|
||||
return nil, false, nil
|
||||
}
|
||||
if pkg.ExportedAt.IsZero() {
|
||||
pkg.ExportedAt = time.Now().UTC()
|
||||
}
|
||||
return &pkg, true, nil
|
||||
}
|
||||
|
||||
func resultProtocol(result *models.AnalysisResult) string {
|
||||
if result == nil {
|
||||
return ""
|
||||
}
|
||||
return result.Protocol
|
||||
}
|
||||
|
||||
func resultTargetHost(result *models.AnalysisResult) string {
|
||||
if result == nil {
|
||||
return ""
|
||||
}
|
||||
return result.TargetHost
|
||||
}
|
||||
Reference in New Issue
Block a user