From eb193b1b95dd69379aab361f4bfb6e7688a03b3e Mon Sep 17 00:00:00 2001 From: "zero@thinky" Date: Fri, 3 Apr 2026 23:35:04 +0300 Subject: [PATCH] feat(agent): init; add commander --- agent/internal/commander/impl.go | 65 ++++++++++++++++++++++++++++++++ agent/main.go | 1 + 2 files changed, 66 insertions(+) create mode 100644 agent/internal/commander/impl.go create mode 100644 agent/main.go diff --git a/agent/internal/commander/impl.go b/agent/internal/commander/impl.go new file mode 100644 index 0000000..22a4a44 --- /dev/null +++ b/agent/internal/commander/impl.go @@ -0,0 +1,65 @@ +package commander + +import ( + "bytes" + "errors" + "io" + "os/exec" + + "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/proto" + "golang.org/x/sync/errgroup" +) + +type Commander struct { +} + +func (*Commander) Execute(command *proto.Command) (*proto.FinishedCommand, error) { + cmd := exec.Command(command.Command[0], command.Command[1:]...) + var ( + stdin io.WriteCloser + err error + ) + if command.Stdin != nil { + stdin, err = cmd.StdinPipe() + if err != nil { + return nil, err + } + } + stdout, err1 := cmd.StdoutPipe() + stderr, err2 := cmd.StderrPipe() + if err := errors.Join(err1, err2); err != nil { + return nil, err + } + if err := cmd.Start(); err != nil { + return nil, err + } + if command.Stdin != nil { + io.WriteString(stdin, *command.Stdin) + if err := stdin.Close(); err != nil { + return nil, err + } + } + eg := new(errgroup.Group) + stdoutbuf := new(bytes.Buffer) + stderrbuf := new(bytes.Buffer) + eg.Go(func() error { + _, err := io.Copy(stdoutbuf, stdout) + return err + }) + eg.Go(func() error { + _, err := io.Copy(stderrbuf, stderr) + return err + }) + if err := cmd.Wait(); err != nil { + return nil, err + } + if err := eg.Wait(); err != nil { + return nil, err + } + return &proto.FinishedCommand{ + Id: command.Id, + Status: int32(cmd.ProcessState.ExitCode()), + Stdout: stdoutbuf.String(), + Stderr: stderrbuf.String(), + }, nil +} diff --git a/agent/main.go b/agent/main.go new file mode 100644 index 0000000..06ab7d0 --- /dev/null +++ b/agent/main.go @@ -0,0 +1 @@ +package main