From a6debf8adf54a29f4461978ce3d10341e228956b Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 11 Oct 2024 11:38:37 +0200 Subject: [PATCH 1/2] Removed globals in daemon command args parsing --- internal/cli/daemon/daemon.go | 18 ++++++++---------- internal/cli/daemon/interceptors.go | 1 + 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/internal/cli/daemon/daemon.go b/internal/cli/daemon/daemon.go index 839738b8999..285b61357b6 100644 --- a/internal/cli/daemon/daemon.go +++ b/internal/cli/daemon/daemon.go @@ -34,15 +34,12 @@ import ( "google.golang.org/grpc" ) -var ( - daemonize bool - debug bool - debugFile string - debugFilters []string -) - // NewCommand created a new `daemon` command func NewCommand(srv rpc.ArduinoCoreServiceServer, settings *rpc.Configuration) *cobra.Command { + var daemonize bool + var debug bool + var debugFile string + var debugFiltersArg []string var daemonPort string daemonCommand := &cobra.Command{ Use: "daemon", @@ -65,7 +62,7 @@ func NewCommand(srv rpc.ArduinoCoreServiceServer, settings *rpc.Configuration) * } }, Run: func(cmd *cobra.Command, args []string) { - runDaemonCommand(srv, daemonPort) + runDaemonCommand(srv, daemonPort, debugFile, debug, daemonize, debugFiltersArg) }, } defaultDaemonPort := settings.GetDaemon().GetPort() @@ -82,13 +79,13 @@ func NewCommand(srv rpc.ArduinoCoreServiceServer, settings *rpc.Configuration) * daemonCommand.Flags().StringVar(&debugFile, "debug-file", "", i18n.Tr("Append debug logging to the specified file")) - daemonCommand.Flags().StringSliceVar(&debugFilters, + daemonCommand.Flags().StringSliceVar(&debugFiltersArg, "debug-filter", []string{}, i18n.Tr("Display only the provided gRPC calls")) return daemonCommand } -func runDaemonCommand(srv rpc.ArduinoCoreServiceServer, daemonPort string) { +func runDaemonCommand(srv rpc.ArduinoCoreServiceServer, daemonPort, debugFile string, debug, daemonize bool, debugFiltersArg []string) { logrus.Info("Executing `arduino-cli daemon`") gRPCOptions := []grpc.ServerOption{} @@ -113,6 +110,7 @@ func runDaemonCommand(srv rpc.ArduinoCoreServiceServer, daemonPort string) { debugStdOut = out } } + debugFilters = debugFiltersArg gRPCOptions = append(gRPCOptions, grpc.UnaryInterceptor(unaryLoggerInterceptor), grpc.StreamInterceptor(streamLoggerInterceptor), diff --git a/internal/cli/daemon/interceptors.go b/internal/cli/daemon/interceptors.go index 0da2307b1aa..242d7610609 100644 --- a/internal/cli/daemon/interceptors.go +++ b/internal/cli/daemon/interceptors.go @@ -28,6 +28,7 @@ import ( var debugStdOut io.Writer var debugSeq uint32 +var debugFilters []string func log(isRequest bool, seq uint32, msg interface{}) { prefix := fmt.Sprint(seq, " | ") From 082d2a5eac2b83585c262169568b695c900a7326 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Fri, 11 Oct 2024 11:55:37 +0200 Subject: [PATCH 2/2] Increased gRPC message size limit to 16MB / added CLI flag to set the value --- internal/cli/daemon/daemon.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/internal/cli/daemon/daemon.go b/internal/cli/daemon/daemon.go index 285b61357b6..ea9476a2ec7 100644 --- a/internal/cli/daemon/daemon.go +++ b/internal/cli/daemon/daemon.go @@ -41,6 +41,7 @@ func NewCommand(srv rpc.ArduinoCoreServiceServer, settings *rpc.Configuration) * var debugFile string var debugFiltersArg []string var daemonPort string + var maxGRPCRecvMsgSize int daemonCommand := &cobra.Command{ Use: "daemon", Short: i18n.Tr("Run the Arduino CLI as a gRPC daemon."), @@ -60,9 +61,14 @@ func NewCommand(srv rpc.ArduinoCoreServiceServer, settings *rpc.Configuration) * panic("Failed to set default value for directories.builtin.libraries: " + err.Error()) } } + + // Validate the maxGRPCRecvMsgSize flag + if maxGRPCRecvMsgSize < 1024 { + feedback.Fatal(i18n.Tr("%s must be >= 1024", "--max-grpc-recv-message-size"), feedback.ErrBadArgument) + } }, Run: func(cmd *cobra.Command, args []string) { - runDaemonCommand(srv, daemonPort, debugFile, debug, daemonize, debugFiltersArg) + runDaemonCommand(srv, daemonPort, debugFile, debug, daemonize, debugFiltersArg, maxGRPCRecvMsgSize) }, } defaultDaemonPort := settings.GetDaemon().GetPort() @@ -82,10 +88,13 @@ func NewCommand(srv rpc.ArduinoCoreServiceServer, settings *rpc.Configuration) * daemonCommand.Flags().StringSliceVar(&debugFiltersArg, "debug-filter", []string{}, i18n.Tr("Display only the provided gRPC calls")) + daemonCommand.Flags().IntVar(&maxGRPCRecvMsgSize, + "max-grpc-recv-message-size", 16*1024*1024, + i18n.Tr("Sets the maximum message size in bytes the daemon can receive")) return daemonCommand } -func runDaemonCommand(srv rpc.ArduinoCoreServiceServer, daemonPort, debugFile string, debug, daemonize bool, debugFiltersArg []string) { +func runDaemonCommand(srv rpc.ArduinoCoreServiceServer, daemonPort, debugFile string, debug, daemonize bool, debugFiltersArg []string, maxGRPCRecvMsgSize int) { logrus.Info("Executing `arduino-cli daemon`") gRPCOptions := []grpc.ServerOption{} @@ -116,6 +125,7 @@ func runDaemonCommand(srv rpc.ArduinoCoreServiceServer, daemonPort, debugFile st grpc.StreamInterceptor(streamLoggerInterceptor), ) } + gRPCOptions = append(gRPCOptions, grpc.MaxRecvMsgSize(maxGRPCRecvMsgSize)) s := grpc.NewServer(gRPCOptions...) // register the commands service