diff --git a/cmd/tunasync/tunasync.go b/cmd/tunasync/tunasync.go new file mode 100644 index 0000000..afeed56 --- /dev/null +++ b/cmd/tunasync/tunasync.go @@ -0,0 +1,152 @@ +package main + +import ( + "os" + + "github.com/codegangsta/cli" + "gopkg.in/op/go-logging.v1" + + tunasync "github.com/tuna/tunasync/internal" + "github.com/tuna/tunasync/manager" + "github.com/tuna/tunasync/worker" +) + +var logger = logging.MustGetLogger("tunasync-cmd") + +func startManager(c *cli.Context) { + tunasync.InitLogger(c.Bool("verbose"), c.Bool("debug"), c.Bool("with-systemd")) + + cfg, err := manager.LoadConfig(c.String("config"), c) + if err != nil { + logger.Error("Error loading config: %s", err.Error()) + os.Exit(1) + } + + m := manager.GetTUNASyncManager(cfg) + if m == nil { + logger.Error("Error intializing TUNA sync worker.") + os.Exit(1) + } + + logger.Info("Run tunasync manager server.") + m.Run() +} + +func startWorker(c *cli.Context) { + tunasync.InitLogger(c.Bool("verbose"), c.Bool("debug"), c.Bool("with-systemd")) + + cfg, err := worker.LoadConfig(c.String("config")) + if err != nil { + logger.Error("Error loading config: %s", err.Error()) + os.Exit(1) + } + + w := worker.GetTUNASyncWorker(cfg) + if w == nil { + logger.Error("Error intializing TUNA sync worker.") + os.Exit(1) + } + + logger.Info("Run tunasync worker.") + w.Run() +} + +func main() { + app := cli.NewApp() + app.EnableBashCompletion = true + app.Version = "0.1" + app.Commands = []cli.Command{ + { + Name: "manager", + Aliases: []string{"m"}, + Usage: "start the tunasync manager", + Action: startManager, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "config, c", + Usage: "Load manager configurations from `FILE`", + }, + + cli.StringFlag{ + Name: "addr", + Usage: "The manager will listen on `ADDR`", + }, + cli.StringFlag{ + Name: "port", + Usage: "The manager will bind to `PORT`", + }, + cli.StringFlag{ + Name: "cert", + Usage: "Use SSL certificate from `FILE`", + }, + cli.StringFlag{ + Name: "key", + Usage: "Use SSL key from `FILE`", + }, + cli.StringFlag{ + Name: "status-file", + Usage: "Write status file to `FILE`", + }, + cli.StringFlag{ + Name: "db-file", + Usage: "Use `FILE` as the database file", + }, + cli.StringFlag{ + Name: "db-type", + Usage: "Use database type `TYPE`", + }, + + cli.BoolFlag{ + Name: "verbose, v", + Usage: "Enable verbose logging", + }, + cli.BoolFlag{ + Name: "debug", + Usage: "Run manager in debug mode", + }, + cli.BoolFlag{ + Name: "with-systemd", + Usage: "Enable systemd-compatible logging", + }, + + cli.StringFlag{ + Name: "pidfile", + Value: "/run/tunasync/tunasync.manager.pid", + Usage: "The pid file of the manager process", + }, + }, + }, + { + Name: "worker", + Aliases: []string{"w"}, + Usage: "start the tunasync worker", + Action: startWorker, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "config, c", + Usage: "Load worker configurations from `FILE`", + }, + + cli.BoolFlag{ + Name: "verbose, v", + Usage: "Enable verbose logging", + }, + cli.BoolFlag{ + Name: "debug", + Usage: "Run manager in debug mode", + }, + cli.BoolFlag{ + Name: "with-systemd", + Usage: "Enable systemd-compatible logging", + }, + + cli.StringFlag{ + Name: "pidfile", + Value: "/run/tunasync/tunasync.worker.pid", + Usage: "The pid file of the worker process", + }, + }, + }, + } + app.Run(os.Args) +}