1 Commits

Author SHA1 Message Date
zero@thinky abc6cb4e46 debug logs 2026-04-04 17:33:36 +03:00
14 changed files with 393 additions and 1686 deletions
+1 -3
View File
@@ -130,7 +130,6 @@ func main() {
} }
router := gin.Default() router := gin.Default()
router.Use(handlers.CorsMiddleware("http://127.0.0.1:5173;http://localhost:5173"))
docs.SwaggerInfo.BasePath = "/api/v1" docs.SwaggerInfo.BasePath = "/api/v1"
docs.SwaggerInfo.Title = "HellreigN" docs.SwaggerInfo.Title = "HellreigN"
docs.SwaggerInfo.Version = "1.0" docs.SwaggerInfo.Version = "1.0"
@@ -144,14 +143,13 @@ func main() {
authGroup := v1.Group("/auth") authGroup := v1.Group("/auth")
{ {
authGroup.POST("/login", auth.Login) authGroup.POST("/login", auth.Login)
authGroup.POST("/register", auth.RegisterUser)
} }
// Auth token management (requires auth) // Auth token management (requires auth)
authTokenGroup := v1.Group("/auth") authTokenGroup := v1.Group("/auth")
authTokenGroup.Use(auth.AuthMiddleware()) authTokenGroup.Use(auth.AuthMiddleware())
{ {
authTokenGroup.POST("/token") authTokenGroup.POST("/token", handlers.RequireAdmin(), auth.CreateToken)
authTokenGroup.GET("/validate", auth.ValidateToken) authTokenGroup.GET("/validate", auth.ValidateToken)
authTokenGroup.GET("/tokens", handlers.RequireAdmin(), auth.ListTokens) authTokenGroup.GET("/tokens", handlers.RequireAdmin(), auth.ListTokens)
authTokenGroup.DELETE("/token", auth.DeleteMyToken) authTokenGroup.DELETE("/token", auth.DeleteMyToken)
+125 -581
View File
@@ -36,7 +36,7 @@ const docTemplate = `{
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/internal_handlers.AgentInfo" "$ref": "#/definitions/handlers.AgentInfo"
} }
} }
} }
@@ -68,7 +68,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployAgentsRequest" "$ref": "#/definitions/repository.DeployAgentsRequest"
} }
} }
], ],
@@ -76,7 +76,7 @@ const docTemplate = `{
"200": { "200": {
"description": "Deployment results with tokens for each server", "description": "Deployment results with tokens for each server",
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResponse" "$ref": "#/definitions/repository.DeployResponse"
} }
}, },
"400": { "400": {
@@ -119,7 +119,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/internal_handlers.RegisterRequest" "$ref": "#/definitions/handlers.RegisterRequest"
} }
} }
], ],
@@ -127,7 +127,7 @@ const docTemplate = `{
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"$ref": "#/definitions/internal_handlers.RegisterResponse" "$ref": "#/definitions/handlers.RegisterResponse"
} }
} }
} }
@@ -157,7 +157,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.RegistrationRequest" "$ref": "#/definitions/repository.RegistrationRequest"
} }
} }
], ],
@@ -191,7 +191,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginRequest" "$ref": "#/definitions/repository.LoginRequest"
} }
} }
], ],
@@ -199,7 +199,7 @@ const docTemplate = `{
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginResponse" "$ref": "#/definitions/repository.LoginResponse"
} }
}, },
"400": { "400": {
@@ -232,67 +232,6 @@ const docTemplate = `{
} }
} }
}, },
"/auth/register": {
"post": {
"description": "Registers a new user with login, password, name, last name. All permissions are set to false.",
"consumes": [
"application/json"
],
"tags": [
"auth"
],
"summary": "Register user",
"parameters": [
{
"description": "Registration data",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.UserRegister"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
},
"400": {
"description": "Bad Request",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
},
"409": {
"description": "Conflict",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}
}
},
"/auth/token": { "/auth/token": {
"post": { "post": {
"description": "Creates a new user with permissions", "description": "Creates a new user with permissions",
@@ -310,7 +249,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenCreate" "$ref": "#/definitions/repository.TokenCreate"
} }
} }
], ],
@@ -406,7 +345,7 @@ const docTemplate = `{
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens" "$ref": "#/definitions/repository.Tokens"
} }
} }
}, },
@@ -492,7 +431,7 @@ const docTemplate = `{
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens" "$ref": "#/definitions/repository.Tokens"
} }
}, },
"400": { "400": {
@@ -547,7 +486,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdate" "$ref": "#/definitions/repository.TokenUpdate"
} }
} }
], ],
@@ -727,7 +666,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenPasswordReset" "$ref": "#/definitions/repository.TokenPasswordReset"
} }
} }
], ],
@@ -795,7 +734,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdatePermissions" "$ref": "#/definitions/repository.TokenUpdatePermissions"
} }
} }
], ],
@@ -855,7 +794,7 @@ const docTemplate = `{
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens" "$ref": "#/definitions/repository.Tokens"
} }
} }
}, },
@@ -885,7 +824,7 @@ const docTemplate = `{
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens" "$ref": "#/definitions/repository.Tokens"
} }
}, },
"401": { "401": {
@@ -900,40 +839,6 @@ const docTemplate = `{
} }
} }
}, },
"/jobs": {
"post": {
"description": "Sends a command to the specified agent, waits for execution, and returns the result",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"jobs"
],
"summary": "Create and run a job on an agent",
"parameters": [
{
"description": "Job request",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/internal_handlers.AddJobIn"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/internal_handlers.AddJobOut"
}
}
}
}
},
"/logs": { "/logs": {
"get": { "get": {
"security": [ "security": [
@@ -1001,7 +906,7 @@ const docTemplate = `{
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry" "$ref": "#/definitions/storage.LogEntry"
} }
} }
} }
@@ -1031,7 +936,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/internal_handlers.InsertLogRequest" "$ref": "#/definitions/handlers.InsertLogRequest"
} }
} }
], ],
@@ -1101,7 +1006,7 @@ const docTemplate = `{
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/internal_handlers.InsertLogsRequest" "$ref": "#/definitions/handlers.InsertLogsRequest"
} }
} }
], ],
@@ -1201,7 +1106,7 @@ const docTemplate = `{
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry" "$ref": "#/definitions/storage.LogEntry"
} }
} }
} }
@@ -1235,188 +1140,96 @@ const docTemplate = `{
} }
} }
} }
},
"/scripts/interpreters": {
"get": {
"description": "Returns all script interpreters available in the system",
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "List interpreters",
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter"
}
}
}
}
},
"post": {
"description": "Registers a new script interpreter with name, label, and argv",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "Create interpreter",
"parameters": [
{
"description": "Interpreter definition",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterCreate"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter"
}
}
}
}
},
"/scripts/interpreters/:id": {
"get": {
"description": "Returns a script interpreter by ID",
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "Get interpreter",
"parameters": [
{
"type": "integer",
"description": "Interpreter ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter"
}
}
}
},
"put": {
"description": "Updates fields of a script interpreter",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "Update interpreter",
"parameters": [
{
"type": "integer",
"description": "Interpreter ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Interpreter fields",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterUpdate"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter"
}
}
}
},
"delete": {
"description": "Removes a script interpreter by ID",
"tags": [
"scripts"
],
"summary": "Delete interpreter",
"parameters": [
{
"type": "integer",
"description": "Interpreter ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"204": {
"description": "No Content"
}
}
}
},
"/scripts/run": {
"post": {
"description": "Resolves interpreter argv[] and sends the full command to the agent",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "Run a script on an agent",
"parameters": [
{
"description": "Script request",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/internal_handlers.RunScriptIn"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/internal_handlers.RunScriptOut"
}
}
}
}
} }
}, },
"definitions": { "definitions": {
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AgentDeployConfig": { "handlers.AgentInfo": {
"type": "object",
"properties": {
"connected_at": {
"type": "string"
},
"label": {
"type": "string"
},
"services": {
"type": "array",
"items": {
"type": "string"
}
},
"token": {
"type": "string"
}
}
},
"handlers.InsertLogRequest": {
"type": "object",
"required": [
"agent",
"level",
"message",
"service"
],
"properties": {
"agent": {
"type": "string"
},
"level": {
"type": "string"
},
"message": {
"type": "string"
},
"service": {
"type": "string"
},
"timestamp": {
"type": "string"
}
}
},
"handlers.InsertLogsRequest": {
"type": "object",
"required": [
"logs"
],
"properties": {
"logs": {
"type": "array",
"items": {
"$ref": "#/definitions/handlers.InsertLogRequest"
}
}
}
},
"handlers.RegisterRequest": {
"type": "object",
"required": [
"csr",
"token"
],
"properties": {
"csr": {
"type": "string"
},
"token": {
"type": "string"
}
}
},
"handlers.RegisterResponse": {
"type": "object",
"properties": {
"ca_cert": {
"type": "string"
},
"client_cert": {
"type": "string"
}
}
},
"repository.AgentDeployConfig": {
"description": "Configuration for deploying HellreigN agent to a single server", "description": "Configuration for deploying HellreigN agent to a single server",
"type": "object", "type": "object",
"required": [ "required": [
@@ -1434,7 +1247,7 @@ const docTemplate = `{
"authMethod": { "authMethod": {
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AuthMethod" "$ref": "#/definitions/repository.AuthMethod"
} }
], ],
"example": "key" "example": "key"
@@ -1442,7 +1255,7 @@ const docTemplate = `{
"deployType": { "deployType": {
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployType" "$ref": "#/definitions/repository.DeployType"
} }
], ],
"example": "docker" "example": "docker"
@@ -1469,7 +1282,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AuthMethod": { "repository.AuthMethod": {
"description": "SSH authentication method: key or password", "description": "SSH authentication method: key or password",
"type": "string", "type": "string",
"enum": [ "enum": [
@@ -1481,7 +1294,7 @@ const docTemplate = `{
"AuthMethodPassword" "AuthMethodPassword"
] ]
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployAgentsRequest": { "repository.DeployAgentsRequest": {
"description": "Request to deploy HellreigN agents to multiple servers", "description": "Request to deploy HellreigN agents to multiple servers",
"type": "object", "type": "object",
"required": [ "required": [
@@ -1492,12 +1305,12 @@ const docTemplate = `{
"type": "array", "type": "array",
"minItems": 1, "minItems": 1,
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AgentDeployConfig" "$ref": "#/definitions/repository.AgentDeployConfig"
} }
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResponse": { "repository.DeployResponse": {
"description": "Response containing deployment results and registration tokens", "description": "Response containing deployment results and registration tokens",
"type": "object", "type": "object",
"properties": { "properties": {
@@ -1508,12 +1321,12 @@ const docTemplate = `{
"results": { "results": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResult" "$ref": "#/definitions/repository.DeployResult"
} }
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResult": { "repository.DeployResult": {
"description": "Result of deploying to a single server", "description": "Result of deploying to a single server",
"type": "object", "type": "object",
"properties": { "properties": {
@@ -1539,7 +1352,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployType": { "repository.DeployType": {
"description": "Type of deployment: docker or binary", "description": "Type of deployment: docker or binary",
"type": "string", "type": "string",
"enum": [ "enum": [
@@ -1551,7 +1364,7 @@ const docTemplate = `{
"DeployTypeBinary" "DeployTypeBinary"
] ]
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginRequest": { "repository.LoginRequest": {
"type": "object", "type": "object",
"required": [ "required": [
"login", "login",
@@ -1566,7 +1379,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginResponse": { "repository.LoginResponse": {
"type": "object", "type": "object",
"properties": { "properties": {
"is_active": { "is_active": {
@@ -1595,7 +1408,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.RegistrationRequest": { "repository.RegistrationRequest": {
"type": "object", "type": "object",
"required": [ "required": [
"label" "label"
@@ -1606,72 +1419,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter": { "repository.TokenCreate": {
"type": "object",
"properties": {
"argv": {
"type": "array",
"items": {
"type": "string"
}
},
"created_at": {
"type": "string"
},
"id": {
"type": "integer"
},
"label": {
"type": "string"
},
"name": {
"type": "string"
},
"updated_at": {
"type": "string"
}
}
},
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterCreate": {
"type": "object",
"required": [
"argv",
"label",
"name"
],
"properties": {
"argv": {
"type": "array",
"items": {
"type": "string"
}
},
"label": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterUpdate": {
"type": "object",
"properties": {
"argv": {
"type": "array",
"items": {
"type": "string"
}
},
"label": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenCreate": {
"type": "object", "type": "object",
"required": [ "required": [
"last_name", "last_name",
@@ -1706,7 +1454,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenPasswordReset": { "repository.TokenPasswordReset": {
"type": "object", "type": "object",
"required": [ "required": [
"new_password" "new_password"
@@ -1717,7 +1465,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdate": { "repository.TokenUpdate": {
"type": "object", "type": "object",
"properties": { "properties": {
"last_name": { "last_name": {
@@ -1728,7 +1476,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdatePermissions": { "repository.TokenUpdatePermissions": {
"type": "object", "type": "object",
"properties": { "properties": {
"is_active": { "is_active": {
@@ -1745,7 +1493,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens": { "repository.Tokens": {
"type": "object", "type": "object",
"properties": { "properties": {
"id": { "id": {
@@ -1777,30 +1525,7 @@ const docTemplate = `{
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.UserRegister": { "storage.LogEntry": {
"type": "object",
"required": [
"last_name",
"login",
"name",
"password"
],
"properties": {
"last_name": {
"type": "string"
},
"login": {
"type": "string"
},
"name": {
"type": "string"
},
"password": {
"type": "string"
}
}
},
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry": {
"type": "object", "type": "object",
"properties": { "properties": {
"agent": { "agent": {
@@ -1819,187 +1544,6 @@ const docTemplate = `{
"type": "string" "type": "string"
} }
} }
},
"internal_handlers.AddJobIn": {
"type": "object",
"required": [
"agent_id",
"command"
],
"properties": {
"agent_id": {
"type": "string"
},
"command": {
"type": "string"
},
"interpreter_id": {
"type": "integer"
},
"stdin": {
"type": "string"
}
}
},
"internal_handlers.AddJobOut": {
"type": "object",
"properties": {
"command": {
"type": "array",
"items": {
"type": "string"
}
},
"id": {
"type": "integer"
},
"status": {
"type": "integer"
},
"stderr": {
"type": "string"
},
"stdin": {
"type": "string"
},
"stdout": {
"type": "string"
}
}
},
"internal_handlers.AgentInfo": {
"type": "object",
"properties": {
"connected_at": {
"type": "string"
},
"label": {
"type": "string"
},
"services": {
"type": "array",
"items": {
"type": "string"
}
},
"token": {
"type": "string"
}
}
},
"internal_handlers.InsertLogRequest": {
"type": "object",
"required": [
"agent",
"level",
"message",
"service"
],
"properties": {
"agent": {
"type": "string"
},
"level": {
"type": "string"
},
"message": {
"type": "string"
},
"service": {
"type": "string"
},
"timestamp": {
"type": "string"
}
}
},
"internal_handlers.InsertLogsRequest": {
"type": "object",
"required": [
"logs"
],
"properties": {
"logs": {
"type": "array",
"items": {
"$ref": "#/definitions/internal_handlers.InsertLogRequest"
}
}
}
},
"internal_handlers.RegisterRequest": {
"type": "object",
"required": [
"csr",
"token"
],
"properties": {
"csr": {
"type": "string"
},
"token": {
"type": "string"
}
}
},
"internal_handlers.RegisterResponse": {
"type": "object",
"properties": {
"ca_cert": {
"type": "string"
},
"client_cert": {
"type": "string"
}
}
},
"internal_handlers.RunScriptIn": {
"type": "object",
"required": [
"agent_id",
"interpreter_id",
"script_text"
],
"properties": {
"agent_id": {
"type": "string"
},
"interpreter_id": {
"type": "integer"
},
"script_text": {
"type": "string"
},
"stdin": {
"type": "string"
}
}
},
"internal_handlers.RunScriptOut": {
"type": "object",
"properties": {
"command": {
"type": "array",
"items": {
"type": "string"
}
},
"id": {
"type": "integer"
},
"status": {
"type": "integer"
},
"stderr": {
"type": "string"
},
"stdin": {
"type": "string"
},
"stdout": {
"type": "string"
}
}
} }
}, },
"securityDefinitions": { "securityDefinitions": {
+125 -581
View File
@@ -25,7 +25,7 @@
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/internal_handlers.AgentInfo" "$ref": "#/definitions/handlers.AgentInfo"
} }
} }
} }
@@ -57,7 +57,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployAgentsRequest" "$ref": "#/definitions/repository.DeployAgentsRequest"
} }
} }
], ],
@@ -65,7 +65,7 @@
"200": { "200": {
"description": "Deployment results with tokens for each server", "description": "Deployment results with tokens for each server",
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResponse" "$ref": "#/definitions/repository.DeployResponse"
} }
}, },
"400": { "400": {
@@ -108,7 +108,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/internal_handlers.RegisterRequest" "$ref": "#/definitions/handlers.RegisterRequest"
} }
} }
], ],
@@ -116,7 +116,7 @@
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"$ref": "#/definitions/internal_handlers.RegisterResponse" "$ref": "#/definitions/handlers.RegisterResponse"
} }
} }
} }
@@ -146,7 +146,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.RegistrationRequest" "$ref": "#/definitions/repository.RegistrationRequest"
} }
} }
], ],
@@ -180,7 +180,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginRequest" "$ref": "#/definitions/repository.LoginRequest"
} }
} }
], ],
@@ -188,7 +188,7 @@
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginResponse" "$ref": "#/definitions/repository.LoginResponse"
} }
}, },
"400": { "400": {
@@ -221,67 +221,6 @@
} }
} }
}, },
"/auth/register": {
"post": {
"description": "Registers a new user with login, password, name, last name. All permissions are set to false.",
"consumes": [
"application/json"
],
"tags": [
"auth"
],
"summary": "Register user",
"parameters": [
{
"description": "Registration data",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.UserRegister"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
},
"400": {
"description": "Bad Request",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
},
"409": {
"description": "Conflict",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}
}
},
"/auth/token": { "/auth/token": {
"post": { "post": {
"description": "Creates a new user with permissions", "description": "Creates a new user with permissions",
@@ -299,7 +238,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenCreate" "$ref": "#/definitions/repository.TokenCreate"
} }
} }
], ],
@@ -395,7 +334,7 @@
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens" "$ref": "#/definitions/repository.Tokens"
} }
} }
}, },
@@ -481,7 +420,7 @@
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens" "$ref": "#/definitions/repository.Tokens"
} }
}, },
"400": { "400": {
@@ -536,7 +475,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdate" "$ref": "#/definitions/repository.TokenUpdate"
} }
} }
], ],
@@ -716,7 +655,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenPasswordReset" "$ref": "#/definitions/repository.TokenPasswordReset"
} }
} }
], ],
@@ -784,7 +723,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdatePermissions" "$ref": "#/definitions/repository.TokenUpdatePermissions"
} }
} }
], ],
@@ -844,7 +783,7 @@
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens" "$ref": "#/definitions/repository.Tokens"
} }
} }
}, },
@@ -874,7 +813,7 @@
"200": { "200": {
"description": "OK", "description": "OK",
"schema": { "schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens" "$ref": "#/definitions/repository.Tokens"
} }
}, },
"401": { "401": {
@@ -889,40 +828,6 @@
} }
} }
}, },
"/jobs": {
"post": {
"description": "Sends a command to the specified agent, waits for execution, and returns the result",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"jobs"
],
"summary": "Create and run a job on an agent",
"parameters": [
{
"description": "Job request",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/internal_handlers.AddJobIn"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/internal_handlers.AddJobOut"
}
}
}
}
},
"/logs": { "/logs": {
"get": { "get": {
"security": [ "security": [
@@ -990,7 +895,7 @@
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry" "$ref": "#/definitions/storage.LogEntry"
} }
} }
} }
@@ -1020,7 +925,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/internal_handlers.InsertLogRequest" "$ref": "#/definitions/handlers.InsertLogRequest"
} }
} }
], ],
@@ -1090,7 +995,7 @@
"in": "body", "in": "body",
"required": true, "required": true,
"schema": { "schema": {
"$ref": "#/definitions/internal_handlers.InsertLogsRequest" "$ref": "#/definitions/handlers.InsertLogsRequest"
} }
} }
], ],
@@ -1190,7 +1095,7 @@
"schema": { "schema": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry" "$ref": "#/definitions/storage.LogEntry"
} }
} }
} }
@@ -1224,188 +1129,96 @@
} }
} }
} }
},
"/scripts/interpreters": {
"get": {
"description": "Returns all script interpreters available in the system",
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "List interpreters",
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter"
}
}
}
}
},
"post": {
"description": "Registers a new script interpreter with name, label, and argv",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "Create interpreter",
"parameters": [
{
"description": "Interpreter definition",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterCreate"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter"
}
}
}
}
},
"/scripts/interpreters/:id": {
"get": {
"description": "Returns a script interpreter by ID",
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "Get interpreter",
"parameters": [
{
"type": "integer",
"description": "Interpreter ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter"
}
}
}
},
"put": {
"description": "Updates fields of a script interpreter",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "Update interpreter",
"parameters": [
{
"type": "integer",
"description": "Interpreter ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "Interpreter fields",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterUpdate"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter"
}
}
}
},
"delete": {
"description": "Removes a script interpreter by ID",
"tags": [
"scripts"
],
"summary": "Delete interpreter",
"parameters": [
{
"type": "integer",
"description": "Interpreter ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"204": {
"description": "No Content"
}
}
}
},
"/scripts/run": {
"post": {
"description": "Resolves interpreter argv[] and sends the full command to the agent",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"scripts"
],
"summary": "Run a script on an agent",
"parameters": [
{
"description": "Script request",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/internal_handlers.RunScriptIn"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/internal_handlers.RunScriptOut"
}
}
}
}
} }
}, },
"definitions": { "definitions": {
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AgentDeployConfig": { "handlers.AgentInfo": {
"type": "object",
"properties": {
"connected_at": {
"type": "string"
},
"label": {
"type": "string"
},
"services": {
"type": "array",
"items": {
"type": "string"
}
},
"token": {
"type": "string"
}
}
},
"handlers.InsertLogRequest": {
"type": "object",
"required": [
"agent",
"level",
"message",
"service"
],
"properties": {
"agent": {
"type": "string"
},
"level": {
"type": "string"
},
"message": {
"type": "string"
},
"service": {
"type": "string"
},
"timestamp": {
"type": "string"
}
}
},
"handlers.InsertLogsRequest": {
"type": "object",
"required": [
"logs"
],
"properties": {
"logs": {
"type": "array",
"items": {
"$ref": "#/definitions/handlers.InsertLogRequest"
}
}
}
},
"handlers.RegisterRequest": {
"type": "object",
"required": [
"csr",
"token"
],
"properties": {
"csr": {
"type": "string"
},
"token": {
"type": "string"
}
}
},
"handlers.RegisterResponse": {
"type": "object",
"properties": {
"ca_cert": {
"type": "string"
},
"client_cert": {
"type": "string"
}
}
},
"repository.AgentDeployConfig": {
"description": "Configuration for deploying HellreigN agent to a single server", "description": "Configuration for deploying HellreigN agent to a single server",
"type": "object", "type": "object",
"required": [ "required": [
@@ -1423,7 +1236,7 @@
"authMethod": { "authMethod": {
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AuthMethod" "$ref": "#/definitions/repository.AuthMethod"
} }
], ],
"example": "key" "example": "key"
@@ -1431,7 +1244,7 @@
"deployType": { "deployType": {
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployType" "$ref": "#/definitions/repository.DeployType"
} }
], ],
"example": "docker" "example": "docker"
@@ -1458,7 +1271,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AuthMethod": { "repository.AuthMethod": {
"description": "SSH authentication method: key or password", "description": "SSH authentication method: key or password",
"type": "string", "type": "string",
"enum": [ "enum": [
@@ -1470,7 +1283,7 @@
"AuthMethodPassword" "AuthMethodPassword"
] ]
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployAgentsRequest": { "repository.DeployAgentsRequest": {
"description": "Request to deploy HellreigN agents to multiple servers", "description": "Request to deploy HellreigN agents to multiple servers",
"type": "object", "type": "object",
"required": [ "required": [
@@ -1481,12 +1294,12 @@
"type": "array", "type": "array",
"minItems": 1, "minItems": 1,
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AgentDeployConfig" "$ref": "#/definitions/repository.AgentDeployConfig"
} }
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResponse": { "repository.DeployResponse": {
"description": "Response containing deployment results and registration tokens", "description": "Response containing deployment results and registration tokens",
"type": "object", "type": "object",
"properties": { "properties": {
@@ -1497,12 +1310,12 @@
"results": { "results": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResult" "$ref": "#/definitions/repository.DeployResult"
} }
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResult": { "repository.DeployResult": {
"description": "Result of deploying to a single server", "description": "Result of deploying to a single server",
"type": "object", "type": "object",
"properties": { "properties": {
@@ -1528,7 +1341,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployType": { "repository.DeployType": {
"description": "Type of deployment: docker or binary", "description": "Type of deployment: docker or binary",
"type": "string", "type": "string",
"enum": [ "enum": [
@@ -1540,7 +1353,7 @@
"DeployTypeBinary" "DeployTypeBinary"
] ]
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginRequest": { "repository.LoginRequest": {
"type": "object", "type": "object",
"required": [ "required": [
"login", "login",
@@ -1555,7 +1368,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginResponse": { "repository.LoginResponse": {
"type": "object", "type": "object",
"properties": { "properties": {
"is_active": { "is_active": {
@@ -1584,7 +1397,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.RegistrationRequest": { "repository.RegistrationRequest": {
"type": "object", "type": "object",
"required": [ "required": [
"label" "label"
@@ -1595,72 +1408,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter": { "repository.TokenCreate": {
"type": "object",
"properties": {
"argv": {
"type": "array",
"items": {
"type": "string"
}
},
"created_at": {
"type": "string"
},
"id": {
"type": "integer"
},
"label": {
"type": "string"
},
"name": {
"type": "string"
},
"updated_at": {
"type": "string"
}
}
},
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterCreate": {
"type": "object",
"required": [
"argv",
"label",
"name"
],
"properties": {
"argv": {
"type": "array",
"items": {
"type": "string"
}
},
"label": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterUpdate": {
"type": "object",
"properties": {
"argv": {
"type": "array",
"items": {
"type": "string"
}
},
"label": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenCreate": {
"type": "object", "type": "object",
"required": [ "required": [
"last_name", "last_name",
@@ -1695,7 +1443,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenPasswordReset": { "repository.TokenPasswordReset": {
"type": "object", "type": "object",
"required": [ "required": [
"new_password" "new_password"
@@ -1706,7 +1454,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdate": { "repository.TokenUpdate": {
"type": "object", "type": "object",
"properties": { "properties": {
"last_name": { "last_name": {
@@ -1717,7 +1465,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdatePermissions": { "repository.TokenUpdatePermissions": {
"type": "object", "type": "object",
"properties": { "properties": {
"is_active": { "is_active": {
@@ -1734,7 +1482,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens": { "repository.Tokens": {
"type": "object", "type": "object",
"properties": { "properties": {
"id": { "id": {
@@ -1766,30 +1514,7 @@
} }
} }
}, },
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.UserRegister": { "storage.LogEntry": {
"type": "object",
"required": [
"last_name",
"login",
"name",
"password"
],
"properties": {
"last_name": {
"type": "string"
},
"login": {
"type": "string"
},
"name": {
"type": "string"
},
"password": {
"type": "string"
}
}
},
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry": {
"type": "object", "type": "object",
"properties": { "properties": {
"agent": { "agent": {
@@ -1808,187 +1533,6 @@
"type": "string" "type": "string"
} }
} }
},
"internal_handlers.AddJobIn": {
"type": "object",
"required": [
"agent_id",
"command"
],
"properties": {
"agent_id": {
"type": "string"
},
"command": {
"type": "string"
},
"interpreter_id": {
"type": "integer"
},
"stdin": {
"type": "string"
}
}
},
"internal_handlers.AddJobOut": {
"type": "object",
"properties": {
"command": {
"type": "array",
"items": {
"type": "string"
}
},
"id": {
"type": "integer"
},
"status": {
"type": "integer"
},
"stderr": {
"type": "string"
},
"stdin": {
"type": "string"
},
"stdout": {
"type": "string"
}
}
},
"internal_handlers.AgentInfo": {
"type": "object",
"properties": {
"connected_at": {
"type": "string"
},
"label": {
"type": "string"
},
"services": {
"type": "array",
"items": {
"type": "string"
}
},
"token": {
"type": "string"
}
}
},
"internal_handlers.InsertLogRequest": {
"type": "object",
"required": [
"agent",
"level",
"message",
"service"
],
"properties": {
"agent": {
"type": "string"
},
"level": {
"type": "string"
},
"message": {
"type": "string"
},
"service": {
"type": "string"
},
"timestamp": {
"type": "string"
}
}
},
"internal_handlers.InsertLogsRequest": {
"type": "object",
"required": [
"logs"
],
"properties": {
"logs": {
"type": "array",
"items": {
"$ref": "#/definitions/internal_handlers.InsertLogRequest"
}
}
}
},
"internal_handlers.RegisterRequest": {
"type": "object",
"required": [
"csr",
"token"
],
"properties": {
"csr": {
"type": "string"
},
"token": {
"type": "string"
}
}
},
"internal_handlers.RegisterResponse": {
"type": "object",
"properties": {
"ca_cert": {
"type": "string"
},
"client_cert": {
"type": "string"
}
}
},
"internal_handlers.RunScriptIn": {
"type": "object",
"required": [
"agent_id",
"interpreter_id",
"script_text"
],
"properties": {
"agent_id": {
"type": "string"
},
"interpreter_id": {
"type": "integer"
},
"script_text": {
"type": "string"
},
"stdin": {
"type": "string"
}
}
},
"internal_handlers.RunScriptOut": {
"type": "object",
"properties": {
"command": {
"type": "array",
"items": {
"type": "string"
}
},
"id": {
"type": "integer"
},
"status": {
"type": "integer"
},
"stderr": {
"type": "string"
},
"stdin": {
"type": "string"
},
"stdout": {
"type": "string"
}
}
} }
}, },
"securityDefinitions": { "securityDefinitions": {
+96 -399
View File
@@ -1,5 +1,62 @@
definitions: definitions:
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AgentDeployConfig: handlers.AgentInfo:
properties:
connected_at:
type: string
label:
type: string
services:
items:
type: string
type: array
token:
type: string
type: object
handlers.InsertLogRequest:
properties:
agent:
type: string
level:
type: string
message:
type: string
service:
type: string
timestamp:
type: string
required:
- agent
- level
- message
- service
type: object
handlers.InsertLogsRequest:
properties:
logs:
items:
$ref: '#/definitions/handlers.InsertLogRequest'
type: array
required:
- logs
type: object
handlers.RegisterRequest:
properties:
csr:
type: string
token:
type: string
required:
- csr
- token
type: object
handlers.RegisterResponse:
properties:
ca_cert:
type: string
client_cert:
type: string
type: object
repository.AgentDeployConfig:
description: Configuration for deploying HellreigN agent to a single server description: Configuration for deploying HellreigN agent to a single server
properties: properties:
agentLabel: agentLabel:
@@ -7,11 +64,11 @@ definitions:
type: string type: string
authMethod: authMethod:
allOf: allOf:
- $ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AuthMethod' - $ref: '#/definitions/repository.AuthMethod'
example: key example: key
deployType: deployType:
allOf: allOf:
- $ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployType' - $ref: '#/definitions/repository.DeployType'
example: docker example: docker
ip: ip:
example: 192.168.1.100 example: 192.168.1.100
@@ -35,7 +92,7 @@ definitions:
- ip - ip
- user - user
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AuthMethod: repository.AuthMethod:
description: 'SSH authentication method: key or password' description: 'SSH authentication method: key or password'
enum: enum:
- key - key
@@ -44,18 +101,18 @@ definitions:
x-enum-varnames: x-enum-varnames:
- AuthMethodKey - AuthMethodKey
- AuthMethodPassword - AuthMethodPassword
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployAgentsRequest: repository.DeployAgentsRequest:
description: Request to deploy HellreigN agents to multiple servers description: Request to deploy HellreigN agents to multiple servers
properties: properties:
servers: servers:
items: items:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.AgentDeployConfig' $ref: '#/definitions/repository.AgentDeployConfig'
minItems: 1 minItems: 1
type: array type: array
required: required:
- servers - servers
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResponse: repository.DeployResponse:
description: Response containing deployment results and registration tokens description: Response containing deployment results and registration tokens
properties: properties:
message: message:
@@ -63,10 +120,10 @@ definitions:
type: string type: string
results: results:
items: items:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResult' $ref: '#/definitions/repository.DeployResult'
type: array type: array
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResult: repository.DeployResult:
description: Result of deploying to a single server description: Result of deploying to a single server
properties: properties:
agent_label: agent_label:
@@ -85,7 +142,7 @@ definitions:
example: abc123... example: abc123...
type: string type: string
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployType: repository.DeployType:
description: 'Type of deployment: docker or binary' description: 'Type of deployment: docker or binary'
enum: enum:
- docker - docker
@@ -94,7 +151,7 @@ definitions:
x-enum-varnames: x-enum-varnames:
- DeployTypeDocker - DeployTypeDocker
- DeployTypeBinary - DeployTypeBinary
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginRequest: repository.LoginRequest:
properties: properties:
login: login:
type: string type: string
@@ -104,7 +161,7 @@ definitions:
- login - login
- password - password
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginResponse: repository.LoginResponse:
properties: properties:
is_active: is_active:
type: boolean type: boolean
@@ -123,57 +180,14 @@ definitions:
token: token:
type: string type: string
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.RegistrationRequest: repository.RegistrationRequest:
properties: properties:
label: label:
type: string type: string
required: required:
- label - label
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter: repository.TokenCreate:
properties:
argv:
items:
type: string
type: array
created_at:
type: string
id:
type: integer
label:
type: string
name:
type: string
updated_at:
type: string
type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterCreate:
properties:
argv:
items:
type: string
type: array
label:
type: string
name:
type: string
required:
- argv
- label
- name
type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterUpdate:
properties:
argv:
items:
type: string
type: array
label:
type: string
name:
type: string
type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenCreate:
properties: properties:
is_active: is_active:
type: boolean type: boolean
@@ -197,21 +211,21 @@ definitions:
- name - name
- password - password
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenPasswordReset: repository.TokenPasswordReset:
properties: properties:
new_password: new_password:
type: string type: string
required: required:
- new_password - new_password
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdate: repository.TokenUpdate:
properties: properties:
last_name: last_name:
type: string type: string
name: name:
type: string type: string
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdatePermissions: repository.TokenUpdatePermissions:
properties: properties:
is_active: is_active:
type: boolean type: boolean
@@ -222,7 +236,7 @@ definitions:
permission_view: permission_view:
type: boolean type: boolean
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens: repository.Tokens:
properties: properties:
id: id:
type: integer type: integer
@@ -243,23 +257,7 @@ definitions:
token: token:
type: string type: string
type: object type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.UserRegister: storage.LogEntry:
properties:
last_name:
type: string
login:
type: string
name:
type: string
password:
type: string
required:
- last_name
- login
- name
- password
type: object
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry:
properties: properties:
agent: agent:
type: string type: string
@@ -272,126 +270,6 @@ definitions:
timestamp: timestamp:
type: string type: string
type: object type: object
internal_handlers.AddJobIn:
properties:
agent_id:
type: string
command:
type: string
interpreter_id:
type: integer
stdin:
type: string
required:
- agent_id
- command
type: object
internal_handlers.AddJobOut:
properties:
command:
items:
type: string
type: array
id:
type: integer
status:
type: integer
stderr:
type: string
stdin:
type: string
stdout:
type: string
type: object
internal_handlers.AgentInfo:
properties:
connected_at:
type: string
label:
type: string
services:
items:
type: string
type: array
token:
type: string
type: object
internal_handlers.InsertLogRequest:
properties:
agent:
type: string
level:
type: string
message:
type: string
service:
type: string
timestamp:
type: string
required:
- agent
- level
- message
- service
type: object
internal_handlers.InsertLogsRequest:
properties:
logs:
items:
$ref: '#/definitions/internal_handlers.InsertLogRequest'
type: array
required:
- logs
type: object
internal_handlers.RegisterRequest:
properties:
csr:
type: string
token:
type: string
required:
- csr
- token
type: object
internal_handlers.RegisterResponse:
properties:
ca_cert:
type: string
client_cert:
type: string
type: object
internal_handlers.RunScriptIn:
properties:
agent_id:
type: string
interpreter_id:
type: integer
script_text:
type: string
stdin:
type: string
required:
- agent_id
- interpreter_id
- script_text
type: object
internal_handlers.RunScriptOut:
properties:
command:
items:
type: string
type: array
id:
type: integer
status:
type: integer
stderr:
type: string
stdin:
type: string
stdout:
type: string
type: object
info: info:
contact: {} contact: {}
paths: paths:
@@ -406,7 +284,7 @@ paths:
description: OK description: OK
schema: schema:
items: items:
$ref: '#/definitions/internal_handlers.AgentInfo' $ref: '#/definitions/handlers.AgentInfo'
type: array type: array
security: security:
- Bearer: [] - Bearer: []
@@ -425,14 +303,14 @@ paths:
name: request name: request
required: true required: true
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployAgentsRequest' $ref: '#/definitions/repository.DeployAgentsRequest'
produces: produces:
- application/json - application/json
responses: responses:
"200": "200":
description: Deployment results with tokens for each server description: Deployment results with tokens for each server
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.DeployResponse' $ref: '#/definitions/repository.DeployResponse'
"400": "400":
description: Invalid request description: Invalid request
schema: schema:
@@ -460,14 +338,14 @@ paths:
name: request name: request
required: true required: true
schema: schema:
$ref: '#/definitions/internal_handlers.RegisterRequest' $ref: '#/definitions/handlers.RegisterRequest'
produces: produces:
- application/json - application/json
responses: responses:
"200": "200":
description: OK description: OK
schema: schema:
$ref: '#/definitions/internal_handlers.RegisterResponse' $ref: '#/definitions/handlers.RegisterResponse'
summary: Register agent summary: Register agent
tags: tags:
- agents - agents
@@ -481,7 +359,7 @@ paths:
name: request name: request
required: true required: true
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.RegistrationRequest' $ref: '#/definitions/repository.RegistrationRequest'
produces: produces:
- application/json - application/json
responses: responses:
@@ -507,12 +385,12 @@ paths:
name: request name: request
required: true required: true
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginRequest' $ref: '#/definitions/repository.LoginRequest'
responses: responses:
"200": "200":
description: OK description: OK
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginResponse' $ref: '#/definitions/repository.LoginResponse'
"400": "400":
description: Bad Request description: Bad Request
schema: schema:
@@ -534,47 +412,6 @@ paths:
summary: Login summary: Login
tags: tags:
- auth - auth
/auth/register:
post:
consumes:
- application/json
description: Registers a new user with login, password, name, last name. All
permissions are set to false.
parameters:
- description: Registration data
in: body
name: request
required: true
schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.UserRegister'
responses:
"200":
description: OK
schema:
additionalProperties:
type: string
type: object
"400":
description: Bad Request
schema:
additionalProperties:
type: string
type: object
"409":
description: Conflict
schema:
additionalProperties:
type: string
type: object
"500":
description: Internal Server Error
schema:
additionalProperties:
type: string
type: object
summary: Register user
tags:
- auth
/auth/token: /auth/token:
delete: delete:
description: Deletes the current authenticated user description: Deletes the current authenticated user
@@ -610,7 +447,7 @@ paths:
name: request name: request
required: true required: true
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenCreate' $ref: '#/definitions/repository.TokenCreate'
responses: responses:
"200": "200":
description: OK description: OK
@@ -649,7 +486,7 @@ paths:
description: OK description: OK
schema: schema:
items: items:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens' $ref: '#/definitions/repository.Tokens'
type: array type: array
"500": "500":
description: Internal Server Error description: Internal Server Error
@@ -706,7 +543,7 @@ paths:
"200": "200":
description: OK description: OK
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens' $ref: '#/definitions/repository.Tokens'
"400": "400":
description: Bad Request description: Bad Request
schema: schema:
@@ -743,7 +580,7 @@ paths:
name: request name: request
required: true required: true
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdate' $ref: '#/definitions/repository.TokenUpdate'
responses: responses:
"200": "200":
description: OK description: OK
@@ -862,7 +699,7 @@ paths:
name: request name: request
required: true required: true
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenPasswordReset' $ref: '#/definitions/repository.TokenPasswordReset'
responses: responses:
"200": "200":
description: OK description: OK
@@ -907,7 +744,7 @@ paths:
name: request name: request
required: true required: true
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdatePermissions' $ref: '#/definitions/repository.TokenUpdatePermissions'
responses: responses:
"200": "200":
description: OK description: OK
@@ -946,7 +783,7 @@ paths:
description: OK description: OK
schema: schema:
items: items:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens' $ref: '#/definitions/repository.Tokens'
type: array type: array
"500": "500":
description: Internal Server Error description: Internal Server Error
@@ -966,7 +803,7 @@ paths:
"200": "200":
description: OK description: OK
schema: schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens' $ref: '#/definitions/repository.Tokens'
"401": "401":
description: Unauthorized description: Unauthorized
schema: schema:
@@ -976,29 +813,6 @@ paths:
summary: Validate token summary: Validate token
tags: tags:
- auth - auth
/jobs:
post:
consumes:
- application/json
description: Sends a command to the specified agent, waits for execution, and
returns the result
parameters:
- description: Job request
in: body
name: body
required: true
schema:
$ref: '#/definitions/internal_handlers.AddJobIn'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/internal_handlers.AddJobOut'
summary: Create and run a job on an agent
tags:
- jobs
/logs: /logs:
get: get:
description: Searches logs with various filters description: Searches logs with various filters
@@ -1040,7 +854,7 @@ paths:
description: OK description: OK
schema: schema:
items: items:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry' $ref: '#/definitions/storage.LogEntry'
type: array type: array
security: security:
- Bearer: [] - Bearer: []
@@ -1057,7 +871,7 @@ paths:
name: body name: body
required: true required: true
schema: schema:
$ref: '#/definitions/internal_handlers.InsertLogRequest' $ref: '#/definitions/handlers.InsertLogRequest'
produces: produces:
- application/json - application/json
responses: responses:
@@ -1100,7 +914,7 @@ paths:
name: body name: body
required: true required: true
schema: schema:
$ref: '#/definitions/internal_handlers.InsertLogsRequest' $ref: '#/definitions/handlers.InsertLogsRequest'
produces: produces:
- application/json - application/json
responses: responses:
@@ -1166,7 +980,7 @@ paths:
description: OK description: OK
schema: schema:
items: items:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry' $ref: '#/definitions/storage.LogEntry'
type: array type: array
security: security:
- Bearer: [] - Bearer: []
@@ -1190,123 +1004,6 @@ paths:
summary: Get distinct services summary: Get distinct services
tags: tags:
- logs - logs
/scripts/interpreters:
get:
description: Returns all script interpreters available in the system
produces:
- application/json
responses:
"200":
description: OK
schema:
items:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter'
type: array
summary: List interpreters
tags:
- scripts
post:
consumes:
- application/json
description: Registers a new script interpreter with name, label, and argv
parameters:
- description: Interpreter definition
in: body
name: body
required: true
schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterCreate'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter'
summary: Create interpreter
tags:
- scripts
/scripts/interpreters/:id:
delete:
description: Removes a script interpreter by ID
parameters:
- description: Interpreter ID
in: path
name: id
required: true
type: integer
responses:
"204":
description: No Content
summary: Delete interpreter
tags:
- scripts
get:
description: Returns a script interpreter by ID
parameters:
- description: Interpreter ID
in: path
name: id
required: true
type: integer
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter'
summary: Get interpreter
tags:
- scripts
put:
consumes:
- application/json
description: Updates fields of a script interpreter
parameters:
- description: Interpreter ID
in: path
name: id
required: true
type: integer
- description: Interpreter fields
in: body
name: body
required: true
schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreterUpdate'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.ScriptInterpreter'
summary: Update interpreter
tags:
- scripts
/scripts/run:
post:
consumes:
- application/json
description: Resolves interpreter argv[] and sends the full command to the agent
parameters:
- description: Script request
in: body
name: body
required: true
schema:
$ref: '#/definitions/internal_handlers.RunScriptIn'
produces:
- application/json
responses:
"201":
description: Created
schema:
$ref: '#/definitions/internal_handlers.RunScriptOut'
summary: Run a script on an agent
tags:
- scripts
securityDefinitions: securityDefinitions:
Bearer: Bearer:
description: Type "Bearer" followed by a space and the JWT token. description: Type "Bearer" followed by a space and the JWT token.
-1
View File
@@ -6,7 +6,6 @@ require (
gitea.d3m0k1d.ru/d3m0k1d/HellreigN/proto v0.0.0-20260403210401-a6212c89fc0e gitea.d3m0k1d.ru/d3m0k1d/HellreigN/proto v0.0.0-20260403210401-a6212c89fc0e
github.com/ClickHouse/clickhouse-go/v2 v2.44.0 github.com/ClickHouse/clickhouse-go/v2 v2.44.0
github.com/gin-gonic/gin v1.12.0 github.com/gin-gonic/gin v1.12.0
github.com/samber/lo v1.53.0
github.com/swaggo/files v1.0.1 github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.1 github.com/swaggo/gin-swagger v1.6.1
github.com/swaggo/swag v1.16.6 github.com/swaggo/swag v1.16.6
-2
View File
@@ -138,8 +138,6 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/samber/lo v1.53.0 h1:t975lj2py4kJPQ6haz1QMgtId2gtmfktACxIXArw3HM=
github.com/samber/lo v1.53.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0= github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0=
github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
@@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"io" "io"
"log"
"sync" "sync"
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/models" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/models"
@@ -77,21 +78,26 @@ func (self *Commander) removeAgent(aid string) {
} }
func (self *Agent) AddJob(job models.JobForInsert) (int64, error) { func (self *Agent) AddJob(job models.JobForInsert) (int64, error) {
log.Printf("[DEBUG] AddJob: agent=%s, command=%v", self.aid, job.Command)
jid, err := self.jobber.InitJob(self.ctx, self.aid, job) jid, err := self.jobber.InitJob(self.ctx, self.aid, job)
if err != nil { if err != nil {
log.Printf("[DEBUG] AddJob: InitJob failed: %v", err)
return 0, err return 0, err
} }
self.jobs[jid] = newJob() log.Printf("[DEBUG] AddJob: InitJob returned jid=%d, sending to self.in channel", jid)
self.in <- &proto.Command{ self.in <- &proto.Command{
Id: jid, Id: jid,
Command: job.Command, Command: job.Command,
Stdin: job.Stdin, Stdin: job.Stdin,
} }
log.Printf("[DEBUG] AddJob: sent to self.in channel successfully")
return jid, err return jid, err
} }
func (self *Agent) WaitJob(jid int64) (*models.Job, error) { func (self *Agent) WaitJob(jid int64) (*models.Job, error) {
log.Printf("[DEBUG] WaitJob: agent=%s, jid=%d, waiting on self.jobs[%d].out", self.aid, jid, jid)
result := <-self.jobs[jid].out result := <-self.jobs[jid].out
log.Printf("[DEBUG] WaitJob: agent=%s, jid=%d, received result", self.aid, jid)
return &result.fc, result.err return &result.fc, result.err
} }
@@ -135,6 +141,7 @@ func (self *Agent) recv() error {
if err != nil { if err != nil {
return return
} }
log.Printf("[DEBUG] recv: agent=%s, received finished job id=%d", self.aid, msg.Id)
return self.jobber.UpdateJobInDB(self.ctx, msg.Id, models.JobForUpdate{ return self.jobber.UpdateJobInDB(self.ctx, msg.Id, models.JobForUpdate{
Stdout: msg.Stdout, Stdout: msg.Stdout,
Stderr: msg.Stderr, Stderr: msg.Stderr,
@@ -142,24 +149,33 @@ func (self *Agent) recv() error {
}) })
}() }()
if err == io.EOF { if err == io.EOF {
log.Printf("[DEBUG] recv: agent=%s, EOF received", self.aid)
return nil return nil
} }
// TODO: that would blow up at some point if err != nil {
log.Printf("[DEBUG] recv: agent=%s, error: %v", self.aid, err)
}
out := self.jobs[job.ID].out out := self.jobs[job.ID].out
out <- JobOut{ out <- JobOut{
fc: job, fc: job,
err: err, err: err,
} }
close(out) close(out)
log.Printf("[DEBUG] recv: agent=%s, sent result for job id=%d", self.aid, job.ID)
} }
} }
func (self *Agent) send() error { func (self *Agent) send() error {
for job := range self.in { for job := range self.in {
log.Printf("[DEBUG] send: agent=%s, job id=%d, command=%v", self.aid, job.Id, job.Command)
self.jobs[job.Id] = newJob()
if err := self.bidi.Send(job); err != nil { if err := self.bidi.Send(job); err != nil {
log.Printf("[DEBUG] send: agent=%s, failed to send job id=%d: %v", self.aid, job.Id, err)
return err return err
} }
log.Printf("[DEBUG] send: agent=%s, sent job id=%d to agent", self.aid, job.Id)
} }
log.Printf("[DEBUG] send: agent=%s, self.in channel closed", self.aid)
return io.EOF return io.EOF
// self.jobs[] // self.jobs[]
} }
-31
View File
@@ -49,37 +49,6 @@ func (ag *AuthGroup) Login(c *gin.Context) {
c.JSON(http.StatusOK, resp) c.JSON(http.StatusOK, resp)
} }
// RegisterUser registers a new user with all permissions set to false.
// @Summary Register user
// @Description Registers a new user with login, password, name, last name. All permissions are set to false.
// @Tags auth
// @Accept json
// @Param request body repository.UserRegister true "Registration data"
// @Success 200 {object} map[string]string
// @Failure 400 {object} map[string]string
// @Failure 409 {object} map[string]string
// @Failure 500 {object} map[string]string
// @Router /auth/register [post]
func (ag *AuthGroup) RegisterUser(c *gin.Context) {
var req repository.UserRegister
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request body"})
return
}
if ag.Repo.ExistsByLogin(req.Login) {
c.JSON(http.StatusConflict, gin.H{"error": "login already exists"})
return
}
if _, err := ag.Repo.RegisterUser(req); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to register user"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "user registered"})
}
// CreateToken creates a new user. // CreateToken creates a new user.
// @Summary Create user // @Summary Create user
// @Description Creates a new user with permissions // @Description Creates a new user with permissions
-33
View File
@@ -1,33 +0,0 @@
package handlers
import (
"net/http"
"strings"
"github.com/gin-gonic/gin"
"github.com/samber/lo"
)
func CorsMiddleware(origincfg string) gin.HandlerFunc {
origins := strings.Split(origincfg, ";")
if origins[0] == "" {
panic("zero cors origins wtf is your config")
}
return func(c *gin.Context) {
origin := c.GetHeader("Origin")
if !lo.Contains(origins, origin) {
origin = origins[0]
}
c.Writer.Header().Set("Access-Control-Allow-Origin", origin)
// c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, Authorization")
c.Writer.Header().Set("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PATCH, DELETE, PUT")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(http.StatusNoContent)
return
}
c.Next()
}
}
+13
View File
@@ -2,6 +2,7 @@ package handlers
import ( import (
"fmt" "fmt"
"log"
"net/http" "net/http"
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/grpcsrv/commander" "gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/grpcsrv/commander"
@@ -44,16 +45,21 @@ type AddJobOut struct {
// @Success 201 {object} AddJobOut // @Success 201 {object} AddJobOut
// @Router /jobs [post] // @Router /jobs [post]
func (self *JobsHandlers) AddJob(c *gin.Context) { func (self *JobsHandlers) AddJob(c *gin.Context) {
log.Printf("[DEBUG] AddJob handler: request received")
err := func() error { err := func() error {
var in AddJobIn var in AddJobIn
if err := c.Bind(&in); err != nil { if err := c.Bind(&in); err != nil {
log.Printf("[DEBUG] AddJob handler: bind failed: %v", err)
return err return err
} }
log.Printf("[DEBUG] AddJob handler: agent_id=%s, command=%s, interpreter_id=%d", in.AgentID, in.Command, in.InterpreterID)
agent, ok := self.cmder.GetAgent(in.AgentID) agent, ok := self.cmder.GetAgent(in.AgentID)
if !ok { if !ok {
log.Printf("[DEBUG] AddJob handler: agent %s not found", in.AgentID)
c.Status(http.StatusNotFound) c.Status(http.StatusNotFound)
return fmt.Errorf("agent not found") return fmt.Errorf("agent not found")
} }
log.Printf("[DEBUG] AddJob handler: agent found, resolving command")
var command []string var command []string
if in.InterpreterID == 0 { if in.InterpreterID == 0 {
@@ -62,21 +68,27 @@ func (self *JobsHandlers) AddJob(c *gin.Context) {
var err error var err error
command, err = self.svc.ResolveCommand(c.Request.Context(), in.InterpreterID, in.Command) command, err = self.svc.ResolveCommand(c.Request.Context(), in.InterpreterID, in.Command)
if err != nil { if err != nil {
log.Printf("[DEBUG] AddJob handler: ResolveCommand failed: %v", err)
return err return err
} }
} }
log.Printf("[DEBUG] AddJob handler: calling agent.AddJob with command=%v", command)
jid, err := agent.AddJob(models.JobForInsert{ jid, err := agent.AddJob(models.JobForInsert{
Command: command, Command: command,
Stdin: in.Stdin, Stdin: in.Stdin,
}) })
if err != nil { if err != nil {
log.Printf("[DEBUG] AddJob handler: agent.AddJob failed: %v", err)
return err return err
} }
log.Printf("[DEBUG] AddJob handler: agent.AddJob returned jid=%d, calling WaitJob", jid)
job, err := agent.WaitJob(jid) job, err := agent.WaitJob(jid)
if err != nil { if err != nil {
log.Printf("[DEBUG] AddJob handler: agent.WaitJob failed: %v", err)
return err return err
} }
log.Printf("[DEBUG] AddJob handler: agent.WaitJob returned job id=%d, status=%d", job.ID, job.Status)
c.JSON(http.StatusCreated, AddJobOut{ c.JSON(http.StatusCreated, AddJobOut{
ID: job.ID, ID: job.ID,
Command: job.Command, Command: job.Command,
@@ -85,6 +97,7 @@ func (self *JobsHandlers) AddJob(c *gin.Context) {
Stderr: job.Stderr, Stderr: job.Stderr,
Status: job.Status, Status: job.Status,
}) })
log.Printf("[DEBUG] AddJob handler: response sent")
return nil return nil
}() }()
if err != nil { if err != nil {
+14 -16
View File
@@ -21,22 +21,6 @@ func NewScriptHandlers(svc *service.ScriptService, cmder *commander.Commander) S
return ScriptHandlers{svc: svc, cmder: cmder} return ScriptHandlers{svc: svc, cmder: cmder}
} }
type RunScriptIn struct {
AgentID string `json:"agent_id" binding:"required"`
InterpreterID int64 `json:"interpreter_id" binding:"required"`
ScriptText string `json:"script_text" binding:"required"`
Stdin *string `json:"stdin"`
}
type RunScriptOut 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"`
}
// RunScript executes a script on a target agent. // RunScript executes a script on a target agent.
// @Summary Run a script on an agent // @Summary Run a script on an agent
// @Description Resolves interpreter argv[] and sends the full command to the agent // @Description Resolves interpreter argv[] and sends the full command to the agent
@@ -48,6 +32,12 @@ type RunScriptOut struct {
// @Router /scripts/run [post] // @Router /scripts/run [post]
func (self *ScriptHandlers) RunScript(c *gin.Context) { func (self *ScriptHandlers) RunScript(c *gin.Context) {
err := func() error { err := func() error {
type RunScriptIn struct {
AgentID string `json:"agent_id" binding:"required"`
InterpreterID int64 `json:"interpreter_id" binding:"required"`
ScriptText string `json:"script_text" binding:"required"`
Stdin *string `json:"stdin"`
}
var in RunScriptIn var in RunScriptIn
if err := c.Bind(&in); err != nil { if err := c.Bind(&in); err != nil {
return err return err
@@ -77,6 +67,14 @@ func (self *ScriptHandlers) RunScript(c *gin.Context) {
return err return err
} }
type RunScriptOut 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(http.StatusCreated, RunScriptOut{ c.JSON(http.StatusCreated, RunScriptOut{
ID: job.ID, ID: job.ID,
Command: job.Command, Command: job.Command,
-8
View File
@@ -25,14 +25,6 @@ type TokenCreate struct {
IsActive bool `json:"is_active"` IsActive bool `json:"is_active"`
} }
// UserRegister is the request body for public user registration (all permissions false).
type UserRegister struct {
Name string `json:"name" binding:"required"`
LastName string `json:"last_name" binding:"required"`
Login string `json:"login" binding:"required"`
Password string `json:"password" binding:"required"`
}
// TokenUpdate is the request body for updating an existing user. // TokenUpdate is the request body for updating an existing user.
type TokenUpdate struct { type TokenUpdate struct {
Name string `json:"name"` Name string `json:"name"`
-28
View File
@@ -64,34 +64,6 @@ func (r *Repository) CreateToken(tc TokenCreate) (string, error) {
return strconv.FormatInt(id, 10), nil return strconv.FormatInt(id, 10), nil
} }
// RegisterUser inserts a new user with all permissions set to false and is_active=false.
func (r *Repository) RegisterUser(ur UserRegister) (string, error) {
hashed, err := bcrypt.GenerateFromPassword([]byte(ur.Password), bcrypt.DefaultCost)
if err != nil {
return "", err
}
token, err := utils.RandomToken()
if err != nil {
return "", err
}
result, err := r.DB.Exec(
`INSERT INTO tokens (name, last_name, login, password, token, permission_view, permission_manage_agent, permission_admin, is_active)
VALUES (?, ?, ?, ?, ?, 0, 0, 0, 0)`,
ur.Name, ur.LastName, ur.Login, string(hashed), token,
)
if err != nil {
return "", err
}
id, err := result.LastInsertId()
if err != nil {
return "", err
}
return strconv.FormatInt(id, 10), nil
}
// Login authenticates by login/password, generates a new token, and returns LoginResponse. // Login authenticates by login/password, generates a new token, and returns LoginResponse.
func (r *Repository) Login(login, password string) (*LoginResponse, error) { func (r *Repository) Login(login, password string) (*LoginResponse, error) {
var t Tokens var t Tokens
+1 -1
View File
@@ -1,7 +1,7 @@
backend_url: http://backend:8080 backend_url: http://backend:8080
grpc_url: backend:9001 grpc_url: backend:9001
label: test-agent-1 label: test-agent-1
registration_token: "3db3bc64affa93c3b95762a41cbad9c58762f8e49faa1bb1ec1588a75fb9188d" registration_token: "156616b56774d59ba53f1eb4b096488bb5f755bbf5b737d93a42bb1b583ad7fb"
cert_dir: /etc/hellreign-agent/certs cert_dir: /etc/hellreign-agent/certs
services: services:
- name: system - name: system