Output changelog in report, TUI and JSON for Ubuntu/Debian/CentOS
This commit is contained in:
101
report/tui.go
101
report/tui.go
@@ -133,6 +133,27 @@ func keybindings(g *gocui.Gui) (err error) {
|
||||
errs = append(errs, g.SetKeybinding("detail", gocui.KeyCtrlP, gocui.ModNone, previousSummary))
|
||||
errs = append(errs, g.SetKeybinding("detail", gocui.KeyEnter, gocui.ModNone, nextView))
|
||||
|
||||
// changelog
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyTab, gocui.ModNone, nextView))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlQ, gocui.ModNone, previousView))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlH, gocui.ModNone, nextView))
|
||||
// errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlL, gocui.ModNone, nextView))
|
||||
// errs = append(errs, g.SetKeybinding("changelog", gocui.KeyArrowUp, gocui.ModAlt, previousView))
|
||||
// errs = append(errs, g.SetKeybinding("changelog", gocui.KeyArrowLeft, gocui.ModAlt, nextView))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyArrowDown, gocui.ModNone, cursorDown))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyArrowUp, gocui.ModNone, cursorUp))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlJ, gocui.ModNone, cursorDown))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlK, gocui.ModNone, cursorUp))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlD, gocui.ModNone, cursorPageDown))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlU, gocui.ModNone, cursorPageUp))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeySpace, gocui.ModNone, cursorPageDown))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyBackspace, gocui.ModNone, cursorPageUp))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyBackspace2, gocui.ModNone, cursorPageUp))
|
||||
// errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlM, gocui.ModNone, cursorMoveMiddle))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlN, gocui.ModNone, nextSummary))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyCtrlP, gocui.ModNone, previousSummary))
|
||||
errs = append(errs, g.SetKeybinding("changelog", gocui.KeyEnter, gocui.ModNone, nextView))
|
||||
|
||||
// errs = append(errs, g.SetKeybinding("msg", gocui.KeyEnter, gocui.ModNone, delMsg))
|
||||
// errs = append(errs, g.SetKeybinding("detail", gocui.KeyEnter, gocui.ModNone, showMsg))
|
||||
|
||||
@@ -162,6 +183,8 @@ func nextView(g *gocui.Gui, v *gocui.View) error {
|
||||
case "summary":
|
||||
_, err = g.SetCurrentView("detail")
|
||||
case "detail":
|
||||
_, err = g.SetCurrentView("changelog")
|
||||
case "changelog":
|
||||
_, err = g.SetCurrentView("side")
|
||||
default:
|
||||
_, err = g.SetCurrentView("summary")
|
||||
@@ -182,6 +205,8 @@ func previousView(g *gocui.Gui, v *gocui.View) error {
|
||||
_, err = g.SetCurrentView("side")
|
||||
case "detail":
|
||||
_, err = g.SetCurrentView("summary")
|
||||
case "changelog":
|
||||
_, err = g.SetCurrentView("detail")
|
||||
default:
|
||||
_, err = g.SetCurrentView("side")
|
||||
}
|
||||
@@ -207,6 +232,11 @@ func movable(v *gocui.View, nextY int) (ok bool, yLimit int) {
|
||||
return false, currentDetailLimitY
|
||||
}
|
||||
return true, currentDetailLimitY
|
||||
case "changelog":
|
||||
if currentDetailLimitY < nextY {
|
||||
return false, currentDetailLimitY
|
||||
}
|
||||
return true, currentDetailLimitY
|
||||
default:
|
||||
return true, 0
|
||||
}
|
||||
@@ -217,7 +247,7 @@ func pageUpDownJumpCount(v *gocui.View) int {
|
||||
switch v.Name() {
|
||||
case "side", "summary":
|
||||
jump = 8
|
||||
case "detail":
|
||||
case "detail", "changelog":
|
||||
jump = 30
|
||||
default:
|
||||
jump = 8
|
||||
@@ -232,6 +262,9 @@ func onMovingCursorRedrawView(g *gocui.Gui, v *gocui.View) error {
|
||||
if err := redrawDetail(g); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := redrawChangelog(g); err != nil {
|
||||
return err
|
||||
}
|
||||
case "side":
|
||||
if err := changeHost(g, v); err != nil {
|
||||
return err
|
||||
@@ -395,6 +428,9 @@ func changeHost(g *gocui.Gui, v *gocui.View) error {
|
||||
if err := g.DeleteView("detail"); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := g.DeleteView("changelog"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, cy := v.Cursor()
|
||||
l, err := v.Line(cy)
|
||||
@@ -416,6 +452,9 @@ func changeHost(g *gocui.Gui, v *gocui.View) error {
|
||||
if err := setDetailLayout(g); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := setChangelogLayout(g); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -430,6 +469,17 @@ func redrawDetail(g *gocui.Gui) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func redrawChangelog(g *gocui.Gui) error {
|
||||
if err := g.DeleteView("changelog"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := setChangelogLayout(g); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func getLine(g *gocui.Gui, v *gocui.View) error {
|
||||
var l string
|
||||
var err error
|
||||
@@ -498,12 +548,15 @@ func layout(g *gocui.Gui) error {
|
||||
if err := setDetailLayout(g); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := setChangelogLayout(g); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func setSideLayout(g *gocui.Gui) error {
|
||||
_, maxY := g.Size()
|
||||
if v, err := g.SetView("side", -1, -1, 40, maxY); err != nil {
|
||||
if v, err := g.SetView("side", -1, -1, 40, int(float64(maxY)*0.2)); err != nil {
|
||||
if err != gocui.ErrUnknownView {
|
||||
return err
|
||||
}
|
||||
@@ -614,14 +667,10 @@ func setDetailLayout(g *gocui.Gui) error {
|
||||
_, oy := summaryView.Origin()
|
||||
currentCveInfo = cy + oy
|
||||
|
||||
if v, err := g.SetView("detail", 40, int(float64(maxY)*0.2), maxX, maxY); err != nil {
|
||||
if v, err := g.SetView("detail", -1, int(float64(maxY)*0.2), int(float64(maxX)*0.5), maxY); err != nil {
|
||||
if err != gocui.ErrUnknownView {
|
||||
return err
|
||||
}
|
||||
// text := report.ToPlainTextDetailsLangEn(
|
||||
// currentScanResult.KnownCves[currentCveInfo],
|
||||
// currentScanResult.Family)
|
||||
|
||||
text, err := detailLines()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -635,6 +684,44 @@ func setDetailLayout(g *gocui.Gui) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func setChangelogLayout(g *gocui.Gui) error {
|
||||
maxX, maxY := g.Size()
|
||||
|
||||
summaryView, err := g.View("summary")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, cy := summaryView.Cursor()
|
||||
_, oy := summaryView.Origin()
|
||||
currentCveInfo = cy + oy
|
||||
|
||||
if v, err := g.SetView("changelog", int(float64(maxX)*0.5), int(float64(maxY)*0.2), maxX, maxY); err != nil {
|
||||
if err != gocui.ErrUnknownView {
|
||||
return err
|
||||
}
|
||||
if len(currentScanResult.Errors) != 0 || len(currentScanResult.AllCves()) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
lines := []string{}
|
||||
cveInfo := currentScanResult.AllCves()[currentCveInfo]
|
||||
for _, pack := range cveInfo.Packages {
|
||||
for _, p := range currentScanResult.Packages {
|
||||
if pack.Name == p.Name {
|
||||
lines = append(lines, formatOneChangelog(p), "\n")
|
||||
}
|
||||
}
|
||||
}
|
||||
text := strings.Join(lines, "\n")
|
||||
fmt.Fprint(v, text)
|
||||
v.Editable = false
|
||||
v.Wrap = true
|
||||
|
||||
currentDetailLimitY = len(strings.Split(text, "\n")) - 1
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type dataForTmpl struct {
|
||||
CveID string
|
||||
CvssScore string
|
||||
|
||||
Reference in New Issue
Block a user