From 5fcba2dc623bc5b1c4d2df32be226870147610c2 Mon Sep 17 00:00:00 2001 From: Michael Quigley Date: Fri, 25 Aug 2023 13:26:54 -0400 Subject: [PATCH] redirect caddy logging to the non-headless tui when appropriate (#392) --- cmd/zrok/sharePrivate.go | 8 ++- cmd/zrok/sharePublic.go | 6 ++- cmd/zrok/shareReserved.go | 22 ++++---- cmd/zrok/shareTui.go | 4 ++ endpoints/proxy/caddyLogger.go | 52 +++++++++++++++++++ ...Requests.go => caddyRequestsMiddleware.go} | 0 endpoints/proxy/caddyWebBackend.go | 5 ++ 7 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 endpoints/proxy/caddyLogger.go rename endpoints/proxy/{caddyRequests.go => caddyRequestsMiddleware.go} (100%) diff --git a/cmd/zrok/sharePrivate.go b/cmd/zrok/sharePrivate.go index 601080f8..bb37a7c1 100644 --- a/cmd/zrok/sharePrivate.go +++ b/cmd/zrok/sharePrivate.go @@ -135,6 +135,12 @@ func (cmd *sharePrivateCommand) run(_ *cobra.Command, args []string) { panic(err) } + shareDescription := fmt.Sprintf("access your share with: %v", tui.Code.Render(fmt.Sprintf("zrok access private %v", resp.Payload.ShrToken))) + mdl := newShareModel(resp.Payload.ShrToken, []string{shareDescription}, sdk.PrivateShareMode, sdk.BackendMode(cmd.backendMode)) + if !cmd.headless { + proxy.SetCaddyLoggingWriter(mdl) + } + c := make(chan os.Signal) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { @@ -230,8 +236,6 @@ func (cmd *sharePrivateCommand) run(_ *cobra.Command, args []string) { } } else { - shareDescription := fmt.Sprintf("access your share with: %v", tui.Code.Render(fmt.Sprintf("zrok access private %v", resp.Payload.ShrToken))) - mdl := newShareModel(resp.Payload.ShrToken, []string{shareDescription}, sdk.PrivateShareMode, sdk.BackendMode(cmd.backendMode)) logrus.SetOutput(mdl) prg := tea.NewProgram(mdl, tea.WithAltScreen()) mdl.prg = prg diff --git a/cmd/zrok/sharePublic.go b/cmd/zrok/sharePublic.go index 2eb2867a..35e35c1c 100644 --- a/cmd/zrok/sharePublic.go +++ b/cmd/zrok/sharePublic.go @@ -130,6 +130,11 @@ func (cmd *sharePublicCommand) run(_ *cobra.Command, args []string) { panic(err) } + mdl := newShareModel(resp.Payload.ShrToken, resp.Payload.FrontendProxyEndpoints, sdk.PublicShareMode, sdk.BackendMode(cmd.backendMode)) + if !cmd.headless { + proxy.SetCaddyLoggingWriter(mdl) + } + c := make(chan os.Signal) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { @@ -185,7 +190,6 @@ func (cmd *sharePublicCommand) run(_ *cobra.Command, args []string) { } } else { - mdl := newShareModel(resp.Payload.ShrToken, resp.Payload.FrontendProxyEndpoints, sdk.PublicShareMode, sdk.BackendMode(cmd.backendMode)) logrus.SetOutput(mdl) prg := tea.NewProgram(mdl, tea.WithAltScreen()) mdl.prg = prg diff --git a/cmd/zrok/shareReserved.go b/cmd/zrok/shareReserved.go index 33382741..5059b872 100644 --- a/cmd/zrok/shareReserved.go +++ b/cmd/zrok/shareReserved.go @@ -106,6 +106,19 @@ func (cmd *shareReservedCommand) run(_ *cobra.Command, args []string) { logrus.Infof("using existing backend proxy endpoint: %v", target) } + var shareDescription string + switch resp.Payload.ShareMode { + case string(sdk.PublicShareMode): + shareDescription = resp.Payload.FrontendEndpoint + case string(sdk.PrivateShareMode): + shareDescription = fmt.Sprintf("access your share with: %v", tui.Code.Render(fmt.Sprintf("zrok access private %v", shrToken))) + } + + mdl := newShareModel(shrToken, []string{shareDescription}, sdk.ShareMode(resp.Payload.ShareMode), sdk.BackendMode(resp.Payload.BackendMode)) + if !cmd.headless { + proxy.SetCaddyLoggingWriter(mdl) + } + requestsChan := make(chan *endpoints.Request, 1024) switch resp.Payload.BackendMode { case "proxy": @@ -158,15 +171,6 @@ func (cmd *shareReservedCommand) run(_ *cobra.Command, args []string) { } } } else { - var shareDescription string - switch resp.Payload.ShareMode { - case string(sdk.PublicShareMode): - shareDescription = resp.Payload.FrontendEndpoint - case string(sdk.PrivateShareMode): - shareDescription = fmt.Sprintf("access your share with: %v", tui.Code.Render(fmt.Sprintf("zrok access private %v", shrToken))) - } - - mdl := newShareModel(shrToken, []string{shareDescription}, sdk.ShareMode(resp.Payload.ShareMode), sdk.BackendMode(resp.Payload.BackendMode)) logrus.SetOutput(mdl) prg := tea.NewProgram(mdl, tea.WithAltScreen()) mdl.prg = prg diff --git a/cmd/zrok/shareTui.go b/cmd/zrok/shareTui.go index 1b709fd5..cf1fe42b 100644 --- a/cmd/zrok/shareTui.go +++ b/cmd/zrok/shareTui.go @@ -218,6 +218,10 @@ func (m *shareModel) Write(p []byte) (n int, err error) { return len(p), nil } +func (shareModel) Close() error { + return nil +} + func wrap(lines []string, width int) []string { ret := make([]string, 0) for _, line := range lines { diff --git a/endpoints/proxy/caddyLogger.go b/endpoints/proxy/caddyLogger.go new file mode 100644 index 00000000..ceb6bea0 --- /dev/null +++ b/endpoints/proxy/caddyLogger.go @@ -0,0 +1,52 @@ +package proxy + +import ( + "github.com/caddyserver/caddy/v2" + "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" + "io" +) + +func init() { + caddy.RegisterModule(CaddyLogWriter{}) +} + +func SetCaddyLoggingWriter(w io.WriteCloser) { + loggingRequests = w +} + +var loggingRequests io.WriteCloser + +type CaddyLogWriter struct{} + +func (CaddyLogWriter) CaddyModule() caddy.ModuleInfo { + return caddy.ModuleInfo{ + ID: "caddy.logging.writers.zrok_tui", + New: func() caddy.Module { return new(CaddyLogWriter) }, + } +} + +func (w *CaddyLogWriter) Provision(_ caddy.Context) error { + return nil +} + +func (CaddyLogWriter) String() string { + return "" +} + +func (CaddyLogWriter) WriterKey() string { + return "zrok_tui" +} + +func (CaddyLogWriter) OpenWriter() (io.WriteCloser, error) { + return loggingRequests, nil +} + +func (*CaddyLogWriter) UnmarshalCaddyfile(_ *caddyfile.Dispenser) error { + return nil +} + +var ( + _ caddy.Provisioner = (*CaddyLogWriter)(nil) + _ caddy.WriterOpener = (*CaddyLogWriter)(nil) + _ caddyfile.Unmarshaler = (*CaddyLogWriter)(nil) +) diff --git a/endpoints/proxy/caddyRequests.go b/endpoints/proxy/caddyRequestsMiddleware.go similarity index 100% rename from endpoints/proxy/caddyRequests.go rename to endpoints/proxy/caddyRequestsMiddleware.go diff --git a/endpoints/proxy/caddyWebBackend.go b/endpoints/proxy/caddyWebBackend.go index 2e52644b..ebae913a 100644 --- a/endpoints/proxy/caddyWebBackend.go +++ b/endpoints/proxy/caddyWebBackend.go @@ -68,6 +68,11 @@ func NewCaddyWebBackend(cfg *CaddyWebBackendConfig) (*CaddyWebBackend, error) { }, }, } + if loggingRequests != nil { + caddyLog := caddyCfg.Logging.Logs["default"] + caddyLog.WriterRaw = caddyconfig.JSONModuleObject(&CaddyLogWriter{}, "output", "zrok_tui", nil) + caddyCfg.Logging.Logs["default"] = caddyLog + } return &CaddyWebBackend{cfg: cfg, caddyCfg: caddyCfg}, nil }