1package commands 2 3import ( 4 "context" 5 "flag" 6 "os" 7 8 "github.com/google/subcommands" 9 "github.com/inconshreveable/log15" 10 c "github.com/kotakanbe/goval-dictionary/config" 11 server "github.com/kotakanbe/goval-dictionary/server" 12 "github.com/kotakanbe/goval-dictionary/util" 13) 14 15// ServerCmd is Subcommand for OVAL dictionary HTTP Server 16type ServerCmd struct { 17 debug bool 18 debugSQL bool 19 quiet bool 20 logDir string 21 logJSON bool 22 23 dbpath string 24 dbtype string 25 bind string 26 port string 27} 28 29// Name return subcommand name 30func (*ServerCmd) Name() string { return "server" } 31 32// Synopsis return synopsis 33func (*ServerCmd) Synopsis() string { return "Start OVAL dictionary HTTP server" } 34 35// Usage return usage 36func (*ServerCmd) Usage() string { 37 return `server: 38 server 39 [-bind=127.0.0.1] 40 [-port=8000] 41 [-dbpath=$PWD/oval.sqlite3 or connection string] 42 [-dbtype=mysql|sqlite3] 43 [-debug] 44 [-debug-sql] 45 [-quiet] 46 [-log-dir=/path/to/log] 47 [-log-json] 48 49` 50} 51 52// SetFlags set flag 53func (p *ServerCmd) SetFlags(f *flag.FlagSet) { 54 f.BoolVar(&p.debug, "debug", false, "debug mode (default: false)") 55 f.BoolVar(&p.debugSQL, "debug-sql", false, "SQL debug mode (default: false)") 56 f.BoolVar(&p.quiet, "quiet", false, "quiet mode (no output)") 57 58 defaultLogDir := util.GetDefaultLogDir() 59 f.StringVar(&p.logDir, "log-dir", defaultLogDir, "/path/to/log") 60 f.BoolVar(&p.logJSON, "log-json", false, "output log as JSON") 61 62 pwd := os.Getenv("PWD") 63 f.StringVar(&p.dbpath, "dbpath", pwd+"/oval.sqlite3", 64 "/path/to/sqlite3 or SQL connection string") 65 66 f.StringVar(&p.dbtype, "dbtype", "sqlite3", 67 "Database type to store data in (sqlite3 or mysql supported)") 68 69 f.StringVar(&p.bind, 70 "bind", 71 "127.0.0.1", 72 "HTTP server bind to IP address (default: loop back interface)") 73 f.StringVar(&p.port, "port", "1324", 74 "HTTP server port number") 75} 76 77// Execute execute 78func (p *ServerCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { 79 c.Conf.Quiet = p.quiet 80 c.Conf.DebugSQL = p.debugSQL 81 c.Conf.Debug = p.debug 82 c.Conf.Bind = p.bind 83 c.Conf.Port = p.port 84 c.Conf.DBPath = p.dbpath 85 c.Conf.DBType = p.dbtype 86 87 util.SetLogger(p.logDir, c.Conf.Quiet, c.Conf.Debug, p.logJSON) 88 if !c.Conf.Validate() { 89 return subcommands.ExitUsageError 90 } 91 92 log15.Info("Starting HTTP Server...") 93 if err := server.Start(p.logDir); err != nil { 94 log15.Error("Failed to start server", "err", err) 95 return subcommands.ExitFailure 96 } 97 return subcommands.ExitSuccess 98} 99