Thibault bui Koechlin 5 年之前
父节点
当前提交
eb0b49cbbc
共有 1 个文件被更改,包括 155 次插入0 次删除
  1. 155 0
      pkg/config/crowdsec/config.go

+ 155 - 0
pkg/config/crowdsec/config.go

@@ -0,0 +1,155 @@
+package config
+
+import (
+	"flag"
+	"fmt"
+	"io/ioutil"
+	"path/filepath"
+
+	"os"
+
+	"github.com/crowdsecurity/crowdsec/pkg/cwversion"
+	"github.com/crowdsecurity/crowdsec/pkg/outputs"
+
+	log "github.com/sirupsen/logrus"
+	"gopkg.in/yaml.v2"
+)
+
+// Crowdwatch is the structure of the crowdsec configuration
+type Crowdwatch struct {
+	WorkingFolder   string    `yaml:"working_dir,omitempty"`
+	DataFolder      string    `yaml:"data_dir,omitempty"`
+	ConfigFolder    string    `yaml:"config_dir,omitempty"`
+	AcquisitionFile string    `yaml:"acquis_path,omitempty"`
+	SingleFile      string    //for forensic mode
+	SingleFileLabel string    //for forensic mode
+	PIDFolder       string    `yaml:"pid_dir,omitempty"`
+	LogFolder       string    `yaml:"log_dir,omitempty"`
+	LogMode         string    `yaml:"log_mode,omitempty"`    //like file, syslog or stdout ?
+	LogLevel        log.Level `yaml:"log_level,omitempty"`   //trace,debug,info,warning,error
+	Daemonize       bool      `yaml:"daemon,omitempty"`      //true -> go background
+	Profiling       bool      `yaml:"profiling,omitempty"`   //true -> enable runtime profiling
+	SQLiteFile      string    `yaml:"sqlite_path,omitempty"` //path to sqlite output
+	APIMode         bool      `yaml:"apimode,omitempty"`     //true -> enable api push
+	Linter          bool
+	Prometheus      bool
+	HTTPListen      string `yaml:"http_listen,omitempty"`
+	ValidatorMode   string /*if present points to a specific config (for tests)*/
+	RestoreMode     string
+	DumpBuckets     bool
+	OutputConfig    *outputs.OutputFactory `yaml:"plugin"`
+}
+
+// NewCrowdwatchConfig create a new crowdsec configuration with default configuration
+func NewCrowdwatchConfig() *Crowdwatch {
+	return &Crowdwatch{
+		LogLevel:      log.InfoLevel,
+		Daemonize:     false,
+		Profiling:     false,
+		WorkingFolder: "./",
+		DataFolder:    "./data/",
+		ConfigFolder:  "./config/",
+		PIDFolder:     "./",
+		LogFolder:     "./",
+		LogMode:       "stdout",
+		SQLiteFile:    "./test.db",
+		APIMode:       false,
+		Prometheus:    false,
+		HTTPListen:    "127.0.0.1:6060",
+	}
+}
+
+// GetOPT return flags parsed from command line
+func (c *Crowdwatch) GetOPT() error {
+
+	AcquisitionFile := flag.String("acquis", "", "path to acquis.yaml")
+	configFile := flag.String("c", "", "configuration file")
+	printTrace := flag.Bool("trace", false, "VERY verbose")
+	printDebug := flag.Bool("debug", false, "print debug-level on stdout")
+	printInfo := flag.Bool("info", false, "print info-level on stdout")
+	printVersion := flag.Bool("version", false, "display version")
+	APIMode := flag.Bool("api", false, "perform pushes to api")
+	SQLiteMode := flag.Bool("sqlite", true, "write overflows to sqlite")
+	profileMode := flag.Bool("profile", false, "Enable performance profiling")
+	catFile := flag.String("file", "", "Process a single file in time-machine")
+	catFileType := flag.String("type", "", "Labels.type for file in time-machine")
+	daemonMode := flag.Bool("daemon", false, "Daemonize, go background, drop PID file, log to file")
+	testMode := flag.Bool("t", false, "only test configs")
+	prometheus := flag.Bool("prometheus-metrics", false, "expose http prometheus collector (see http_listen)")
+	validatorMode := flag.String("custom-config", "", "[dev] run a specific subset of configs parser:file.yaml,scenarios:file.yaml")
+	restoreMode := flag.String("restore-state", "", "[dev] restore buckets state from json file")
+	dumpMode := flag.Bool("dump-state", false, "[dev] Dump bucket state at the end of run.")
+
+	flag.Parse()
+
+	if *printVersion == true {
+		cwversion.Show()
+		os.Exit(0)
+	}
+
+	if *catFile != "" {
+		if *catFileType == "" {
+			log.Fatalf("-file requires -type")
+		}
+		c.SingleFile = *catFile
+		c.SingleFileLabel = *catFileType
+	}
+
+	/*overriden by cfg file*/
+	if *configFile != "" {
+		rcfg, err := ioutil.ReadFile(*configFile)
+		if err != nil {
+			return fmt.Errorf("read '%s' : %s", *configFile, err)
+		}
+		if err := yaml.UnmarshalStrict(rcfg, c); err != nil {
+			return fmt.Errorf("parse '%s' : %s", *configFile, err)
+		}
+		if c.AcquisitionFile == "" {
+			c.AcquisitionFile = filepath.Clean(c.ConfigFolder + "/acquis.yaml")
+		}
+	}
+
+	if *AcquisitionFile != "" {
+		c.AcquisitionFile = *AcquisitionFile
+	}
+	if *dumpMode == true {
+		c.DumpBuckets = true
+	}
+	if *prometheus {
+		c.Prometheus = true
+	}
+	if *testMode {
+		c.Linter = true
+	}
+	if *validatorMode != "" {
+		c.ValidatorMode = *validatorMode
+	}
+	/*overriden by cmdline*/
+	if *daemonMode {
+		c.Daemonize = true
+	}
+	if *profileMode {
+		c.Profiling = true
+	}
+	if *printDebug {
+		c.LogLevel = log.DebugLevel
+	}
+	if *printInfo {
+		c.LogLevel = log.InfoLevel
+	}
+	if *printTrace {
+		c.LogLevel = log.TraceLevel
+	}
+	if !*SQLiteMode {
+		c.SQLiteFile = ""
+	}
+	if *APIMode {
+		c.APIMode = true
+	}
+
+	if *restoreMode != "" {
+		c.RestoreMode = *restoreMode
+	}
+
+	return nil
+}