package main import ( "database/sql" "fmt" "os" "runtime" "github.com/rs/zerolog/log" "github.com/urfave/cli/v2" "github.com/zhaojh329/rttys/config" rlog "github.com/zhaojh329/rttys/log" "github.com/zhaojh329/rttys/utils" "github.com/zhaojh329/rttys/version" ) func initDb(cfg *config.Config) { db, err := sql.Open("sqlite3", cfg.DB) if err != nil { log.Error().Msg(err.Error()) return } defer db.Close() db.Exec("CREATE TABLE IF NOT EXISTS config(name TEXT PRIMARY KEY NOT NULL, value TEXT NOT NULL)") db.Exec("CREATE TABLE IF NOT EXISTS account(username TEXT PRIMARY KEY NOT NULL, password TEXT NOT NULL)") } func runRttys(c *cli.Context) { rlog.SetPath(c.String("log")) cfg := config.Parse(c) log.Info().Msg("Go Version: " + runtime.Version()) log.Info().Msgf("Go OS/Arch: %s/%s", runtime.GOOS, runtime.GOARCH) log.Info().Msg("Rttys Version: " + version.Version()) gitCommit := version.GitCommit() buildTime := version.BuildTime() if gitCommit != "" { log.Info().Msg("Git Commit: " + version.GitCommit()) } if buildTime != "" { log.Info().Msg("Build Time: " + version.BuildTime()) } initDb(cfg) br := newBroker(cfg) go br.run() listenDevice(br) listenDeviceWeb(br) httpStart(br) select {} } func main() { defaultLogPath := "/var/log/rttys.log" if runtime.GOOS == "windows" { defaultLogPath = "rttys.log" } app := &cli.App{ Name: "rttys", Usage: "The server side for rtty", Version: version.Version(), Commands: []*cli.Command{ { Name: "run", Usage: "Run rttys", Flags: []cli.Flag{ &cli.StringFlag{ Name: "log", Value: defaultLogPath, Usage: "log file path", }, &cli.StringFlag{ Name: "conf", Aliases: []string{"c"}, Value: "./rttys.conf", Usage: "config file to load", }, &cli.StringFlag{ Name: "addr-dev", Value: ":5912", Usage: "address to listen device", }, &cli.StringFlag{ Name: "addr-user", Value: ":5913", Usage: "address to listen user", }, &cli.StringFlag{ Name: "addr-web", Value: "", Usage: "address to listen for web proxy (default auto)", }, &cli.StringFlag{ Name: "web-redir-url", Value: "", Usage: "url to redirect for access device's web", }, &cli.StringFlag{ Name: "ssl-cert", Value: "", Usage: "ssl cert file Path", }, &cli.StringFlag{ Name: "ssl-key", Value: "", Usage: "ssl key file Path", }, &cli.StringFlag{ Name: "ssl-cacert", Value: "", Usage: "mtls CA storage in PEM file Path", }, &cli.StringFlag{ Name: "token", Aliases: []string{"t"}, Value: "", Usage: "token to use", }, &cli.StringFlag{ Name: "white-list", Value: "", Usage: "white list(device IDs separated by spaces or *)", }, &cli.StringFlag{ Name: "db", Value: "rttys.db", Usage: "sqlite3 database path", }, &cli.BoolFlag{ Name: "local-auth", Usage: "need auth for local", }, }, Action: func(c *cli.Context) error { runRttys(c) return nil }, }, { Name: "token", Usage: "Generate a token", Action: func(c *cli.Context) error { utils.GenToken() return nil }, }, }, Action: func(c *cli.Context) error { c.App.Command("run").Run(c) return nil }, } err := app.Run(os.Args) if err != nil { fmt.Println(err) os.Exit(1) } }