Files
lpra/internal/agent/task.go
T
2026-10-13 00:25:29 +03:00

98 lines
2.2 KiB
Go

package agent
import (
"bytes"
"context"
"encoding/json"
"io"
"net/http"
"github.com/x-grk/longpolling-remote-access/internal/proto"
)
// runTask fetches one task, executes it, and posts the result back.
func (a *Agent) runTask(ctx context.Context, taskID string) {
env, err := a.fetchTask(ctx, taskID)
if err != nil {
return
}
var res proto.TaskResult
if env.Type == proto.TaskSysUpdate {
res = a.doUpdate()
} else {
res = a.execTask(env)
}
a.postResult(ctx, taskID, res)
}
func (a *Agent) fetchTask(ctx context.Context, taskID string) (proto.TaskEnvelope, error) {
var env proto.TaskEnvelope
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, a.cfg.Host+"/api/agent/task/"+taskID, nil)
a.authHeaders(req)
resp, err := a.http.Do(req)
if err != nil {
return env, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return env, errStatus(resp.StatusCode)
}
err = json.NewDecoder(resp.Body).Decode(&env)
return env, err
}
func (a *Agent) postResult(ctx context.Context, taskID string, res proto.TaskResult) {
body, _ := json.Marshal(res)
req, _ := http.NewRequestWithContext(ctx, http.MethodPost, a.cfg.Host+"/api/agent/task/"+taskID+"/result", bytes.NewReader(body))
a.authHeaders(req)
req.Header.Set("Content-Type", "application/json")
resp, err := a.http.Do(req)
if err != nil {
return
}
io.Copy(io.Discard, resp.Body)
resp.Body.Close()
}
// execTask runs a single file-manager operation natively and returns a result.
func (a *Agent) execTask(env proto.TaskEnvelope) proto.TaskResult {
data, err := dispatchFS(env)
if err != nil {
return proto.TaskResult{Error: err.Error()}
}
raw, err := json.Marshal(data)
if err != nil {
return proto.TaskResult{Error: err.Error()}
}
return proto.TaskResult{OK: true, Data: raw}
}
type statusErr int
func (e statusErr) Error() string { return "server status " + itoa(int(e)) }
func errStatus(code int) error { return statusErr(code) }
func itoa(n int) string { return itoa64(int64(n)) }
func itoa64(n int64) string {
if n == 0 {
return "0"
}
neg := n < 0
if neg {
n = -n
}
var b [24]byte
i := len(b)
for n > 0 {
i--
b[i] = byte('0' + n%10)
n /= 10
}
if neg {
i--
b[i] = '-'
}
return string(b[i:])
}