* refactor config * fix saas config * feat(config): scanmodule for each server in config.toml * feat(config): enable to specify containersOnly in config.toml * add new keys of config.toml to discover.go * fix summary output, logging
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package config
 | 
						|
 | 
						|
import (
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"golang.org/x/xerrors"
 | 
						|
)
 | 
						|
 | 
						|
// ScanMode has a type of scan mode. fast, fast-root, deep and offline
 | 
						|
type ScanMode struct {
 | 
						|
	flag byte
 | 
						|
}
 | 
						|
 | 
						|
const (
 | 
						|
	// Fast is fast scan mode
 | 
						|
	Fast = byte(1 << iota)
 | 
						|
	// FastRoot is scanmode
 | 
						|
	FastRoot
 | 
						|
	// Deep is scanmode
 | 
						|
	Deep
 | 
						|
	// Offline is scanmode
 | 
						|
	Offline
 | 
						|
 | 
						|
	fastStr     = "fast"
 | 
						|
	fastRootStr = "fast-root"
 | 
						|
	deepStr     = "deep"
 | 
						|
	offlineStr  = "offline"
 | 
						|
)
 | 
						|
 | 
						|
// Set mode
 | 
						|
func (s *ScanMode) Set(f byte) {
 | 
						|
	s.flag |= f
 | 
						|
}
 | 
						|
 | 
						|
// IsFast return whether scan mode is fast
 | 
						|
func (s ScanMode) IsFast() bool {
 | 
						|
	return s.flag&Fast == Fast
 | 
						|
}
 | 
						|
 | 
						|
// IsFastRoot return whether scan mode is fastroot
 | 
						|
func (s ScanMode) IsFastRoot() bool {
 | 
						|
	return s.flag&FastRoot == FastRoot
 | 
						|
}
 | 
						|
 | 
						|
// IsDeep return whether scan mode is deep
 | 
						|
func (s ScanMode) IsDeep() bool {
 | 
						|
	return s.flag&Deep == Deep
 | 
						|
}
 | 
						|
 | 
						|
// IsOffline return whether scan mode is offline
 | 
						|
func (s ScanMode) IsOffline() bool {
 | 
						|
	return s.flag&Offline == Offline
 | 
						|
}
 | 
						|
 | 
						|
func (s *ScanMode) ensure() error {
 | 
						|
	numTrue := 0
 | 
						|
	for _, b := range []bool{s.IsFast(), s.IsFastRoot(), s.IsDeep()} {
 | 
						|
		if b {
 | 
						|
			numTrue++
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if numTrue == 0 {
 | 
						|
		s.Set(Fast)
 | 
						|
	} else if s.IsDeep() && s.IsOffline() {
 | 
						|
		return xerrors.New("Don't specify both of deep and offline")
 | 
						|
	} else if numTrue != 1 {
 | 
						|
		return xerrors.New("Specify only one of offline, fast, fast-root or deep")
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (s ScanMode) String() string {
 | 
						|
	ss := ""
 | 
						|
	if s.IsFast() {
 | 
						|
		ss = fastStr
 | 
						|
	} else if s.IsFastRoot() {
 | 
						|
		ss = fastRootStr
 | 
						|
	} else if s.IsDeep() {
 | 
						|
		ss = deepStr
 | 
						|
	}
 | 
						|
	if s.IsOffline() {
 | 
						|
		ss += " " + offlineStr
 | 
						|
	}
 | 
						|
	return ss + " mode"
 | 
						|
}
 | 
						|
 | 
						|
func setScanMode(server *ServerInfo, d ServerInfo) error {
 | 
						|
	if len(server.ScanMode) == 0 {
 | 
						|
		server.ScanMode = Conf.Default.ScanMode
 | 
						|
	}
 | 
						|
	for _, m := range server.ScanMode {
 | 
						|
		switch strings.ToLower(m) {
 | 
						|
		case fastStr:
 | 
						|
			server.Mode.Set(Fast)
 | 
						|
		case fastRootStr:
 | 
						|
			server.Mode.Set(FastRoot)
 | 
						|
		case deepStr:
 | 
						|
			server.Mode.Set(Deep)
 | 
						|
		case offlineStr:
 | 
						|
			server.Mode.Set(Offline)
 | 
						|
		default:
 | 
						|
			return xerrors.Errorf("scanMode: %s of %s is invalid. Specify -fast, -fast-root, -deep or offline",
 | 
						|
				m, server.ServerName)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if err := server.Mode.ensure(); err != nil {
 | 
						|
		return xerrors.Errorf("%s in %s", err, server.ServerName)
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 |