diff --git a/internal/app/base/base.go b/internal/app/base/base.go index f9e86a79..f1427f49 100644 --- a/internal/app/base/base.go +++ b/internal/app/base/base.go @@ -69,12 +69,13 @@ const ( flagMemProfileShort = "m" flagLogLevel = "log-level" flagLogLevelShort = "l" - // FlagCLI indicate to start with command line interface. - FlagCLI = "cli" - flagCLIShort = "c" - flagRestart = "restart" - FlagLauncher = "launcher" - FlagNoWindow = "no-window" + FlagGRPC = "grpc" // FlagGRPC starts the gRPC frontend + FlagGRPCShort = "g" + FlagCLI = "cli" // FlagCLI indicate to start with command line interface. + flagCLIShort = "c" + flagRestart = "restart" + FlagLauncher = "launcher" + FlagNoWindow = "no-window" ) type Base struct { @@ -299,6 +300,11 @@ func (b *Base) NewApp(mainLoop func(*Base, *cli.Context) error) *cli.App { Aliases: []string{flagLogLevelShort}, Usage: "Set the log level (one of panic, fatal, error, warn, info, debug)", }, + &cli.BoolFlag{ + Name: FlagGRPC, + Aliases: []string{FlagGRPCShort}, + Usage: "Start the gRPC service", + }, &cli.BoolFlag{ Name: FlagCLI, Aliases: []string{flagCLIShort}, diff --git a/internal/app/bridge/bridge.go b/internal/app/bridge/bridge.go index 0f58d5bf..38984d4a 100644 --- a/internal/app/bridge/bridge.go +++ b/internal/app/bridge/bridge.go @@ -40,10 +40,10 @@ import ( ) const ( - flagLogIMAP = "log-imap" - flagLogSMTP = "log-smtp" - flagNonInteractive = "noninteractive" - + flagLogIMAP = "log-imap" + flagLogSMTP = "log-smtp" + flagNonInteractive = "noninteractive" + flagNonInteractiveShort = "n" // Memory cache was estimated by empirical usage in the past, and it was set to 100MB. // NOTE: This value must not be less than maximal size of one email (~30MB). inMemoryCacheLimit = 100 * (1 << 20) @@ -62,8 +62,9 @@ func New(base *base.Base) *cli.App { Usage: "Enable logging of SMTP communications (may contain decrypted data!)", }, &cli.BoolFlag{ - Name: flagNonInteractive, - Usage: "Start Bridge entirely non-interactively", + Name: flagNonInteractive, + Aliases: []string{flagNonInteractiveShort}, + Usage: "Start Bridge entirely non-interactively", }, }...) @@ -72,6 +73,11 @@ func New(base *base.Base) *cli.App { func main(b *base.Base, c *cli.Context) error { //nolint:funlen frontendType := getFrontendTypeFromCLIParams(c) + if frontendType == frontend.Unknown { + _ = cli.ShowAppHelp(c) + return errors.New("no frontend was specified. Use --grpc, --cli or --noninteractive") + } + f := frontend.New( frontendType, !c.Bool(base.FlagNoWindow), @@ -171,12 +177,14 @@ func main(b *base.Base, c *cli.Context) error { //nolint:funlen func getFrontendTypeFromCLIParams(c *cli.Context) frontend.Type { switch { + case c.Bool(base.FlagGRPC): + return frontend.GRPC case c.Bool(base.FlagCLI): return frontend.CLI case c.Bool(flagNonInteractive): return frontend.NonInteractive default: - return frontend.GRPC + return frontend.Unknown } } diff --git a/internal/frontend/bridge-gui/bridge-gui/main.cpp b/internal/frontend/bridge-gui/bridge-gui/main.cpp index 74add4a7..0e4196dc 100644 --- a/internal/frontend/bridge-gui/bridge-gui/main.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/main.cpp @@ -200,7 +200,7 @@ void launchBridge(QStringList const &args) else app().log().debug(QString("Bridge executable path: %1").arg(QDir::toNativeSeparators(bridgeExePath))); - overseer = std::make_unique(new ProcessMonitor(bridgeExePath, args, nullptr), nullptr); + overseer = std::make_unique(new ProcessMonitor(bridgeExePath, QStringList("--grpc") + args, nullptr), nullptr); overseer->startWorker(true); } diff --git a/internal/frontend/frontend.go b/internal/frontend/frontend.go index b701787f..de370e53 100644 --- a/internal/frontend/frontend.go +++ b/internal/frontend/frontend.go @@ -25,6 +25,7 @@ import ( "github.com/ProtonMail/proton-bridge/v2/internal/locations" "github.com/ProtonMail/proton-bridge/v2/internal/updater" "github.com/ProtonMail/proton-bridge/v2/pkg/listener" + "github.com/sirupsen/logrus" ) // Type describes the available types of frontend. @@ -34,6 +35,7 @@ const ( CLI Type = iota GRPC NonInteractive + Unknown ) type Frontend interface { @@ -45,7 +47,7 @@ type Frontend interface { WaitUntilFrontendIsReady() } -// New returns initialized frontend based on `frontendType`, which can be `CLI` or `GRPC`. +// New returns initialized frontend based on `frontendType`, which can be `CLI` or `GRPC`. Non-interactive will return a nil frontend. func New( frontendType Type, showWindowOnStart bool, @@ -75,9 +77,13 @@ func New( ) case NonInteractive: + return nil + + case Unknown: fallthrough default: - return nil + logrus.Panicf("Unexpected frontend value %v", frontendType) + return nil // return statement is required by compiler, although the above call will panic. } }