func setupGUI(mainSvc *suture.Supervisor, cfg *config.Wrapper, m *model.Model, apiSub *events.BufferedSubscription, discoverer *discover.CachingMux, relaySvc *relay.Svc, errors, systemLog *logger.Recorder) { guiCfg := cfg.GUI() if !guiCfg.Enabled { return } if guiCfg.Address == "" { return } addr, err := net.ResolveTCPAddr("tcp", guiCfg.Address) if err != nil { l.Fatalf("Cannot start GUI on %q: %v", guiCfg.Address, err) } else { var hostOpen, hostShow string switch { case addr.IP == nil: hostOpen = "localhost" hostShow = "0.0.0.0" case addr.IP.IsUnspecified(): hostOpen = "localhost" hostShow = addr.IP.String() default: hostOpen = addr.IP.String() hostShow = hostOpen } var proto = "http" if guiCfg.UseTLS { proto = "https" } urlShow := fmt.Sprintf("%s://%s/", proto, net.JoinHostPort(hostShow, strconv.Itoa(addr.Port))) l.Infoln("Starting web GUI on", urlShow) api, err := newAPISvc(myID, cfg, guiAssets, m, apiSub, discoverer, relaySvc, errors, systemLog) if err != nil { l.Fatalln("Cannot start GUI:", err) } cfg.Subscribe(api) mainSvc.Add(api) if cfg.Options().StartBrowser && !noBrowser && !stRestarting { urlOpen := fmt.Sprintf("%s://%s/", proto, net.JoinHostPort(hostOpen, strconv.Itoa(addr.Port))) // Can potentially block if the utility we are invoking doesn't // fork, and just execs, hence keep it in it's own routine. go openURL(urlOpen) } } }
func startAuditing(mainSvc *suture.Supervisor) { auditFile := timestampedLoc(locAuditLog) fd, err := os.OpenFile(auditFile, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600) if err != nil { l.Fatalln("Audit:", err) } auditSvc := newAuditSvc(fd) mainSvc.Add(auditSvc) // We wait for the audit service to fully start before we return, to // ensure we capture all events from the start. auditSvc.WaitForStart() l.Infoln("Audit log in", auditFile) }
func setupGUI(mainSvc *suture.Supervisor, cfg *config.Wrapper, m *model.Model, apiSub *events.BufferedSubscription, discoverer *discover.CachingMux, relaySvc *relay.Svc, errors, systemLog *logger.Recorder) { guiCfg := cfg.GUI() if !guiCfg.Enabled { return } api, err := newAPISvc(myID, cfg, guiAssets, m, apiSub, discoverer, relaySvc, errors, systemLog) if err != nil { l.Fatalln("Cannot start GUI:", err) } cfg.Subscribe(api) mainSvc.Add(api) if cfg.Options().StartBrowser && !noBrowser && !stRestarting { // Can potentially block if the utility we are invoking doesn't // fork, and just execs, hence keep it in it's own routine. go openURL(guiCfg.URL()) } }
func setupGUI(mainService *suture.Supervisor, cfg *config.Wrapper, m *model.Model, apiSub events.BufferedSubscription, discoverer discover.CachingMux, connectionsService *connections.Service, errors, systemLog logger.Recorder, runtimeOptions RuntimeOptions) { guiCfg := cfg.GUI() if !guiCfg.Enabled { return } if guiCfg.InsecureAdminAccess { l.Warnln("Insecure admin access is enabled.") } api := newAPIService(myID, cfg, locations[locHTTPSCertFile], locations[locHTTPSKeyFile], runtimeOptions.assetDir, m, apiSub, discoverer, connectionsService, errors, systemLog) cfg.Subscribe(api) mainService.Add(api) if cfg.Options().StartBrowser && !runtimeOptions.noBrowser && !runtimeOptions.stRestarting { // Can potentially block if the utility we are invoking doesn't // fork, and just execs, hence keep it in it's own routine. go openURL(guiCfg.URL()) } }
func startAuditing(mainService *suture.Supervisor, auditFile string) { var fd io.Writer var err error var auditDest string var auditFlags int if auditFile == "-" { fd = os.Stdout auditDest = "stdout" } else if auditFile == "--" { fd = os.Stderr auditDest = "stderr" } else { if auditFile == "" { auditFile = timestampedLoc(locAuditLog) auditFlags = os.O_WRONLY | os.O_CREATE | os.O_EXCL } else { auditFlags = os.O_WRONLY | os.O_CREATE | os.O_APPEND } fd, err = os.OpenFile(auditFile, auditFlags, 0600) if err != nil { l.Fatalln("Audit:", err) } auditDest = auditFile } auditService := newAuditService(fd) mainService.Add(auditService) // We wait for the audit service to fully start before we return, to // ensure we capture all events from the start. auditService.WaitForStart() l.Infoln("Audit log in", auditDest) }