feat(backend): use interpreters service for jobs handlers

This commit is contained in:
2026-04-04 16:38:29 +03:00
parent f5b9b32a9f
commit 9ede6257f8
2 changed files with 31 additions and 8 deletions
+9 -1
View File
@@ -94,6 +94,7 @@ func main() {
} }
scriptSvc := service.NewScriptService(scriptRepo) scriptSvc := service.NewScriptService(scriptRepo)
scriptHandlers := handlers.NewScriptHandlers(scriptSvc, cmdr) scriptHandlers := handlers.NewScriptHandlers(scriptSvc, cmdr)
jobsHandlers := handlers.NewJobsHandlers(cmdr, scriptSvc)
agents := handlers.NewAgentsGroup(h, coll) agents := handlers.NewAgentsGroup(h, coll)
auth := handlers.AuthGroup{Handlers: h} auth := handlers.AuthGroup{Handlers: h}
@@ -173,6 +174,13 @@ func main() {
agentsGroup.GET("", agents.List) agentsGroup.GET("", agents.List)
} }
// Jobs (requires admin permission)
jobsGroup := v1.Group("/jobs")
jobsGroup.Use(auth.AuthMiddleware(), handlers.RequireAdmin())
{
jobsGroup.POST("", jobsHandlers.AddJob)
}
// Agent registration // Agent registration
agentRegGroup := v1.Group("/agents") agentRegGroup := v1.Group("/agents")
{ {
@@ -291,4 +299,4 @@ func main() {
if err := g.Wait(); err != nil { if err := g.Wait(); err != nil {
log.Fatalf("Server error: %v", err) log.Fatalf("Server error: %v", err)
} }
} }
+22 -7
View File
@@ -5,23 +5,26 @@ import (
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/grpcsrv/commander" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/grpcsrv/commander"
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/models" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/models"
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/service"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
type JobsHandlers struct { type JobsHandlers struct {
cmder *commander.Commander cmder *commander.Commander
svc *service.ScriptService
} }
func NewJobsHandlers(cmder *commander.Commander) JobsHandlers { func NewJobsHandlers(cmder *commander.Commander, svc *service.ScriptService) JobsHandlers {
return JobsHandlers{cmder} return JobsHandlers{cmder: cmder, svc: svc}
} }
func (self *JobsHandlers) AddJob(c *gin.Context) { func (self *JobsHandlers) AddJob(c *gin.Context) {
err := func() error { err := func() error {
type In struct { type In struct {
Command []string `json:"command"` Command string `json:"command"`
Stdin *string `json:"stdin"` InterpreterID int64 `json:"interpreter_id"`
AID string `json:"agent_id"` Stdin *string `json:"stdin"`
AID string `json:"agent_id"`
} }
var in In var in In
if err := c.Bind(&in); err != nil { if err := c.Bind(&in); err != nil {
@@ -30,10 +33,22 @@ func (self *JobsHandlers) AddJob(c *gin.Context) {
agent, ok := self.cmder.GetAgent(in.AID) agent, ok := self.cmder.GetAgent(in.AID)
if !ok { if !ok {
c.Status(404) c.Status(404)
return fmt.Errorf("Agent not found") 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{ jid, err := agent.AddJob(models.JobForInsert{
Command: in.Command, Command: command,
Stdin: in.Stdin, Stdin: in.Stdin,
}) })
if err != nil { if err != nil {