* 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
98 lines
2.1 KiB
Go
98 lines
2.1 KiB
Go
package config
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"golang.org/x/xerrors"
|
|
)
|
|
|
|
// ScanModule has a type of scan module
|
|
type ScanModule struct {
|
|
flag byte
|
|
}
|
|
|
|
const (
|
|
// OSPkg is scanmodule
|
|
OSPkg = byte(1 << iota)
|
|
// WordPress is scanmodule
|
|
WordPress
|
|
// Lockfile is scanmodule
|
|
Lockfile
|
|
// Port is scanmodule
|
|
Port
|
|
|
|
osPkgStr = "ospkg"
|
|
wordPressStr = "wordpress"
|
|
lockfileStr = "lockfile"
|
|
portStr = "port"
|
|
)
|
|
|
|
var allModules = []string{osPkgStr, wordPressStr, lockfileStr, portStr}
|
|
|
|
// Set module
|
|
func (s *ScanModule) Set(f byte) {
|
|
s.flag |= f
|
|
}
|
|
|
|
// IsScanOSPkg return whether scanning os pkg
|
|
func (s ScanModule) IsScanOSPkg() bool {
|
|
return s.flag&OSPkg == OSPkg
|
|
}
|
|
|
|
// IsScanWordPress return whether scanning wordpress
|
|
func (s ScanModule) IsScanWordPress() bool {
|
|
return s.flag&WordPress == WordPress
|
|
}
|
|
|
|
// IsScanLockFile whether scanning lock file
|
|
func (s ScanModule) IsScanLockFile() bool {
|
|
return s.flag&Lockfile == Lockfile
|
|
}
|
|
|
|
// IsScanPort whether scanning listening ports
|
|
func (s ScanModule) IsScanPort() bool {
|
|
return s.flag&Port == Port
|
|
}
|
|
|
|
// IsZero return the struct value are all false
|
|
func (s ScanModule) IsZero() bool {
|
|
return !(s.IsScanOSPkg() || s.IsScanWordPress() || s.IsScanLockFile() || s.IsScanPort())
|
|
}
|
|
|
|
func (s *ScanModule) ensure() error {
|
|
if s.IsZero() {
|
|
s.Set(OSPkg)
|
|
s.Set(WordPress)
|
|
s.Set(Lockfile)
|
|
s.Set(Port)
|
|
} else if !s.IsScanOSPkg() && s.IsScanPort() {
|
|
return xerrors.New("When specifying the Port, Specify OSPkg as well")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func setScanModules(server *ServerInfo, d ServerInfo) error {
|
|
if len(server.ScanModules) == 0 {
|
|
server.ScanModules = d.ScanModules
|
|
}
|
|
for _, m := range server.ScanModules {
|
|
switch strings.ToLower(m) {
|
|
case osPkgStr:
|
|
server.Module.Set(OSPkg)
|
|
case wordPressStr:
|
|
server.Module.Set(WordPress)
|
|
case lockfileStr:
|
|
server.Module.Set(Lockfile)
|
|
case portStr:
|
|
server.Module.Set(Port)
|
|
default:
|
|
return xerrors.Errorf("scanMode: %s of %s is invalid. Specify %s",
|
|
m, server.ServerName, allModules)
|
|
}
|
|
}
|
|
if err := server.Module.ensure(); err != nil {
|
|
return xerrors.Errorf("%s in %s", err, server.ServerName)
|
|
}
|
|
return nil
|
|
}
|