delete sqlite3
This commit is contained in:
		@@ -115,7 +115,7 @@ func (w AzureBlobWriter) upload(res models.ScanResult) (err error) {
 | 
			
		||||
	}
 | 
			
		||||
	timestr := time.Now().Format("20060102_1504")
 | 
			
		||||
	name := ""
 | 
			
		||||
	if res.Container.ContainerID == "" {
 | 
			
		||||
	if len(res.Container.ContainerID) == 0 {
 | 
			
		||||
		name = fmt.Sprintf("%s/%s.json", timestr, res.ServerName)
 | 
			
		||||
	} else {
 | 
			
		||||
		name = fmt.Sprintf("%s/%s_%s.json", timestr, res.ServerName, res.Container.Name)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										107
									
								
								report/json.go
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								report/json.go
									
									
									
									
									
								
							@@ -21,17 +21,44 @@ import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	c "github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// JSONDirs array of json files path.
 | 
			
		||||
type JSONDirs []string
 | 
			
		||||
 | 
			
		||||
func (d JSONDirs) Len() int {
 | 
			
		||||
	return len(d)
 | 
			
		||||
}
 | 
			
		||||
func (d JSONDirs) Swap(i, j int) {
 | 
			
		||||
	d[i], d[j] = d[j], d[i]
 | 
			
		||||
}
 | 
			
		||||
func (d JSONDirs) Less(i, j int) bool {
 | 
			
		||||
	return d[j] < d[i]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JSONWriter writes results to file.
 | 
			
		||||
type JSONWriter struct{}
 | 
			
		||||
type JSONWriter struct {
 | 
			
		||||
	ScannedAt time.Time
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w JSONWriter) Write(scanResults []models.ScanResult) (err error) {
 | 
			
		||||
	var path string
 | 
			
		||||
	if path, err = ensureResultDir(w.ScannedAt); err != nil {
 | 
			
		||||
		return fmt.Errorf("Failed to make direcotory/symlink : %s", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	path, err := ensureResultDir()
 | 
			
		||||
	for _, scanResult := range scanResults {
 | 
			
		||||
		scanResult.ScannedAt = w.ScannedAt
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var jsonBytes []byte
 | 
			
		||||
	if jsonBytes, err = json.Marshal(scanResults); err != nil {
 | 
			
		||||
@@ -44,7 +71,7 @@ func (w JSONWriter) Write(scanResults []models.ScanResult) (err error) {
 | 
			
		||||
 | 
			
		||||
	for _, r := range scanResults {
 | 
			
		||||
		jsonPath := ""
 | 
			
		||||
		if r.Container.ContainerID == "" {
 | 
			
		||||
		if len(r.Container.ContainerID) == 0 {
 | 
			
		||||
			jsonPath = filepath.Join(path, fmt.Sprintf("%s.json", r.ServerName))
 | 
			
		||||
		} else {
 | 
			
		||||
			jsonPath = filepath.Join(path,
 | 
			
		||||
@@ -60,3 +87,77 @@ func (w JSONWriter) Write(scanResults []models.ScanResult) (err error) {
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JSONDirPattern is file name pattern of JSON directory
 | 
			
		||||
var JSONDirPattern = regexp.MustCompile(`^\d{8}_\d{4}$`)
 | 
			
		||||
 | 
			
		||||
// GetValidJSONDirs return valid json directory as array
 | 
			
		||||
func GetValidJSONDirs() (jsonDirs JSONDirs, err error) {
 | 
			
		||||
	var dirInfo []os.FileInfo
 | 
			
		||||
	if dirInfo, err = ioutil.ReadDir(c.Conf.JSONBaseDir); err != nil {
 | 
			
		||||
		err = fmt.Errorf("Failed to read %s: %s", c.Conf.JSONBaseDir, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, d := range dirInfo {
 | 
			
		||||
		if d.IsDir() && JSONDirPattern.MatchString(d.Name()) {
 | 
			
		||||
			jsonDir := filepath.Join(c.Conf.JSONBaseDir, d.Name())
 | 
			
		||||
			jsonDirs = append(jsonDirs, jsonDir)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	sort.Sort(jsonDirs)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoadOneScanHistory read JSON data
 | 
			
		||||
func LoadOneScanHistory(jsonDir string) (scanHistory models.ScanHistory, err error) {
 | 
			
		||||
	var scanResults []models.ScanResult
 | 
			
		||||
	var files []os.FileInfo
 | 
			
		||||
	if files, err = ioutil.ReadDir(jsonDir); err != nil {
 | 
			
		||||
		err = fmt.Errorf("Failed to read %s: %s", jsonDir, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, file := range files {
 | 
			
		||||
		// TODO this "if block" will be deleted in a future release
 | 
			
		||||
		if file.Name() == "all.json" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if filepath.Ext(file.Name()) != ".json" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		var scanResult models.ScanResult
 | 
			
		||||
		var data []byte
 | 
			
		||||
		jsonPath := filepath.Join(jsonDir, file.Name())
 | 
			
		||||
		if data, err = ioutil.ReadFile(jsonPath); err != nil {
 | 
			
		||||
			err = fmt.Errorf("Failed to read %s: %s", jsonPath, err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if json.Unmarshal(data, &scanResult) != nil {
 | 
			
		||||
			err = fmt.Errorf("Failed to parse %s: %s", jsonPath, err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		scanResults = append(scanResults, scanResult)
 | 
			
		||||
	}
 | 
			
		||||
	if len(scanResults) == 0 {
 | 
			
		||||
		err = fmt.Errorf("There is no json file under %s", jsonDir)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var scannedAt time.Time
 | 
			
		||||
	if scanResults[0].ScannedAt.IsZero() {
 | 
			
		||||
		splitPath := strings.Split(jsonDir, string(os.PathSeparator))
 | 
			
		||||
		timeStr := splitPath[len(splitPath)-1]
 | 
			
		||||
		timeformat := "20060102_1504"
 | 
			
		||||
		if scannedAt, err = time.Parse(timeformat, timeStr); err != nil {
 | 
			
		||||
			err = fmt.Errorf("Failed to parse %s: %s", timeStr, err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		scannedAt = scanResults[0].ScannedAt
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	scanHistory = models.ScanHistory{
 | 
			
		||||
		ScanResults: scanResults,
 | 
			
		||||
		ScannedAt:   scannedAt,
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -90,7 +90,7 @@ func (w S3Writer) Write(scanResults []models.ScanResult) (err error) {
 | 
			
		||||
 | 
			
		||||
	for _, r := range scanResults {
 | 
			
		||||
		key := ""
 | 
			
		||||
		if r.Container.ContainerID == "" {
 | 
			
		||||
		if len(r.Container.ContainerID) == 0 {
 | 
			
		||||
			key = fmt.Sprintf("%s/%s.json", timestr, r.ServerName)
 | 
			
		||||
		} else {
 | 
			
		||||
			key = fmt.Sprintf("%s/%s_%s.json", timestr, r.ServerName, r.Container.Name)
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,7 @@ func (w SlackWriter) Write(scanResults []models.ScanResult) error {
 | 
			
		||||
				Send(string(jsonBody)).End()
 | 
			
		||||
			if resp.StatusCode != 200 {
 | 
			
		||||
				log.Errorf("Resonse body: %s", body)
 | 
			
		||||
				if len(errs) > 0 {
 | 
			
		||||
				if 0 < len(errs) {
 | 
			
		||||
					return errs[0]
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -22,21 +22,22 @@ import (
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TextFileWriter writes results to file.
 | 
			
		||||
type TextFileWriter struct{}
 | 
			
		||||
type TextFileWriter struct {
 | 
			
		||||
	ScannedAt time.Time
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w TextFileWriter) Write(scanResults []models.ScanResult) (err error) {
 | 
			
		||||
 | 
			
		||||
	path, err := ensureResultDir()
 | 
			
		||||
 | 
			
		||||
	path, err := ensureResultDir(w.ScannedAt)
 | 
			
		||||
	all := []string{}
 | 
			
		||||
	for _, r := range scanResults {
 | 
			
		||||
		textFilePath := ""
 | 
			
		||||
		if r.Container.ContainerID == "" {
 | 
			
		||||
		if len(r.Container.ContainerID) == 0 {
 | 
			
		||||
			textFilePath = filepath.Join(path, fmt.Sprintf("%s.txt", r.ServerName))
 | 
			
		||||
		} else {
 | 
			
		||||
			textFilePath = filepath.Join(path,
 | 
			
		||||
 
 | 
			
		||||
@@ -20,13 +20,13 @@ package report
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"text/template"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	log "github.com/Sirupsen/logrus"
 | 
			
		||||
	"github.com/future-architect/vuls/config"
 | 
			
		||||
	"github.com/future-architect/vuls/db"
 | 
			
		||||
	"github.com/future-architect/vuls/models"
 | 
			
		||||
	"github.com/google/subcommands"
 | 
			
		||||
	"github.com/gosuri/uitable"
 | 
			
		||||
@@ -40,9 +40,9 @@ var currentCveInfo int
 | 
			
		||||
var currentDetailLimitY int
 | 
			
		||||
 | 
			
		||||
// RunTui execute main logic
 | 
			
		||||
func RunTui(historyID string) subcommands.ExitStatus {
 | 
			
		||||
func RunTui(jsonDirName string) subcommands.ExitStatus {
 | 
			
		||||
	var err error
 | 
			
		||||
	scanHistory, err = selectScanHistory(historyID)
 | 
			
		||||
	scanHistory, err = selectScanHistory(jsonDirName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatal(err)
 | 
			
		||||
		return subcommands.ExitFailure
 | 
			
		||||
@@ -70,12 +70,20 @@ func RunTui(historyID string) subcommands.ExitStatus {
 | 
			
		||||
	return subcommands.ExitSuccess
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func selectScanHistory(historyID string) (latest models.ScanHistory, err error) {
 | 
			
		||||
	if err := db.OpenDB(); err != nil {
 | 
			
		||||
		return latest, fmt.Errorf(
 | 
			
		||||
			"Failed to open DB. datafile: %s, err: %s", config.Conf.DBPath, err)
 | 
			
		||||
func selectScanHistory(jsonDirName string) (latest models.ScanHistory, err error) {
 | 
			
		||||
	var jsonDir string
 | 
			
		||||
	if 0 < len(jsonDirName) {
 | 
			
		||||
		jsonDir = filepath.Join(config.Conf.JSONBaseDir, jsonDirName)
 | 
			
		||||
	} else {
 | 
			
		||||
		var jsonDirs JSONDirs
 | 
			
		||||
		if jsonDirs, err = GetValidJSONDirs(); err != nil {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		jsonDir = jsonDirs[0]
 | 
			
		||||
	}
 | 
			
		||||
	if latest, err = LoadOneScanHistory(jsonDir); err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	latest, err = db.SelectScanHistory(historyID)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -332,7 +340,7 @@ func cursorUp(g *gocui.Gui, v *gocui.View) error {
 | 
			
		||||
	if v != nil {
 | 
			
		||||
		ox, oy := v.Origin()
 | 
			
		||||
		cx, cy := v.Cursor()
 | 
			
		||||
		if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 {
 | 
			
		||||
		if err := v.SetCursor(cx, cy-1); err != nil && 0 < oy {
 | 
			
		||||
			if err := v.SetOrigin(ox, oy-1); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,13 +30,13 @@ import (
 | 
			
		||||
	"github.com/gosuri/uitable"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func ensureResultDir() (path string, err error) {
 | 
			
		||||
func ensureResultDir(scannedAt time.Time) (path string, err error) {
 | 
			
		||||
	if resultDirPath != "" {
 | 
			
		||||
		return resultDirPath, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const timeLayout = "20060102_1504"
 | 
			
		||||
	timedir := time.Now().Format(timeLayout)
 | 
			
		||||
	timedir := scannedAt.Format(timeLayout)
 | 
			
		||||
	wd, _ := os.Getwd()
 | 
			
		||||
	dir := filepath.Join(wd, "results", timedir)
 | 
			
		||||
	if err := os.MkdirAll(dir, 0755); err != nil {
 | 
			
		||||
@@ -44,7 +44,7 @@ func ensureResultDir() (path string, err error) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	symlinkPath := filepath.Join(wd, "results", "current")
 | 
			
		||||
	if _, err := os.Stat(symlinkPath); err == nil {
 | 
			
		||||
	if _, err := os.Lstat(symlinkPath); err == nil {
 | 
			
		||||
		if err := os.Remove(symlinkPath); err != nil {
 | 
			
		||||
			return "", fmt.Errorf(
 | 
			
		||||
				"Failed to remove symlink. path: %s, err: %s", symlinkPath, err)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user