func serve(cdir string, tld string) { tempDir, _ := ioutil.TempDir("", "tut") tempDir += string(os.PathSeparator) defer os.RemoveAll(tempDir) clog.Log("Workdir %s", tempDir) c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) go func() { <-c os.RemoveAll(tempDir) clog.Fatal("Stopped") }() var idx Index idx = make(map[string]int) walker := func(src string, f os.FileInfo, err error) error { return setup(tempDir, src, f, idx, err) } if err := filepath.Walk(cdir, walker); err != nil { clog.Fatalf("Filewalk %v", err) } getindex := func(w http.ResponseWriter, r *http.Request) { json, err := json.Marshal(idx) if err != nil { clog.Fatalf("During Index JSON Marshal %v", err) } w.Header().Set("Content-Type", "application/json") w.Write(json) } http.HandleFunc("/tutorial/index.json", getindex) url, _ := url.Parse("http://localhost:8093") rp := httputil.NewSingleHostReverseProxy(url) http.Handle("/query", rp) fs := http.FileServer(http.Dir(tempDir + "/" + tld + "/")) http.Handle("/tutorial/", http.StripPrefix("/tutorial/", fs)) http.Handle("/", http.RedirectHandler("/tutorial/index.html#1", 302)) clog.Log("Running at http://localhost:8000/") go func() { for { filepath.Walk(cdir, walker) time.Sleep(2 * time.Second) } }() // last step if err := http.ListenAndServe(":8000", nil); err != nil { clog.Fatalf("ListenAndServe %v", err) } }
func main() { flag.Parse() if flags.Help { flag.Usage() os.Exit(2) } if flags.Version { fmt.Printf("%s main: %s, data: %s\n", path.Base(os.Args[0]), VERSION, cbgt.VERSION) os.Exit(0) } if os.Getenv("GOMAXPROCS") == "" { runtime.GOMAXPROCS(runtime.NumCPU()) } mr, err := cbgt.NewMsgRing(os.Stderr, 1000) if err != nil { log.Fatalf("main: could not create MsgRing, err: %v", err) } log.SetOutput(mr) log.Printf("main: %s started (%s/%s)", os.Args[0], VERSION, cbgt.VERSION) rand.Seed(time.Now().UTC().UnixNano()) go cmd.DumpOnSignalForPlatform() MainWelcome(flagAliases) s, err := os.Stat(flags.DataDir) if err != nil { if os.IsNotExist(err) { if flags.DataDir == DEFAULT_DATA_DIR { log.Printf("main: creating data directory, dataDir: %s", flags.DataDir) err = os.Mkdir(flags.DataDir, 0700) if err != nil { log.Fatalf("main: could not create data directory,"+ " dataDir: %s, err: %v", flags.DataDir, err) } } else { log.Fatalf("main: data directory does not exist,"+ " dataDir: %s", flags.DataDir) return } } else { log.Fatalf("main: could not access data directory,"+ " dataDir: %s, err: %v", flags.DataDir, err) return } } else { if !s.IsDir() { log.Fatalf("main: not a directory, dataDir: %s", flags.DataDir) return } } wd, err := os.Getwd() if err != nil { log.Fatalf("main: os.Getwd, err: %#v", err) return } log.Printf("main: curr dir: %q", wd) dataDirAbs, err := filepath.Abs(flags.DataDir) if err != nil { log.Fatalf("main: filepath.Abs, err: %#v", err) return } log.Printf("main: data dir: %q", dataDirAbs) // If cfg is down, we error, leaving it to some user-supplied // outside watchdog to backoff and restart/retry. cfg, err := cmd.MainCfg(cmdName, flags.CfgConnect, flags.BindHttp, flags.Register, flags.DataDir) if err != nil { if err == cmd.ErrorBindHttp { log.Fatalf("%v", err) return } log.Fatalf("main: could not start cfg, cfgConnect: %s, err: %v\n"+ " Please check that your -cfg/-cfgConnect parameter (%q)\n"+ " is correct and/or that your configuration provider\n"+ " is available.", flags.CfgConnect, err, flags.CfgConnect) return } uuid := flags.UUID if uuid != "" { uuidPath := flags.DataDir + string(os.PathSeparator) + cmdName + ".uuid" err = ioutil.WriteFile(uuidPath, []byte(uuid), 0600) if err != nil { log.Fatalf("main: could not write uuidPath: %s\n"+ " Please check that your -data/-dataDir parameter (%q)\n"+ " is to a writable directory where %s can persist data.", uuidPath, flags.DataDir, cmdName) return } } if uuid == "" { uuid, err = cmd.MainUUID(cmdName, flags.DataDir) if err != nil { log.Fatalf(fmt.Sprintf("%v", err)) return } } var tagsArr []string if flags.Tags != "" { tagsArr = strings.Split(flags.Tags, ",") } expvars.Set("indexes", bleveHttp.IndexStats()) router, err := MainStart(cfg, uuid, tagsArr, flags.Container, flags.Weight, flags.Extra, flags.BindHttp, flags.DataDir, flags.StaticDir, flags.StaticETag, flags.Server, flags.Register, mr, flags.Options) if err != nil { log.Fatal(err) } if flags.Register == "unknown" { log.Printf("main: unregistered node; now exiting") os.Exit(0) } http.Handle("/", router) log.Printf("main: listening on: %s", flags.BindHttp) u := flags.BindHttp if u[0] == ':' { u = "localhost" + u } if strings.HasPrefix(u, "0.0.0.0:") { u = "localhost" + u[len("0.0.0.0"):] } log.Printf("------------------------------------------------------------") log.Printf("web UI / REST API is available: http://%s", u) log.Printf("------------------------------------------------------------") err = http.ListenAndServe(flags.BindHttp, nil) if err != nil { log.Fatalf("main: listen, err: %v\n"+ " Please check that your -bindHttp parameter (%q)\n"+ " is correct and available.", err, flags.BindHttp) } }
func main() { flag.Parse() if flags.Help { flag.Usage() os.Exit(2) } if flags.Version { fmt.Printf("%s main: %s, data: %s\n", path.Base(os.Args[0]), VERSION, cbgt.VERSION) os.Exit(0) } if os.Getenv("GOMAXPROCS") == "" { runtime.GOMAXPROCS(runtime.NumCPU()) } mr, err := cbgt.NewMsgRing(os.Stderr, 1000) if err != nil { log.Fatalf("main: could not create MsgRing, err: %v", err) } log.SetOutput(mr) log.SetLoggerCallback(LoggerFunc) log.Printf("main: %s started (%s/%s)", os.Args[0], VERSION, cbgt.VERSION) rand.Seed(time.Now().UTC().UnixNano()) go cmd.DumpOnSignalForPlatform() bleve.StoreDynamic = false bleve.MappingJSONStrict = true MainWelcome(flagAliases) s, err := os.Stat(flags.DataDir) if err != nil { if os.IsNotExist(err) { if flags.DataDir == DEFAULT_DATA_DIR { log.Printf("main: creating data directory, dataDir: %s", flags.DataDir) err = os.Mkdir(flags.DataDir, 0700) if err != nil { log.Fatalf("main: could not create data directory,"+ " dataDir: %s, err: %v", flags.DataDir, err) } } else { log.Fatalf("main: data directory does not exist,"+ " dataDir: %s", flags.DataDir) return } } else { log.Fatalf("main: could not access data directory,"+ " dataDir: %s, err: %v", flags.DataDir, err) return } } else { if !s.IsDir() { log.Fatalf("main: not a directory, dataDir: %s", flags.DataDir) return } } cbft.SetAuthType(flags.AuthType) wd, err := os.Getwd() if err != nil { log.Fatalf("main: os.Getwd, err: %#v", err) return } log.Printf("main: curr dir: %q", wd) dataDirAbs, err := filepath.Abs(flags.DataDir) if err != nil { log.Fatalf("main: filepath.Abs, err: %#v", err) return } log.Printf("main: data dir: %q", dataDirAbs) // User may supply a comma-separated list of HOST:PORT values for // http addresss/port listening, but only the first entry is used // for cbgt node and Cfg registration. bindHttps := strings.Split(flags.BindHttp, ",") // If cfg is down, we error, leaving it to some user-supplied // outside watchdog to backoff and restart/retry. cfg, err := cmd.MainCfg(cmdName, flags.CfgConnect, bindHttps[0], flags.Register, flags.DataDir) if err != nil { if err == cmd.ErrorBindHttp { log.Fatalf("%v", err) return } log.Fatalf("main: could not start cfg, cfgConnect: %s, err: %v\n"+ " Please check that your -cfg/-cfgConnect parameter (%q)\n"+ " is correct and/or that your configuration provider\n"+ " is available.", flags.CfgConnect, err, flags.CfgConnect) return } uuid := flags.UUID if uuid != "" { uuidPath := flags.DataDir + string(os.PathSeparator) + cmdName + ".uuid" err = ioutil.WriteFile(uuidPath, []byte(uuid), 0600) if err != nil { log.Fatalf("main: could not write uuidPath: %s\n"+ " Please check that your -data/-dataDir parameter (%q)\n"+ " is to a writable directory where %s can persist data.", uuidPath, flags.DataDir, cmdName) return } } if uuid == "" { uuid, err = cmd.MainUUID(cmdName, flags.DataDir) if err != nil { log.Fatalf(fmt.Sprintf("%v", err)) return } } var tagsArr []string if flags.Tags != "" { tagsArr = strings.Split(flags.Tags, ",") } router, err := MainStart(cfg, uuid, tagsArr, flags.Container, flags.Weight, flags.Extras, bindHttps[0], flags.DataDir, flags.StaticDir, flags.StaticETag, flags.Server, flags.Register, mr, flags.Options) if err != nil { log.Fatal(err) } if flags.Register == "unknown" { log.Printf("main: unregistered node; now exiting") os.Exit(0) } http.Handle("/", router) anyHostPorts := map[string]bool{} // Bind to 0.0.0.0's first. for _, bindHttp := range bindHttps { if strings.HasPrefix(bindHttp, "0.0.0.0:") { go MainServeHttp(bindHttp, nil) anyHostPorts[bindHttp] = true } } for i := len(bindHttps) - 1; i >= 1; i-- { go MainServeHttp(bindHttps[i], anyHostPorts) } MainServeHttp(bindHttps[0], anyHostPorts) <-(make(chan struct{})) // Block forever. }
func main() { platform.HideConsole(true) defer platform.HideConsole(false) flag.Parse() if flags.Help { flag.Usage() os.Exit(2) } if flags.Version { fmt.Printf("%s main: %s, data: %s\n", path.Base(os.Args[0]), VERSION, cbgt.VERSION) os.Exit(0) } if os.Getenv("GOMAXPROCS") == "" { runtime.GOMAXPROCS(runtime.NumCPU()) } mr, err := cbgt.NewMsgRing(os.Stderr, 1000) if err != nil { log.Fatalf("main: could not create MsgRing, err: %v", err) } log.SetOutput(mr) log.SetLoggerCallback(LoggerFunc) log.Printf("main: %s started (%s/%s)", os.Args[0], VERSION, cbgt.VERSION) rand.Seed(time.Now().UTC().UnixNano()) // disabling as speculative change for // https://issues.couchbase.com/browse/MB-20002 // theory being that invoking signal.Notify() // interferes with forestdb signal handler // go cmd.DumpOnSignalForPlatform() MainWelcome(flagAliases) s, err := os.Stat(flags.DataDir) if err != nil { if os.IsNotExist(err) { if flags.DataDir == DEFAULT_DATA_DIR { log.Printf("main: creating data directory, dataDir: %s", flags.DataDir) err = os.Mkdir(flags.DataDir, 0700) if err != nil { log.Fatalf("main: could not create data directory,"+ " dataDir: %s, err: %v", flags.DataDir, err) } } else { log.Fatalf("main: data directory does not exist,"+ " dataDir: %s", flags.DataDir) return } } else { log.Fatalf("main: could not access data directory,"+ " dataDir: %s, err: %v", flags.DataDir, err) return } } else { if !s.IsDir() { log.Fatalf("main: not a directory, dataDir: %s", flags.DataDir) return } } wd, err := os.Getwd() if err != nil { log.Fatalf("main: os.Getwd, err: %#v", err) return } log.Printf("main: curr dir: %q", wd) dataDirAbs, err := filepath.Abs(flags.DataDir) if err != nil { log.Fatalf("main: filepath.Abs, err: %#v", err) return } log.Printf("main: data dir: %q", dataDirAbs) uuid := flags.UUID if uuid != "" { uuidPath := flags.DataDir + string(os.PathSeparator) + cmdName + ".uuid" err = ioutil.WriteFile(uuidPath, []byte(uuid), 0600) if err != nil { log.Fatalf("main: could not write uuidPath: %s\n"+ " Please check that your -data/-dataDir parameter (%q)\n"+ " is to a writable directory where %s can persist data.", uuidPath, flags.DataDir, cmdName) return } } if uuid == "" { uuid, err = cmd.MainUUID(cmdName, flags.DataDir) if err != nil { log.Fatalf("%v", err) return } } options := cmd.ParseOptions(flags.Options, "CBFT_ENV_OPTIONS", map[string]string{ "managerLoadDataDir": "async", "authType": flags.AuthType, }) err = InitHttpOptions(options) if err != nil { log.Fatalf("main: InitHttpOptions, err: %v", err) return } // User may supply a comma-separated list of HOST:PORT values for // http addresss/port listening, but only the first http entry // is used for cbgt node and Cfg registration. bindHttpList := strings.Split(flags.BindHttp, ",") // If cfg is down, we error, leaving it to some user-supplied // outside watchdog to backoff and restart/retry. cfg, err := cmd.MainCfgEx(cmdName, flags.CfgConnect, bindHttpList[0], flags.Register, flags.DataDir, uuid, options) if err != nil { if err == cmd.ErrorBindHttp { log.Fatalf("%v", err) return } log.Fatalf("main: could not start cfg, cfgConnect: %s, err: %v\n"+ " Please check that your -cfg/-cfgConnect parameter (%q)\n"+ " is correct and/or that your configuration provider\n"+ " is available.", flags.CfgConnect, err, flags.CfgConnect) return } var tagsArr []string if flags.Tags != "" { tagsArr = strings.Split(flags.Tags, ",") } router, err := MainStart(cfg, uuid, tagsArr, flags.Container, flags.Weight, flags.Extras, bindHttpList[0], flags.DataDir, flags.StaticDir, flags.StaticETag, flags.Server, flags.Register, mr, options) if err != nil { log.Fatal(err) } if flags.Register == "unknown" { log.Printf("main: unregistered node; now exiting") os.Exit(0) } http.Handle("/", router) anyHostPorts := map[string]bool{} // Bind to 0.0.0.0's first for http listening. for _, bindHttp := range bindHttpList { if strings.HasPrefix(bindHttp, "0.0.0.0:") { go MainServeHttp("http", bindHttp, nil, "", "") anyHostPorts[bindHttp] = true } } for i := len(bindHttpList) - 1; i >= 1; i-- { go MainServeHttp("http", bindHttpList[i], anyHostPorts, "", "") } if flags.BindHttps != "" { bindHttpsList := strings.Split(flags.BindHttps, ",") // Bind to 0.0.0.0's first for https listening. for _, bindHttps := range bindHttpsList { if strings.HasPrefix(bindHttps, "0.0.0.0:") { go MainServeHttp("https", bindHttps, nil, flags.TlsCertFile, flags.TlsKeyFile) anyHostPorts[bindHttps] = true } } for _, bindHttps := range bindHttpsList { go MainServeHttp("https", bindHttps, anyHostPorts, flags.TlsCertFile, flags.TlsKeyFile) } } MainServeHttp("http", bindHttpList[0], anyHostPorts, "", "") <-(make(chan struct{})) // Block forever. }