* refactor: cve_client.go * refactor: don't use global Config in private func * remove import alias for config * refactor: dbclient * refactor: resultDir * refactor: resultsDir * refactor * refactor: gost * refactor: db client * refactor: cveDB * refactor: cvedb * refactor: exploitDB * refactor: remove detector/dbclient.go * refactor: writer * refactor: syslog writer * refactor: ips * refactor: ensureResultDir * refactor: proxy * fix(db): call CloseDB * add integration test * feat(report): sort array in json * sort func for json diff * add build-int to makefile * add int-rds-redis to makefile * fix: test case, makefile * fix makefile * show cve count after diff * make diff * diff -c * sort exploits in json for diff * sort metasploit, exploit
		
			
				
	
	
		
			118 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package logging
 | 
						|
 | 
						|
import (
 | 
						|
	"flag"
 | 
						|
	"fmt"
 | 
						|
	"io/ioutil"
 | 
						|
	"os"
 | 
						|
	"path/filepath"
 | 
						|
	"runtime"
 | 
						|
 | 
						|
	"github.com/k0kubun/pp"
 | 
						|
	"github.com/rifflock/lfshook"
 | 
						|
	"github.com/sirupsen/logrus"
 | 
						|
 | 
						|
	formatter "github.com/kotakanbe/logrus-prefixed-formatter"
 | 
						|
)
 | 
						|
 | 
						|
//LogOpts has options for logging
 | 
						|
type LogOpts struct {
 | 
						|
	Debug    bool   `json:"debug,omitempty"`
 | 
						|
	DebugSQL bool   `json:"debugSQL,omitempty"`
 | 
						|
	LogDir   string `json:"logDir,omitempty"`
 | 
						|
	Quiet    bool   `json:"quiet,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// Log for localhost
 | 
						|
var Log Logger
 | 
						|
 | 
						|
// Logger has logrus entry
 | 
						|
type Logger struct {
 | 
						|
	logrus.Entry
 | 
						|
}
 | 
						|
 | 
						|
func init() {
 | 
						|
	log := logrus.New()
 | 
						|
	log.Out = ioutil.Discard
 | 
						|
	fields := logrus.Fields{"prefix": ""}
 | 
						|
	Log = Logger{Entry: *log.WithFields(fields)}
 | 
						|
}
 | 
						|
 | 
						|
// NewNormalLogger creates normal logger
 | 
						|
func NewNormalLogger() Logger {
 | 
						|
	return Logger{Entry: logrus.Entry{Logger: logrus.New()}}
 | 
						|
}
 | 
						|
 | 
						|
// NewCustomLogger creates logrus
 | 
						|
func NewCustomLogger(debug, quiet bool, logDir, logMsgAnsiColor, serverName string) Logger {
 | 
						|
	log := logrus.New()
 | 
						|
	log.Formatter = &formatter.TextFormatter{MsgAnsiColor: logMsgAnsiColor}
 | 
						|
	log.Level = logrus.InfoLevel
 | 
						|
	if debug {
 | 
						|
		log.Level = logrus.DebugLevel
 | 
						|
		pp.ColoringEnabled = false
 | 
						|
	}
 | 
						|
 | 
						|
	if flag.Lookup("test.v") != nil {
 | 
						|
		return Logger{Entry: *logrus.NewEntry(log)}
 | 
						|
	}
 | 
						|
 | 
						|
	// File output
 | 
						|
	dir := GetDefaultLogDir()
 | 
						|
	if logDir != "" {
 | 
						|
		dir = logDir
 | 
						|
	}
 | 
						|
 | 
						|
	// Only log to a file if quiet mode enabled
 | 
						|
	if quiet && flag.Lookup("test.v") == nil {
 | 
						|
		if _, err := os.Stat(dir); os.IsNotExist(err) {
 | 
						|
			if err := os.Mkdir(dir, 0700); err != nil {
 | 
						|
				log.Errorf("Failed to create log directory. path: %s, err: %+v", dir, err)
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		logFile := dir + "/vuls.log"
 | 
						|
		if file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644); err == nil {
 | 
						|
			log.Out = file
 | 
						|
		} else {
 | 
						|
			log.Out = os.Stderr
 | 
						|
			log.Errorf("Failed to create log file. path: %s, err: %+v", logFile, err)
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		log.Out = os.Stderr
 | 
						|
	}
 | 
						|
 | 
						|
	whereami := "localhost"
 | 
						|
	if 0 < len(serverName) {
 | 
						|
		whereami = serverName
 | 
						|
	}
 | 
						|
 | 
						|
	if _, err := os.Stat(dir); err == nil {
 | 
						|
		path := filepath.Join(dir, fmt.Sprintf("%s.log", whereami))
 | 
						|
		if _, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644); err == nil {
 | 
						|
			log.Hooks.Add(lfshook.NewHook(lfshook.PathMap{
 | 
						|
				logrus.DebugLevel: path,
 | 
						|
				logrus.InfoLevel:  path,
 | 
						|
				logrus.WarnLevel:  path,
 | 
						|
				logrus.ErrorLevel: path,
 | 
						|
				logrus.FatalLevel: path,
 | 
						|
				logrus.PanicLevel: path,
 | 
						|
			}, nil))
 | 
						|
		} else {
 | 
						|
			log.Errorf("Failed to create log file. path: %s, err: %+v", path, err)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	entry := log.WithFields(logrus.Fields{"prefix": whereami})
 | 
						|
	return Logger{Entry: *entry}
 | 
						|
}
 | 
						|
 | 
						|
// GetDefaultLogDir returns default log directory
 | 
						|
func GetDefaultLogDir() string {
 | 
						|
	defaultLogDir := "/var/log/vuls"
 | 
						|
	if runtime.GOOS == "windows" {
 | 
						|
		defaultLogDir = filepath.Join(os.Getenv("APPDATA"), "vuls")
 | 
						|
	}
 | 
						|
	return defaultLogDir
 | 
						|
}
 |