diff --git a/commands/report.go b/commands/report.go index a4e744db..85f2005f 100644 --- a/commands/report.go +++ b/commands/report.go @@ -397,8 +397,7 @@ func (p *ReportCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{} } } - var history models.ScanHistory - history, err = loadOneScanHistory(dir) + rs, err := loadScanResults(dir) if err != nil { util.Log.Error(err) return subcommands.ExitFailure @@ -406,7 +405,7 @@ func (p *ReportCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{} util.Log.Infof("Loaded: %s", dir) var results []models.ScanResult - for _, r := range history.ScanResults { + for _, r := range rs { if p.refreshCve || needToRefreshCve(r) { util.Log.Debugf("need to refresh") if c.Conf.CveDBType == "sqlite3" && c.Conf.CveDBURL == "" { @@ -442,20 +441,19 @@ func (p *ReportCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{} } if p.diff { - currentHistory := models.ScanHistory{ScanResults: results} - previousHistory, err := loadPreviousScanHistory(currentHistory) + previous, err := loadPrevious(results) if err != nil { util.Log.Error(err) return subcommands.ExitFailure } - history, err = diff(currentHistory, previousHistory) + diff, err := diff(results, previous) if err != nil { util.Log.Error(err) return subcommands.ExitFailure } results = []models.ScanResult{} - for _, r := range history.ScanResults { + for _, r := range diff { filled, _ := r.FillCveDetail() results = append(results, *filled) } diff --git a/commands/tui.go b/commands/tui.go index 94347c6a..530b9c32 100644 --- a/commands/tui.go +++ b/commands/tui.go @@ -152,14 +152,14 @@ func (p *TuiCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) s return subcommands.ExitFailure } - history, err := loadOneScanHistory(jsonDir) + results, err := loadScanResults(jsonDir) if err != nil { log.Errorf("Failed to read from JSON: %s", err) return subcommands.ExitFailure } - var results []models.ScanResult - for _, r := range history.ScanResults { + var filledResults []models.ScanResult + for _, r := range results { if p.refreshCve || needToRefreshCve(r) { if c.Conf.CveDBType == "sqlite3" { if _, err := os.Stat(c.Conf.CveDBPath); os.IsNotExist(err) { @@ -179,11 +179,10 @@ func (p *TuiCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) s log.Errorf("Failed to write JSON: %s", err) return subcommands.ExitFailure } - results = append(results, *filled) + filledResults = append(filledResults, *filled) } else { - results = append(results, r) + filledResults = append(filledResults, r) } } - history.ScanResults = results - return report.RunTui(history) + return report.RunTui(filledResults) } diff --git a/commands/util.go b/commands/util.go index 8052ba38..1e0bee33 100644 --- a/commands/util.go +++ b/commands/util.go @@ -136,13 +136,11 @@ func loadOneServerScanResult(jsonFile string) (result models.ScanResult, err err return } -// loadOneScanHistory read JSON data -func loadOneScanHistory(jsonDir string) (scanHistory models.ScanHistory, err error) { - var results []models.ScanResult +// loadScanResults read JSON data +func loadScanResults(jsonDir string) (results models.ScanResults, err error) { var files []os.FileInfo if files, err = ioutil.ReadDir(jsonDir); err != nil { - err = fmt.Errorf("Failed to read %s: %s", jsonDir, err) - return + return nil, fmt.Errorf("Failed to read %s: %s", jsonDir, err) } for _, f := range files { if filepath.Ext(f.Name()) != ".json" || strings.HasSuffix(f.Name(), "_diff.json") { @@ -152,18 +150,13 @@ func loadOneScanHistory(jsonDir string) (scanHistory models.ScanHistory, err err var r models.ScanResult path := filepath.Join(jsonDir, f.Name()) if r, err = loadOneServerScanResult(path); err != nil { - return + return nil, err } results = append(results, r) } if len(results) == 0 { - err = fmt.Errorf("There is no json file under %s", jsonDir) - return - } - - scanHistory = models.ScanHistory{ - ScanResults: results, + return nil, fmt.Errorf("There is no json file under %s", jsonDir) } return } @@ -201,13 +194,13 @@ func fillCveInfoFromOvalDB(r *models.ScanResult) (*models.ScanResult, error) { return result, nil } -func loadPreviousScanHistory(current models.ScanHistory) (previous models.ScanHistory, err error) { +func loadPrevious(current models.ScanResults) (previous models.ScanResults, err error) { var dirs jsonDirs if dirs, err = lsValidJSONDirs(); err != nil { return } - for _, result := range current.ScanResults { + for _, result := range current { for _, dir := range dirs[1:] { var r models.ScanResult path := filepath.Join(dir, result.ServerName+".json") @@ -215,7 +208,8 @@ func loadPreviousScanHistory(current models.ScanHistory) (previous models.ScanHi continue } if r.Family == result.Family && r.Release == result.Release { - previous.ScanResults = append(previous.ScanResults, r) + previous = append(previous, r) + util.Log.Infof("Privious json found: %s", path) break } } @@ -223,11 +217,11 @@ func loadPreviousScanHistory(current models.ScanHistory) (previous models.ScanHi return previous, nil } -func diff(currentHistory, previousHistory models.ScanHistory) (diffHistory models.ScanHistory, err error) { - for _, currentResult := range currentHistory.ScanResults { +func diff(current, previous models.ScanResults) (diff models.ScanResults, err error) { + for _, currentResult := range current { found := false var previousResult models.ScanResult - for _, previousResult = range previousHistory.ScanResults { + for _, previousResult = range previous { if currentResult.ServerName == previousResult.ServerName { found = true break @@ -247,9 +241,9 @@ func diff(currentHistory, previousHistory models.ScanHistory) (diffHistory model currentResult.Packages = currentResult.Packages.UniqByName() } - diffHistory.ScanResults = append(diffHistory.ScanResults, currentResult) + diff = append(diff, currentResult) } - return diffHistory, err + return diff, err } func getNewCves(previousResult, currentResult models.ScanResult) (newVulninfos []models.VulnInfo) { diff --git a/models/models.go b/models/models.go index 448d5e3c..fe4211d2 100644 --- a/models/models.go +++ b/models/models.go @@ -28,11 +28,6 @@ import ( goval "github.com/kotakanbe/goval-dictionary/models" ) -// ScanHistory is the history of Scanning. -type ScanHistory struct { - ScanResults ScanResults -} - // ScanResults is slice of ScanResult. type ScanResults []ScanResult diff --git a/report/tui.go b/report/tui.go index ec74cf8a..1ee1de60 100644 --- a/report/tui.go +++ b/report/tui.go @@ -34,14 +34,14 @@ import ( cve "github.com/kotakanbe/go-cve-dictionary/models" ) -var scanHistory models.ScanHistory +var scanResults models.ScanResults var currentScanResult models.ScanResult var currentCveInfo int var currentDetailLimitY int // RunTui execute main logic -func RunTui(history models.ScanHistory) subcommands.ExitStatus { - scanHistory = history +func RunTui(results models.ScanResults) subcommands.ExitStatus { + scanResults = results g, err := gocui.NewGui(gocui.OutputNormal) if err != nil { @@ -216,7 +216,7 @@ func previousView(g *gocui.Gui, v *gocui.View) error { func movable(v *gocui.View, nextY int) (ok bool, yLimit int) { switch v.Name() { case "side": - yLimit = len(scanHistory.ScanResults) - 1 + yLimit = len(scanResults) - 1 if yLimit < nextY { return false, yLimit } @@ -439,7 +439,7 @@ func changeHost(g *gocui.Gui, v *gocui.View) error { } serverName := strings.TrimSpace(l) - for _, r := range scanHistory.ScanResults { + for _, r := range scanResults { if serverName == strings.TrimSpace(r.ServerInfoTui()) { currentScanResult = r break @@ -562,13 +562,13 @@ func setSideLayout(g *gocui.Gui) error { } v.Highlight = true - for _, result := range scanHistory.ScanResults { + for _, result := range scanResults { fmt.Fprintln(v, result.ServerInfoTui()) } - if len(scanHistory.ScanResults) == 0 { + if len(scanResults) == 0 { return fmt.Errorf("No scan results") } - currentScanResult = scanHistory.ScanResults[0] + currentScanResult = scanResults[0] if _, err := g.SetCurrentView("side"); err != nil { return err }