func doMain() error { if err := logging.Init(); err != nil { return err } // Schedule cleanup actions handleSignals() addExitFunc(func() { if err := logging.Close(); err != nil { log.Debugf("Error closing log: %v", err) } }) addExitFunc(quitSystray) i18nInit() if showui { if err := configureSystemTray(); err != nil { return err } } displayVersion() parseFlags() cfg, err := config.Init(packageVersion) if err != nil { return fmt.Errorf("Unable to initialize configuration: %v", err) } go func() { err := config.Run(func(updated *config.Config) { configUpdates <- updated }) if err != nil { exit(err) } }() if *help || cfg.Addr == "" || (cfg.Role != "server" && cfg.Role != "client") { flag.Usage() return fmt.Errorf("Wrong arguments") } finishProfiling := profiling.Start(cfg.CpuProfile, cfg.MemProfile) defer finishProfiling() // Configure stats initially if err := statreporter.Configure(cfg.Stats); err != nil { return err } log.Debug("Running proxy") if cfg.IsDownstream() { // This will open a proxy on the address and port given by -addr go runClientProxy(cfg) } else { go runServerProxy(cfg) } return waitForExit() }
func main() { numCores := runtime.NumCPU() log.Debugf("Using all %d cores", numCores) runtime.GOMAXPROCS(numCores) parseFlags() finishProfiling := profiling.Start(*cpuprofile, *memprofile) defer finishProfiling() connectToCloudFlare() connectToCloudFront() connectToDnsimple() var err error hosts, err = loadHosts() if err != nil { log.Fatal(err) } startHttp() }
func beforeStart(cfg *config.Config) bool { log.Debug("Got first config") if *help { flag.Usage() exit(fmt.Errorf("Wrong arguments")) return false } if cfg.CpuProfile != "" || cfg.MemProfile != "" { log.Debugf("Start profiling with cpu file %s and mem file %s", cfg.CpuProfile, cfg.MemProfile) finishProfiling := profiling.Start(cfg.CpuProfile, cfg.MemProfile) addExitFunc(finishProfiling) } if err := setUpPacTool(); err != nil { exit(err) } if *clearProxySettings { // This is a workaround that attempts to fix a Windows-only problem where // Lantern was unable to clean the system's proxy settings before logging // off. // // See: https://github.com/getlantern/lantern/issues/2776 log.Debug("Clearing proxy settings") doPACOff(fmt.Sprintf("http://%s/proxy_on.pac", *uiaddr)) exit(nil) } bootstrap, err := config.ReadBootstrapSettings() var startupUrl string if err != nil { log.Errorf("Could not read settings? %v", err) startupUrl = "" } else { startupUrl = bootstrap.StartupUrl } log.Debugf("Starting client UI at %v", *uiaddr) actualUIAddr, err := ui.Start(*uiaddr, !showui, startupUrl) if err != nil { // This very likely means Lantern is already running on our port. Tell // it to open a browser. This is useful, for example, when the user // clicks the Lantern desktop shortcut when Lantern is already running. err2 := showExistingUi(*uiaddr) if err2 != nil { exit(fmt.Errorf("Unable to start UI: %s", err)) } else { log.Debug("Lantern already running, showing existing UI") exit(nil) } return false } client.UIAddr = actualUIAddr // Only run analytics once on startup. if settings.IsAutoReport() { stopAnalytics := analytics.Start(cfg, flashlight.Version) addExitFunc(stopAnalytics) } watchDirectAddrs() return true }
func ExampleStart() { finishProfiling := profiling.Start("cpu.prof", "mem.prof") defer finishProfiling() }