1
0
mirror of https://github.com/fumiama/terasu-cloudflared.git synced 2026-06-08 03:55:11 +08:00

TUN-3198: Handle errors while running tunnel UI

This commit is contained in:
Rachel Williams
2020-07-29 15:48:27 -07:00
committed by Areg Harutyunyan
parent 8a829b773a
commit 26fc20d406
5 changed files with 120 additions and 15 deletions

View File

@@ -36,6 +36,7 @@ import (
"github.com/cloudflare/cloudflared/tunneldns"
"github.com/cloudflare/cloudflared/tunnelstore"
"github.com/cloudflare/cloudflared/websocket"
"github.com/rivo/tview"
"github.com/coreos/go-systemd/daemon"
"github.com/facebookgo/grace/gracenet"
@@ -215,11 +216,23 @@ func TunnelCommand(c *cli.Context) error {
if name := c.String("name"); name != "" {
return adhocNamedTunnel(c, name)
}
if c.IsSet("launch-ui") {
// Create textView to stream logs to
logTextView := ui.NewDynamicColorTextView()
logger, err := createLoggerConfigured(c, false, logTextView)
if err != nil {
return errors.Wrap(err, "error setting up logger")
}
return StartServer(c, version, shutdownC, graceShutdownC, nil, logger, logTextView)
}
logger, err := createLogger(c, false)
if err != nil {
return errors.Wrap(err, "error setting up logger")
}
return StartServer(c, version, shutdownC, graceShutdownC, nil, logger)
return StartServer(c, version, shutdownC, graceShutdownC, nil, logger, nil)
}
func Init(v string, s, g chan struct{}) {
@@ -268,7 +281,7 @@ func routeFromFlag(c *cli.Context, tunnelID uuid.UUID) (tunnelstore.Route, bool)
return nil, false
}
func createLogger(c *cli.Context, isTransport bool) (logger.Service, error) {
func createLogger(c *cli.Context, isTransport bool) (*logger.OutputWriter, error) {
loggerOpts := []logger.Option{}
logPath := c.String("logfile")
@@ -297,7 +310,26 @@ func createLogger(c *cli.Context, isTransport bool) (logger.Service, error) {
return logger.New(loggerOpts...)
}
func StartServer(c *cli.Context, version string, shutdownC, graceShutdownC chan struct{}, namedTunnel *origin.NamedTunnelConfig, logger logger.Service) error {
// Create logger configured for use in UI
func createLoggerConfigured(c *cli.Context, isTransport bool, logTextView *tview.TextView) (logger.Service, error) {
l, err := createLogger(c, isTransport)
if err != nil {
return nil, errors.Wrap(err, "Error creating logger")
}
logLevel := c.String("loglevel")
supportedLevels, err := logger.GetSupportedLevels(logLevel)
if err != nil {
return nil, errors.Wrap(err, "Error parsing supported levels")
}
// Add TextView as a group to write output to
l.Add(logTextView, logger.NewUIFormatter(time.RFC3339), supportedLevels...)
return l, nil
}
func StartServer(c *cli.Context, version string, shutdownC, graceShutdownC chan struct{}, namedTunnel *origin.NamedTunnelConfig, logger logger.Service, logTextView *tview.TextView) error {
_ = raven.SetDSN(sentryDSN)
var wg sync.WaitGroup
listeners := gracenet.Net{}
@@ -537,7 +569,7 @@ func StartServer(c *cli.Context, version string, shutdownC, graceShutdownC chan
tunnelConfig.TunnelEventChan = tunnelEventChan
tunnelInfo := ui.NewUIModel(version, hostname, metricsListener.Addr().String(), tunnelConfig.OriginUrl, tunnelConfig.HAConnections)
tunnelInfo.LaunchUI(ctx, logger, tunnelEventChan)
tunnelInfo.LaunchUI(ctx, logger, tunnelEventChan, logTextView)
}
return waitToShutdown(&wg, errC, shutdownC, graceShutdownC, c.Duration("grace-period"), logger)
@@ -1138,7 +1170,7 @@ func tunnelFlags(shouldHide bool) []cli.Flag {
}),
altsrc.NewBoolFlag(&cli.BoolFlag{
Name: "launch-ui",
Usage: "Launch tunnel UI and disable logs",
Usage: "Launch tunnel UI. Tunnel logs are scrollable via 'j', 'k', or arrow keys.",
Value: false,
Hidden: shouldHide,
}),

View File

@@ -10,20 +10,23 @@ import (
"github.com/cloudflare/cloudflared/certutil"
"github.com/cloudflare/cloudflared/cmd/cloudflared/config"
"github.com/cloudflare/cloudflared/cmd/cloudflared/ui"
"github.com/cloudflare/cloudflared/logger"
"github.com/cloudflare/cloudflared/origin"
"github.com/cloudflare/cloudflared/tunnelrpc/pogs"
"github.com/cloudflare/cloudflared/tunnelstore"
"github.com/google/uuid"
"github.com/pkg/errors"
"github.com/rivo/tview"
"github.com/urfave/cli/v2"
)
// subcommandContext carries structs shared between subcommands, to reduce number of arguments needed to pass between subcommands,
// and make sure they are only initialized once
type subcommandContext struct {
c *cli.Context
logger logger.Service
c *cli.Context
logger logger.Service
uiTextView *tview.TextView
// These fields should be accessed using their respective Getter
tunnelstoreClient tunnelstore.Client
@@ -31,6 +34,20 @@ type subcommandContext struct {
}
func newSubcommandContext(c *cli.Context) (*subcommandContext, error) {
if c.IsSet("launch-ui") {
// Create textView to stream logs to
logTextView := ui.NewDynamicColorTextView()
logger, err := createLoggerConfigured(c, false, logTextView)
if err != nil {
return nil, errors.Wrap(err, "error setting up logger")
}
return &subcommandContext{
c: c,
logger: logger,
uiTextView: logTextView,
}, nil
}
logger, err := createLogger(c, false)
if err != nil {
return nil, errors.Wrap(err, "error setting up logger")
@@ -237,7 +254,8 @@ func (sc *subcommandContext) run(tunnelID uuid.UUID) error {
if err != nil {
return err
}
return StartServer(sc.c, version, shutdownC, graceShutdownC, &origin.NamedTunnelConfig{Auth: *credentials, ID: tunnelID}, sc.logger)
return StartServer(sc.c, version, shutdownC, graceShutdownC, &origin.NamedTunnelConfig{Auth: *credentials, ID: tunnelID}, sc.logger, sc.uiTextView)
}
func (sc *subcommandContext) cleanupConnections(tunnelIDs []uuid.UUID) error {