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