func start() error { fileName := flag.String("config", "config.sample.toml", "Config file") wantsVersion := flag.Bool("v", false, "Get version number") resetRootPassword := flag.Bool("reset-root", false, "Reset root password") hostname := flag.String("hostname", "", "Override the hostname, the `hostname` config option will be overridden") raftPort := flag.Int("raft-port", 0, "Override the raft port, the `raft.port` config option will be overridden") protobufPort := flag.Int("protobuf-port", 0, "Override the protobuf port, the `protobuf_port` config option will be overridden") pidFile := flag.String("pidfile", "", "the pid file") repairLeveldb := flag.Bool("repair-ldb", false, "set to true to repair the leveldb files") stdout := flag.Bool("stdout", false, "Log to stdout overriding the configuration") syslog := flag.String("syslog", "", "Log to syslog facility overriding the configuration") runtime.GOMAXPROCS(runtime.NumCPU()) flag.Parse() v := fmt.Sprintf("InfluxDB v%s (git: %s) (leveldb: %d.%d)", version, gitSha, levigo.GetLevelDBMajorVersion(), levigo.GetLevelDBMinorVersion()) if wantsVersion != nil && *wantsVersion { fmt.Println(v) return nil } config, err := configuration.LoadConfiguration(*fileName) if err != nil { return err } // override the hostname if it was specified on the command line if hostname != nil && *hostname != "" { config.Hostname = *hostname } if raftPort != nil && *raftPort != 0 { config.RaftServerPort = *raftPort } if protobufPort != nil && *protobufPort != 0 { config.ProtobufPort = *protobufPort } config.Version = v config.InfluxDBVersion = version if *stdout { config.LogFile = "stdout" } if *syslog != "" { config.LogFile = *syslog } setupLogging(config.LogLevel, config.LogFile) if config.RaftDebug { log.Info("Turning on raft debug logging") raft.SetLogLevel(raft.Trace) } if *repairLeveldb { log.Info("Repairing leveldb") files, err := ioutil.ReadDir(config.DataDir) if err != nil { panic(err) } o := levigo.NewOptions() defer o.Close() for _, f := range files { p := path.Join(config.DataDir, f.Name()) log.Info("Repairing %s", p) if err := levigo.RepairDatabase(p, o); err != nil { panic(err) } } } if pidFile != nil && *pidFile != "" { pid := strconv.Itoa(os.Getpid()) if err := ioutil.WriteFile(*pidFile, []byte(pid), 0644); err != nil { panic(err) } } if config.BindAddress == "" { log.Info("Starting Influx Server %s...", version) } else { log.Info("Starting Influx Server %s bound to %s...", version, config.BindAddress) } fmt.Printf(` +---------------------------------------------+ | _____ __ _ _____ ____ | | |_ _| / _| | | __ \| _ \ | | | | _ __ | |_| |_ ___ _| | | | |_) | | | | | | '_ \| _| | | | \ \/ / | | | _ < | | _| |_| | | | | | | |_| |> <| |__| | |_) | | | |_____|_| |_|_| |_|\__,_/_/\_\_____/|____/ | +---------------------------------------------+ `) os.MkdirAll(config.RaftDir, 0744) os.MkdirAll(config.DataDir, 0744) server, err := server.NewServer(config) if err != nil { // sleep for the log to flush time.Sleep(time.Second) panic(err) } if err := startProfiler(server); err != nil { panic(err) } if *resetRootPassword { // TODO: make this not suck // This is ghetto as hell, but it'll work for now. go func() { time.Sleep(2 * time.Second) // wait for the raft server to join the cluster log.Warn("Resetting root's password to %s", coordinator.DEFAULT_ROOT_PWD) if err := server.RaftServer.CreateRootUser(); err != nil { panic(err) } }() } err = server.ListenAndServe() if err != nil { log.Error("ListenAndServe failed: ", err) } return err }
func main() { for idx := range os.Args { arg := os.Args[idx] if strings.HasPrefix(arg, "--h") || strings.HasPrefix(arg, "-h") { fmt.Fprintf(os.Stderr, USAGE) os.Exit(0) } } // Load the htraced configuration. cnf, cnfLog := conf.LoadApplicationConfig("htraced.") // Open the HTTP port. // We want to do this first, before initializing the datastore or setting up // logging. That way, if someone accidentally starts two daemons with the // same config file, the second invocation will exit with a "port in use" // error rather than potentially disrupting the first invocation. rstListener, listenErr := net.Listen("tcp", cnf.Get(conf.HTRACE_WEB_ADDRESS)) if listenErr != nil { fmt.Fprintf(os.Stderr, "Error opening HTTP port: %s\n", listenErr.Error()) os.Exit(1) } // Print out the startup banner and information about the daemon // configuration. lg := common.NewLogger("main", cnf) defer lg.Close() lg.Infof("*** Starting htraced %s [%s]***\n", RELEASE_VERSION, GIT_VERSION) scanner := bufio.NewScanner(cnfLog) for scanner.Scan() { lg.Infof(scanner.Text() + "\n") } common.InstallSignalHandlers(cnf) if runtime.GOMAXPROCS(0) == 1 { ncpu := runtime.NumCPU() runtime.GOMAXPROCS(ncpu) lg.Infof("setting GOMAXPROCS=%d\n", ncpu) } else { lg.Infof("GOMAXPROCS=%d\n", runtime.GOMAXPROCS(0)) } lg.Infof("leveldb version=%d.%d\n", levigo.GetLevelDBMajorVersion(), levigo.GetLevelDBMinorVersion()) // Initialize the datastore. store, err := CreateDataStore(cnf, nil) if err != nil { lg.Errorf("Error creating datastore: %s\n", err.Error()) os.Exit(1) } var rsv *RestServer rsv, err = CreateRestServer(cnf, store, rstListener) if err != nil { lg.Errorf("Error creating REST server: %s\n", err.Error()) os.Exit(1) } var hsv *HrpcServer if cnf.Get(conf.HTRACE_HRPC_ADDRESS) != "" { hsv, err = CreateHrpcServer(cnf, store, nil) if err != nil { lg.Errorf("Error creating HRPC server: %s\n", err.Error()) os.Exit(1) } } else { lg.Infof("Not starting HRPC server because no value was given for %s.\n", conf.HTRACE_HRPC_ADDRESS) } naddr := cnf.Get(conf.HTRACE_STARTUP_NOTIFICATION_ADDRESS) if naddr != "" { notif := StartupNotification{ HttpAddr: rsv.Addr().String(), ProcessId: os.Getpid(), } if hsv != nil { notif.HrpcAddr = hsv.Addr().String() } err = sendStartupNotification(naddr, ¬if) if err != nil { fmt.Fprintf(os.Stderr, "Failed to send startup notification: "+ "%s\n", err.Error()) os.Exit(1) } } for { time.Sleep(time.Duration(10) * time.Hour) } }
func main() { fileName := flag.String("config", "config.sample.toml", "Config file") wantsVersion := flag.Bool("v", false, "Get version number") resetRootPassword := flag.Bool("reset-root", false, "Reset root password") pidFile := flag.String("pidfile", "", "the pid file") repairLeveldb := flag.Bool("repair-ldb", false, "set to true to repair the leveldb files") runtime.GOMAXPROCS(runtime.NumCPU()) flag.Parse() if wantsVersion != nil && *wantsVersion { fmt.Printf("InfluxDB v%s (git: %s) (leveldb: %d.%d)\n", version, gitSha, levigo.GetLevelDBMajorVersion(), levigo.GetLevelDBMinorVersion()) return } config := configuration.LoadConfiguration(*fileName) setupLogging(config.LogLevel, config.LogFile) if *repairLeveldb { log.Info("Repairing leveldb") files, err := ioutil.ReadDir(config.DataDir) if err != nil { panic(err) } o := levigo.NewOptions() defer o.Close() for _, f := range files { p := path.Join(config.DataDir, f.Name()) log.Info("Repairing %s", p) if err := levigo.RepairDatabase(p, o); err != nil { panic(err) } } } if pidFile != nil && *pidFile != "" { pid := strconv.Itoa(os.Getpid()) if err := ioutil.WriteFile(*pidFile, []byte(pid), 0644); err != nil { panic(err) } } if config.BindAddress == "" { log.Info("Starting Influx Server...") } else { log.Info("Starting Influx Server bound to %s ...", config.BindAddress) } log.Info(` +---------------------------------------------+ | _____ __ _ _____ ____ | | |_ _| / _| | | __ \| _ \ | | | | _ __ | |_| |_ ___ _| | | | |_) | | | | | | '_ \| _| | | | \ \/ / | | | _ < | | _| |_| | | | | | | |_| |> <| |__| | |_) | | | |_____|_| |_|_| |_|\__,_/_/\_\_____/|____/ | +---------------------------------------------+ `) os.MkdirAll(config.RaftDir, 0744) os.MkdirAll(config.DataDir, 0744) server, err := server.NewServer(config) if err != nil { // sleep for the log to flush time.Sleep(time.Second) panic(err) } if err := startProfiler(server); err != nil { panic(err) } if *resetRootPassword { // TODO: make this not suck // This is ghetto as hell, but it'll work for now. go func() { time.Sleep(2 * time.Second) // wait for the raft server to join the cluster log.Warn("Resetting root's password to %s", coordinator.DEFAULT_ROOT_PWD) if err := server.RaftServer.CreateRootUser(); err != nil { panic(err) } }() } err = server.ListenAndServe() if err != nil { log.Error("ListenAndServe failed: ", err) } }