package handlers import ( "fmt" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/grpcsrv/commander" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/models" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/service" "github.com/gin-gonic/gin" ) type JobsHandlers struct { cmder *commander.Commander svc *service.ScriptService } func NewJobsHandlers(cmder *commander.Commander, svc *service.ScriptService) JobsHandlers { return JobsHandlers{cmder: cmder, svc: svc} } func (self *JobsHandlers) AddJob(c *gin.Context) { err := func() error { type In struct { Command string `json:"command"` InterpreterID int64 `json:"interpreter_id"` Stdin *string `json:"stdin"` AID string `json:"agent_id"` } var in In if err := c.Bind(&in); err != nil { return err } agent, ok := self.cmder.GetAgent(in.AID) if !ok { c.Status(404) return fmt.Errorf("agent not found") } var command []string if in.InterpreterID == 0 { command = []string{"sh", "-c", in.Command} } else { var err error command, err = self.svc.ResolveCommand(c.Request.Context(), in.InterpreterID, in.Command) if err != nil { return err } } jid, err := agent.AddJob(models.JobForInsert{ Command: command, Stdin: in.Stdin, }) if err != nil { return err } job, err := agent.WaitJob(jid) if err != nil { return err } type Out struct { ID int64 `json:"id"` Command []string `json:"command"` Stdin *string `json:"stdin"` Stdout string `json:"stdout"` Stderr string `json:"stderr"` Status int32 `json:"status"` } c.JSON(201, Out{ ID: job.ID, Command: job.Command, Stdin: job.Stdin, Stdout: job.Stdout, Stderr: job.Stderr, Status: job.Status, }) return nil }() if err != nil { c.Error(err) } }