From 82c6e1bb15d2790087ca7f8119b1692af85ce794 Mon Sep 17 00:00:00 2001 From: "zero@thinky" Date: Sat, 4 Apr 2026 01:03:15 +0300 Subject: [PATCH] feat(agent): add client for commander server --- agent/internal/client/commander.go | 79 ++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 agent/internal/client/commander.go diff --git a/agent/internal/client/commander.go b/agent/internal/client/commander.go new file mode 100644 index 0000000..681755d --- /dev/null +++ b/agent/internal/client/commander.go @@ -0,0 +1,79 @@ +package client + +import ( + "context" + "errors" + "fmt" + "io" + "log" + "sync" + + "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/agent/internal/commander" + "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/proto/proto" + "golang.org/x/sync/errgroup" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +type CommanderClient struct { + cmder *commander.Commander + wg *sync.WaitGroup +} + +func New( + cmder *commander.Commander, + wg *sync.WaitGroup, +) CommanderClient { + return CommanderClient{cmder, wg} +} +func (self *CommanderClient) HandleCommands(ctx context.Context, srvAddr string, tc credentials.TransportCredentials) error { + cli, err := grpc.NewClient(srvAddr, grpc.WithTransportCredentials(tc)) + if err != nil { + return fmt.Errorf("Failed to connect to gRPC: %w", err) + } + ccli := proto.NewCommanderClient(cli) + bidi, err := ccli.Stream(ctx) + if err != nil { + return err + } + wg := new(errgroup.Group) + wg.Go(self.recv(bidi)) + // wg.Go(self.send(bidi)) + err = wg.Wait() + self.wg.Wait() + return err +} + +func (self *CommanderClient) recv(bidi grpc.BidiStreamingClient[proto.FinishedCommand, proto.Command]) func() error { + return func() error { + for { + msg, err := bidi.Recv() + if err != nil { + if errors.Is(err, io.EOF) { + return nil + } + return err + } + self.wg.Go(func() { + func() error { + + fc, err := self.cmder.Execute(msg) + if err != nil { + return err + } + return bidi.Send(fc) + }() + if err != nil { + log.Println(err) + } + }) + + } + } +} + +// func (self *God) send(bidi grpc.BidiStreamingClient[proto.FinishedCommand, proto.Command]) func() error { +// return func() error { +// return nil +// } +// }