2016-12-28 23:15:31 +00:00
|
|
|
// Command influxd is the InfluxDB server.
|
2013-12-03 22:19:42 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2015-06-09 04:25:38 +00:00
|
|
|
"flag"
|
2013-12-03 22:19:42 +00:00
|
|
|
"fmt"
|
2015-05-30 14:49:49 +00:00
|
|
|
"io"
|
2015-03-22 20:58:40 +00:00
|
|
|
"math/rand"
|
2013-12-03 22:19:42 +00:00
|
|
|
"os"
|
2015-07-15 17:14:11 +00:00
|
|
|
"os/signal"
|
|
|
|
"syscall"
|
2015-03-22 20:58:40 +00:00
|
|
|
"time"
|
2015-01-24 20:11:03 +00:00
|
|
|
|
2016-09-13 22:46:44 +00:00
|
|
|
"github.com/influxdata/influxdb/cmd"
|
2016-02-10 17:26:18 +00:00
|
|
|
"github.com/influxdata/influxdb/cmd/influxd/backup"
|
|
|
|
"github.com/influxdata/influxdb/cmd/influxd/help"
|
|
|
|
"github.com/influxdata/influxdb/cmd/influxd/restore"
|
|
|
|
"github.com/influxdata/influxdb/cmd/influxd/run"
|
2016-12-15 14:54:14 +00:00
|
|
|
"go.uber.org/zap"
|
2014-12-11 21:49:42 +00:00
|
|
|
)
|
|
|
|
|
2015-06-09 04:25:38 +00:00
|
|
|
// These variables are populated via the Go linker.
|
|
|
|
var (
|
2016-02-24 18:24:33 +00:00
|
|
|
version string
|
|
|
|
commit string
|
|
|
|
branch string
|
2015-06-09 04:25:38 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
2015-09-25 06:32:47 +00:00
|
|
|
// If commit, branch, or build time are not set, make that clear.
|
2016-02-24 18:24:33 +00:00
|
|
|
if version == "" {
|
|
|
|
version = "unknown"
|
|
|
|
}
|
2015-06-09 04:25:38 +00:00
|
|
|
if commit == "" {
|
|
|
|
commit = "unknown"
|
|
|
|
}
|
2015-08-12 18:14:25 +00:00
|
|
|
if branch == "" {
|
|
|
|
branch = "unknown"
|
|
|
|
}
|
2015-06-09 04:25:38 +00:00
|
|
|
}
|
|
|
|
|
2013-12-03 22:19:42 +00:00
|
|
|
func main() {
|
2015-03-22 20:58:40 +00:00
|
|
|
rand.Seed(time.Now().UnixNano())
|
2014-12-06 01:02:30 +00:00
|
|
|
|
2015-05-30 14:49:49 +00:00
|
|
|
m := NewMain()
|
|
|
|
if err := m.Run(os.Args[1:]...); err != nil {
|
2015-07-01 20:44:49 +00:00
|
|
|
fmt.Fprintln(os.Stderr, err)
|
2015-05-30 14:49:49 +00:00
|
|
|
os.Exit(1)
|
2015-02-24 17:47:07 +00:00
|
|
|
}
|
2015-05-30 14:49:49 +00:00
|
|
|
}
|
2015-02-24 17:47:07 +00:00
|
|
|
|
2015-05-30 14:49:49 +00:00
|
|
|
// Main represents the program execution.
|
|
|
|
type Main struct {
|
2016-12-01 18:26:23 +00:00
|
|
|
Logger zap.Logger
|
2015-07-15 17:14:11 +00:00
|
|
|
|
2015-05-30 14:49:49 +00:00
|
|
|
Stdin io.Reader
|
|
|
|
Stdout io.Writer
|
|
|
|
Stderr io.Writer
|
|
|
|
}
|
2014-12-06 01:02:30 +00:00
|
|
|
|
2015-05-30 14:49:49 +00:00
|
|
|
// NewMain return a new instance of Main.
|
|
|
|
func NewMain() *Main {
|
|
|
|
return &Main{
|
2016-12-01 18:26:23 +00:00
|
|
|
Logger: zap.New(
|
|
|
|
zap.NewTextEncoder(),
|
|
|
|
zap.Output(os.Stderr),
|
|
|
|
),
|
2015-05-30 14:49:49 +00:00
|
|
|
Stdin: os.Stdin,
|
|
|
|
Stdout: os.Stdout,
|
|
|
|
Stderr: os.Stderr,
|
2014-12-06 01:02:30 +00:00
|
|
|
}
|
2015-05-30 14:49:49 +00:00
|
|
|
}
|
2014-12-06 01:02:30 +00:00
|
|
|
|
2015-05-30 14:49:49 +00:00
|
|
|
// Run determines and runs the command specified by the CLI args.
|
|
|
|
func (m *Main) Run(args ...string) error {
|
2016-09-13 22:46:44 +00:00
|
|
|
name, args := cmd.ParseCommandName(args)
|
2014-12-06 01:02:30 +00:00
|
|
|
|
|
|
|
// Extract name from args.
|
2015-05-30 14:49:49 +00:00
|
|
|
switch name {
|
|
|
|
case "", "run":
|
2015-06-11 04:50:20 +00:00
|
|
|
cmd := run.NewCommand()
|
|
|
|
|
|
|
|
// Tell the server the build details.
|
|
|
|
cmd.Version = version
|
|
|
|
cmd.Commit = commit
|
2015-08-12 18:14:25 +00:00
|
|
|
cmd.Branch = branch
|
2016-12-01 18:26:23 +00:00
|
|
|
cmd.Logger = m.Logger
|
2015-06-11 04:50:20 +00:00
|
|
|
|
|
|
|
if err := cmd.Run(args...); err != nil {
|
2015-05-30 14:49:49 +00:00
|
|
|
return fmt.Errorf("run: %s", err)
|
2015-03-22 20:58:40 +00:00
|
|
|
}
|
2015-06-05 20:40:18 +00:00
|
|
|
|
2015-07-15 17:14:11 +00:00
|
|
|
signalCh := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
|
2016-12-01 18:26:23 +00:00
|
|
|
m.Logger.Info("Listening for signals")
|
2015-07-15 17:14:11 +00:00
|
|
|
|
|
|
|
// Block until one of the signals above is received
|
2016-12-19 22:04:43 +00:00
|
|
|
<-signalCh
|
|
|
|
m.Logger.Info("Signal received, initializing clean shutdown...")
|
|
|
|
go cmd.Close()
|
2015-07-15 17:14:11 +00:00
|
|
|
|
|
|
|
// Block again until another signal is received, a shutdown timeout elapses,
|
|
|
|
// or the Command is gracefully closed
|
2016-12-01 18:26:23 +00:00
|
|
|
m.Logger.Info("Waiting for clean shutdown...")
|
2015-07-15 17:14:11 +00:00
|
|
|
select {
|
|
|
|
case <-signalCh:
|
2016-12-01 18:26:23 +00:00
|
|
|
m.Logger.Info("second signal received, initializing hard shutdown")
|
2015-07-15 17:14:11 +00:00
|
|
|
case <-time.After(time.Second * 30):
|
2016-12-01 18:26:23 +00:00
|
|
|
m.Logger.Info("time limit reached, initializing hard shutdown")
|
2015-07-15 17:14:11 +00:00
|
|
|
case <-cmd.Closed:
|
2016-12-01 18:26:23 +00:00
|
|
|
m.Logger.Info("server shutdown completed")
|
2015-07-15 17:14:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// goodbye.
|
2015-06-05 20:40:18 +00:00
|
|
|
|
2015-06-08 19:07:05 +00:00
|
|
|
case "backup":
|
|
|
|
name := backup.NewCommand()
|
|
|
|
if err := name.Run(args...); err != nil {
|
|
|
|
return fmt.Errorf("backup: %s", err)
|
|
|
|
}
|
|
|
|
case "restore":
|
|
|
|
name := restore.NewCommand()
|
|
|
|
if err := name.Run(args...); err != nil {
|
|
|
|
return fmt.Errorf("restore: %s", err)
|
|
|
|
}
|
2015-03-16 15:23:53 +00:00
|
|
|
case "config":
|
2015-05-30 14:49:49 +00:00
|
|
|
if err := run.NewPrintConfigCommand().Run(args...); err != nil {
|
|
|
|
return fmt.Errorf("config: %s", err)
|
|
|
|
}
|
|
|
|
case "version":
|
2015-06-09 04:25:38 +00:00
|
|
|
if err := NewVersionCommand().Run(args...); err != nil {
|
2015-05-30 14:49:49 +00:00
|
|
|
return fmt.Errorf("version: %s", err)
|
|
|
|
}
|
|
|
|
case "help":
|
|
|
|
if err := help.NewCommand().Run(args...); err != nil {
|
|
|
|
return fmt.Errorf("help: %s", err)
|
2015-03-25 16:27:48 +00:00
|
|
|
}
|
2015-05-30 16:11:23 +00:00
|
|
|
default:
|
|
|
|
return fmt.Errorf(`unknown command "%s"`+"\n"+`Run 'influxd help' for usage`+"\n\n", name)
|
2014-11-04 20:36:15 +00:00
|
|
|
}
|
|
|
|
|
2015-05-30 16:11:23 +00:00
|
|
|
return nil
|
2015-05-30 14:49:49 +00:00
|
|
|
}
|
2014-10-22 00:20:43 +00:00
|
|
|
|
2015-11-07 07:30:27 +00:00
|
|
|
// VersionCommand represents the command executed by "influxd version".
|
2015-06-09 04:25:38 +00:00
|
|
|
type VersionCommand struct {
|
|
|
|
Stdout io.Writer
|
|
|
|
Stderr io.Writer
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewVersionCommand return a new instance of VersionCommand.
|
|
|
|
func NewVersionCommand() *VersionCommand {
|
|
|
|
return &VersionCommand{
|
|
|
|
Stdout: os.Stdout,
|
|
|
|
Stderr: os.Stderr,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Run prints the current version and commit info.
|
|
|
|
func (cmd *VersionCommand) Run(args ...string) error {
|
|
|
|
// Parse flags in case -h is specified.
|
|
|
|
fs := flag.NewFlagSet("", flag.ContinueOnError)
|
2016-06-21 19:06:05 +00:00
|
|
|
fs.Usage = func() { fmt.Fprintln(cmd.Stderr, versionUsage) }
|
2015-06-09 04:25:38 +00:00
|
|
|
if err := fs.Parse(args); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Print version info.
|
2016-02-24 17:15:28 +00:00
|
|
|
fmt.Fprintf(cmd.Stdout, "InfluxDB v%s (git: %s %s)\n", version, branch, commit)
|
2015-06-09 04:25:38 +00:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2016-07-07 21:29:22 +00:00
|
|
|
var versionUsage = `Displays the InfluxDB version, build branch and git commit hash.
|
2015-06-09 04:25:38 +00:00
|
|
|
|
2016-07-07 21:29:22 +00:00
|
|
|
Usage: influxd version
|
2015-06-09 04:25:38 +00:00
|
|
|
`
|