@@ -3,6 +3,7 @@ package main
33import (
44 "flag"
55 "fmt"
6+ "os"
67 "runtime"
78 "strings"
89
@@ -18,7 +19,7 @@ type Flags struct {
1819
1920 PrintVersion bool
2021 SingleFileType string
21- Labels map [ string ] string
22+ Labels labelsMap
2223 OneShotDSN string
2324 TestMode bool
2425 DisableAgent bool
@@ -54,36 +55,44 @@ func (l *labelsMap) Set(label string) error {
5455 return nil
5556}
5657
57- func ( f * Flags ) parse ( ) {
58- flag . StringVar ( & f . ConfigFile , "c" , csconfig . DefaultConfigPath ( "config.yaml" ), "configuration file" )
58+ func parseFlags ( argv [] string ) ( Flags , error ) {
59+ var f Flags
5960
60- var trace , debug , info , warn , erro , fatal bool
61+ fs := flag .NewFlagSet ("crowdsec" , flag .ExitOnError )
62+ fs .SetOutput (os .Stderr )
63+
64+ fs .StringVar (& f .ConfigFile , "c" , csconfig .DefaultConfigPath ("config.yaml" ), "configuration file" )
6165
62- flag .BoolVar (& trace , "trace" , false , "set log level to 'trace' (VERY verbose)" )
63- flag .BoolVar (& debug , "debug" , false , "set log level to 'debug'" )
64- flag .BoolVar (& info , "info" , false , "set log level to 'info'" )
65- flag .BoolVar (& warn , "warning" , false , "set log level to 'warning'" )
66- flag .BoolVar (& erro , "error" , false , "set log level to 'error'" )
67- flag .BoolVar (& fatal , "fatal" , false , "set log level to 'fatal'" )
68-
69- flag .BoolVar (& f .PrintVersion , "version" , false , "display version" )
70- flag .StringVar (& f .OneShotDSN , "dsn" , "" , "Process a single data source in time-machine" )
71- flag .StringVar (& f .Transform , "transform" , "" , "expr to apply on the event after acquisition" )
72- flag .StringVar (& f .SingleFileType , "type" , "" , "Labels.type for file in time-machine" )
73- flag .Var (& additionalLabels , "label" , "Additional Labels for file in time-machine" )
74- flag .BoolVar (& f .TestMode , "t" , false , "only test configs" )
75- flag .BoolVar (& f .DisableAgent , "no-cs" , false , "disable crowdsec agent" )
76- flag .BoolVar (& f .DisableAPI , "no-api" , false , "disable local API" )
77- flag .BoolVar (& f .DisableCAPI , "no-capi" , false , "disable communication with Central API" )
78- flag .BoolVar (& f .OrderEvent , "order-event" , false , "enforce event ordering with significant performance cost" )
66+ var trace , debug , info , warn , erro , fatal bool
67+ fs .BoolVar (& trace , "trace" , false , "set log level to 'trace' (VERY verbose)" )
68+ fs .BoolVar (& debug , "debug" , false , "set log level to 'debug'" )
69+ fs .BoolVar (& info , "info" , false , "set log level to 'info'" )
70+ fs .BoolVar (& warn , "warning" , false , "set log level to 'warning'" )
71+ fs .BoolVar (& erro , "error" , false , "set log level to 'error'" )
72+ fs .BoolVar (& fatal , "fatal" , false , "set log level to 'fatal'" )
73+
74+ fs .BoolVar (& f .PrintVersion , "version" , false , "display version" )
75+ fs .StringVar (& f .OneShotDSN , "dsn" , "" , "Process a single data source in time-machine" )
76+ fs .StringVar (& f .Transform , "transform" , "" , "expr to apply on the event after acquisition" )
77+ fs .StringVar (& f .SingleFileType , "type" , "" , "Labels.type for file in time-machine" )
78+ f .Labels = make (labelsMap )
79+ fs .Var (& f .Labels , "label" , "Additional Labels for file in time-machine" )
80+ fs .BoolVar (& f .TestMode , "t" , false , "only test configs" )
81+ fs .BoolVar (& f .DisableAgent , "no-cs" , false , "disable crowdsec agent" )
82+ fs .BoolVar (& f .DisableAPI , "no-api" , false , "disable local API" )
83+ fs .BoolVar (& f .DisableCAPI , "no-capi" , false , "disable communication with Central API" )
84+ fs .BoolVar (& f .OrderEvent , "order-event" , false , "enforce event ordering with significant performance cost" )
7985
8086 if runtime .GOOS == "windows" {
81- flag .StringVar (& f .WinSvc , "winsvc" , "" , "Windows service Action: Install, Remove etc.." )
87+ fs .StringVar (& f .WinSvc , "winsvc" , "" , "Windows service Action: Install, Remove etc.." )
8288 }
8389
84- flag .StringVar (& f .DumpDir , "dump-data" , "" , "dump parsers/buckets raw outputs" )
85- flag .StringVar (& f .CPUProfile , "cpu-profile" , "" , "write cpu profile to file" )
86- flag .Parse ()
90+ fs .StringVar (& f .DumpDir , "dump-data" , "" , "dump parsers/buckets raw outputs" )
91+ fs .StringVar (& f .CPUProfile , "cpu-profile" , "" , "write cpu profile to file" )
92+
93+ if err := fs .Parse (argv ); err != nil {
94+ return f , err
95+ }
8796
8897 // Set the log level selected by the --trace, --debug, --info, etc. flags,
8998 // giving precedence to the most verbose flag if multiple are set. If no flag is specified,
@@ -102,4 +111,11 @@ func (f *Flags) parse() {
102111 case fatal :
103112 f .LogLevel = log .FatalLevel
104113 }
114+
115+ if len (fs .Args ()) > 0 {
116+ return f , fmt .Errorf ("argument provided but not defined: %s" , fs .Args ()[0 ])
117+
118+ }
119+
120+ return f , nil
105121}
0 commit comments