This commit is contained in:
+28
-23
@@ -39,33 +39,38 @@ func main() {
|
|||||||
lgr := logger.New(os.Getenv("IS_DEBUG") == "1")
|
lgr := logger.New(os.Getenv("IS_DEBUG") == "1")
|
||||||
lgr.Debug("Config parsed", "cfg", cfg)
|
lgr.Debug("Config parsed", "cfg", cfg)
|
||||||
|
|
||||||
if cfg.RegistrationToken == "" {
|
// Check if certificates already exist (agent was previously registered)
|
||||||
lgr.Error("No registration token provided")
|
if registration.CertsExist(cfg.CertDir) {
|
||||||
os.Exit(1)
|
lgr.Info("Certificates found, skipping registration")
|
||||||
}
|
} else {
|
||||||
|
if cfg.RegistrationToken == "" {
|
||||||
|
lgr.Error("No registration token provided")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
// Generate key and CSR
|
// Generate key and CSR
|
||||||
key, csrPEM, err := registration.GenerateKeyAndCSR(cfg.Label)
|
k, csrPEM, err := registration.GenerateKeyAndCSR(cfg.Label)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lgr.Error("Failed to generate key and CSR", "err", err)
|
lgr.Error("Failed to generate key and CSR", "err", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
lgr.Info("Generated ECDSA key pair and CSR")
|
lgr.Info("Generated ECDSA key pair and CSR")
|
||||||
|
|
||||||
// Register with backend
|
// Register with backend
|
||||||
certs, err := registration.Register(cfg.BackendURL, cfg.RegistrationToken, csrPEM)
|
certs, err := registration.Register(cfg.BackendURL, cfg.RegistrationToken, csrPEM)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lgr.Error("Failed to register", "err", err)
|
lgr.Error("Failed to register", "err", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
lgr.Info("Successfully registered, received certificates")
|
lgr.Info("Successfully registered, received certificates")
|
||||||
|
|
||||||
// Save certificates
|
// Save certificates
|
||||||
if err := registration.SaveCerts(cfg.CertDir, certs, key); err != nil {
|
if err := registration.SaveCerts(cfg.CertDir, certs, k); err != nil {
|
||||||
lgr.Error("Failed to save certificates", "err", err)
|
lgr.Error("Failed to save certificates", "err", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
lgr.Info("Certificates saved", "cert_dir", cfg.CertDir)
|
||||||
}
|
}
|
||||||
lgr.Info("Certificates saved", "cert_dir", cfg.CertDir)
|
|
||||||
|
|
||||||
creds, err := mtls.LoadMTLSCredentialsFromFiles(
|
creds, err := mtls.LoadMTLSCredentialsFromFiles(
|
||||||
cfg.CertDir+"/ca.crt",
|
cfg.CertDir+"/ca.crt",
|
||||||
|
|||||||
+24
-24
@@ -7,6 +7,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/docs"
|
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/docs"
|
||||||
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/config"
|
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/config"
|
||||||
@@ -59,25 +60,25 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initialize ClickHouse and log repository
|
// Initialize ClickHouse and log repository
|
||||||
var logRepo *repository.LogRepository
|
logRepo := repository.NewLogRepository()
|
||||||
if cfg.Database.Clickhouse_host != "" {
|
if cfg.Database.Clickhouse_host != "" {
|
||||||
chConn, err := storage.OpenClickHouse(storage.ClickHouseConfig{
|
go func() {
|
||||||
Host: cfg.Database.Clickhouse_host,
|
db, err := storage.OpenClickHouseWithRetry(storage.ClickHouseConfig{
|
||||||
User: cfg.Database.Clickhouse_user,
|
Host: cfg.Database.Clickhouse_host,
|
||||||
Password: cfg.Database.Clickhouse_password,
|
User: cfg.Database.Clickhouse_user,
|
||||||
Database: cfg.Database.Clickhouse_database,
|
Password: cfg.Database.Clickhouse_password,
|
||||||
})
|
Database: cfg.Database.Clickhouse_database,
|
||||||
if err != nil {
|
}, 10, 5*time.Second)
|
||||||
log.Printf("Warning: ClickHouse connection failed: %v", err)
|
if err != nil {
|
||||||
} else {
|
log.Printf("Warning: ClickHouse connection failed: %v", err)
|
||||||
logRepo = repository.NewLogRepository(chConn)
|
return
|
||||||
|
}
|
||||||
|
log.Println("ClickHouse connected successfully")
|
||||||
|
logRepo.SetDB(db)
|
||||||
if err := logRepo.Init(context.Background()); err != nil {
|
if err := logRepo.Init(context.Background()); err != nil {
|
||||||
log.Printf("Warning: Failed to initialize logs table: %v", err)
|
log.Printf("Warning: Failed to initialize logs table: %v", err)
|
||||||
} else {
|
|
||||||
log.Println("ClickHouse connected successfully")
|
|
||||||
}
|
}
|
||||||
defer chConn.Close()
|
}()
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize Collector gRPC service
|
// Initialize Collector gRPC service
|
||||||
@@ -183,15 +184,14 @@ func main() {
|
|||||||
mockLogHandlers := handlers.NewLogHandlers(nil)
|
mockLogHandlers := handlers.NewLogHandlers(nil)
|
||||||
logsGroup.GET("/mock", mockLogHandlers.GetMockLogs)
|
logsGroup.GET("/mock", mockLogHandlers.GetMockLogs)
|
||||||
|
|
||||||
if logRepo != nil {
|
// ClickHouse log handlers (always registered, work when ClickHouse connects)
|
||||||
logHandlers := handlers.NewLogHandlers(logRepo)
|
logHandlers := handlers.NewLogHandlers(logRepo)
|
||||||
logsGroup.POST("", logHandlers.Insert)
|
logsGroup.POST("", logHandlers.Insert)
|
||||||
logsGroup.POST("/batch", logHandlers.InsertBatch)
|
logsGroup.POST("/batch", logHandlers.InsertBatch)
|
||||||
logsGroup.GET("", logHandlers.Search)
|
logsGroup.GET("", logHandlers.Search)
|
||||||
logsGroup.GET("/services", logHandlers.GetServices)
|
logsGroup.GET("/services", logHandlers.GetServices)
|
||||||
logsGroup.GET("/agents", logHandlers.GetAgents)
|
logsGroup.GET("/agents", logHandlers.GetAgents)
|
||||||
logsGroup.GET("/levels", logHandlers.GetLevels)
|
logsGroup.GET("/levels", logHandlers.GetLevels)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+161
-123
@@ -17,7 +17,12 @@ const docTemplate = `{
|
|||||||
"paths": {
|
"paths": {
|
||||||
"/agents": {
|
"/agents": {
|
||||||
"get": {
|
"get": {
|
||||||
"description": "Returns a list of all agents currently connected via gRPC streaming",
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Returns a list of all agents currently connected via Collector (log streaming)",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
],
|
],
|
||||||
@@ -31,7 +36,7 @@ const docTemplate = `{
|
|||||||
"schema": {
|
"schema": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/internal_handlers.AgentInfo"
|
"$ref": "#/definitions/handlers.AgentInfo"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -71,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": {
|
||||||
@@ -114,7 +119,7 @@ const docTemplate = `{
|
|||||||
"in": "body",
|
"in": "body",
|
||||||
"required": true,
|
"required": true,
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/definitions/internal_handlers.RegisterRequest"
|
"$ref": "#/definitions/handlers.RegisterRequest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -122,7 +127,7 @@ const docTemplate = `{
|
|||||||
"200": {
|
"200": {
|
||||||
"description": "OK",
|
"description": "OK",
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/definitions/internal_handlers.RegisterResponse"
|
"$ref": "#/definitions/handlers.RegisterResponse"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -152,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -186,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -194,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": {
|
||||||
@@ -244,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -340,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -426,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": {
|
||||||
@@ -481,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -661,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -729,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -789,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -819,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": {
|
||||||
@@ -836,6 +841,11 @@ const docTemplate = `{
|
|||||||
},
|
},
|
||||||
"/logs": {
|
"/logs": {
|
||||||
"get": {
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Searches logs with various filters",
|
"description": "Searches logs with various filters",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -896,13 +906,18 @@ 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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"post": {
|
"post": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Inserts a single log entry into ClickHouse",
|
"description": "Inserts a single log entry into ClickHouse",
|
||||||
"consumes": [
|
"consumes": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -921,7 +936,7 @@ const docTemplate = `{
|
|||||||
"in": "body",
|
"in": "body",
|
||||||
"required": true,
|
"required": true,
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/definitions/internal_handlers.InsertLogRequest"
|
"$ref": "#/definitions/handlers.InsertLogRequest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -940,6 +955,11 @@ const docTemplate = `{
|
|||||||
},
|
},
|
||||||
"/logs/agents": {
|
"/logs/agents": {
|
||||||
"get": {
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Returns list of all unique agent names in logs",
|
"description": "Returns list of all unique agent names in logs",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -963,6 +983,11 @@ const docTemplate = `{
|
|||||||
},
|
},
|
||||||
"/logs/batch": {
|
"/logs/batch": {
|
||||||
"post": {
|
"post": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Inserts multiple log entries into ClickHouse",
|
"description": "Inserts multiple log entries into ClickHouse",
|
||||||
"consumes": [
|
"consumes": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -981,7 +1006,7 @@ const docTemplate = `{
|
|||||||
"in": "body",
|
"in": "body",
|
||||||
"required": true,
|
"required": true,
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/definitions/internal_handlers.InsertLogsRequest"
|
"$ref": "#/definitions/handlers.InsertLogsRequest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -1000,6 +1025,11 @@ const docTemplate = `{
|
|||||||
},
|
},
|
||||||
"/logs/levels": {
|
"/logs/levels": {
|
||||||
"get": {
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Returns list of all unique log levels in logs",
|
"description": "Returns list of all unique log levels in logs",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -1076,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1085,6 +1115,11 @@ const docTemplate = `{
|
|||||||
},
|
},
|
||||||
"/logs/services": {
|
"/logs/services": {
|
||||||
"get": {
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Returns list of all unique service names in logs",
|
"description": "Returns list of all unique service names in logs",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -1108,7 +1143,93 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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": [
|
||||||
@@ -1126,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"
|
||||||
@@ -1134,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"
|
||||||
@@ -1161,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": [
|
||||||
@@ -1173,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": [
|
||||||
@@ -1184,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": {
|
||||||
@@ -1200,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": {
|
||||||
@@ -1231,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": [
|
||||||
@@ -1243,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",
|
||||||
@@ -1258,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": {
|
||||||
@@ -1287,7 +1408,7 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.RegistrationRequest": {
|
"repository.RegistrationRequest": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"label"
|
"label"
|
||||||
@@ -1298,7 +1419,7 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenCreate": {
|
"repository.TokenCreate": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"last_name",
|
"last_name",
|
||||||
@@ -1333,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"
|
||||||
@@ -1344,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": {
|
||||||
@@ -1355,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": {
|
||||||
@@ -1372,7 +1493,7 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens": {
|
"repository.Tokens": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"id": {
|
"id": {
|
||||||
@@ -1404,7 +1525,7 @@ const docTemplate = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry": {
|
"storage.LogEntry": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"agent": {
|
"agent": {
|
||||||
@@ -1423,89 +1544,6 @@ const docTemplate = `{
|
|||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"internal_handlers.AgentInfo": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"securityDefinitions": {
|
"securityDefinitions": {
|
||||||
|
|||||||
+161
-123
@@ -6,7 +6,12 @@
|
|||||||
"paths": {
|
"paths": {
|
||||||
"/agents": {
|
"/agents": {
|
||||||
"get": {
|
"get": {
|
||||||
"description": "Returns a list of all agents currently connected via gRPC streaming",
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Returns a list of all agents currently connected via Collector (log streaming)",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
],
|
],
|
||||||
@@ -20,7 +25,7 @@
|
|||||||
"schema": {
|
"schema": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/internal_handlers.AgentInfo"
|
"$ref": "#/definitions/handlers.AgentInfo"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -52,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -60,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": {
|
||||||
@@ -103,7 +108,7 @@
|
|||||||
"in": "body",
|
"in": "body",
|
||||||
"required": true,
|
"required": true,
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/definitions/internal_handlers.RegisterRequest"
|
"$ref": "#/definitions/handlers.RegisterRequest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -111,7 +116,7 @@
|
|||||||
"200": {
|
"200": {
|
||||||
"description": "OK",
|
"description": "OK",
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/definitions/internal_handlers.RegisterResponse"
|
"$ref": "#/definitions/handlers.RegisterResponse"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -175,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -183,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": {
|
||||||
@@ -233,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -329,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -415,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": {
|
||||||
@@ -470,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -650,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -718,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -778,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -808,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": {
|
||||||
@@ -825,6 +830,11 @@
|
|||||||
},
|
},
|
||||||
"/logs": {
|
"/logs": {
|
||||||
"get": {
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Searches logs with various filters",
|
"description": "Searches logs with various filters",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -885,13 +895,18 @@
|
|||||||
"schema": {
|
"schema": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry"
|
"$ref": "#/definitions/storage.LogEntry"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"post": {
|
"post": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Inserts a single log entry into ClickHouse",
|
"description": "Inserts a single log entry into ClickHouse",
|
||||||
"consumes": [
|
"consumes": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -910,7 +925,7 @@
|
|||||||
"in": "body",
|
"in": "body",
|
||||||
"required": true,
|
"required": true,
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/definitions/internal_handlers.InsertLogRequest"
|
"$ref": "#/definitions/handlers.InsertLogRequest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -929,6 +944,11 @@
|
|||||||
},
|
},
|
||||||
"/logs/agents": {
|
"/logs/agents": {
|
||||||
"get": {
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Returns list of all unique agent names in logs",
|
"description": "Returns list of all unique agent names in logs",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -952,6 +972,11 @@
|
|||||||
},
|
},
|
||||||
"/logs/batch": {
|
"/logs/batch": {
|
||||||
"post": {
|
"post": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Inserts multiple log entries into ClickHouse",
|
"description": "Inserts multiple log entries into ClickHouse",
|
||||||
"consumes": [
|
"consumes": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -970,7 +995,7 @@
|
|||||||
"in": "body",
|
"in": "body",
|
||||||
"required": true,
|
"required": true,
|
||||||
"schema": {
|
"schema": {
|
||||||
"$ref": "#/definitions/internal_handlers.InsertLogsRequest"
|
"$ref": "#/definitions/handlers.InsertLogsRequest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -989,6 +1014,11 @@
|
|||||||
},
|
},
|
||||||
"/logs/levels": {
|
"/logs/levels": {
|
||||||
"get": {
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Returns list of all unique log levels in logs",
|
"description": "Returns list of all unique log levels in logs",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -1065,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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1074,6 +1104,11 @@
|
|||||||
},
|
},
|
||||||
"/logs/services": {
|
"/logs/services": {
|
||||||
"get": {
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"Bearer": []
|
||||||
|
}
|
||||||
|
],
|
||||||
"description": "Returns list of all unique service names in logs",
|
"description": "Returns list of all unique service names in logs",
|
||||||
"produces": [
|
"produces": [
|
||||||
"application/json"
|
"application/json"
|
||||||
@@ -1097,7 +1132,93 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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": [
|
||||||
@@ -1115,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"
|
||||||
@@ -1123,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"
|
||||||
@@ -1150,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": [
|
||||||
@@ -1162,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": [
|
||||||
@@ -1173,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": {
|
||||||
@@ -1189,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": {
|
||||||
@@ -1220,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": [
|
||||||
@@ -1232,7 +1353,7 @@
|
|||||||
"DeployTypeBinary"
|
"DeployTypeBinary"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginRequest": {
|
"repository.LoginRequest": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"login",
|
"login",
|
||||||
@@ -1247,7 +1368,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.LoginResponse": {
|
"repository.LoginResponse": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"is_active": {
|
"is_active": {
|
||||||
@@ -1276,7 +1397,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.RegistrationRequest": {
|
"repository.RegistrationRequest": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"label"
|
"label"
|
||||||
@@ -1287,7 +1408,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenCreate": {
|
"repository.TokenCreate": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"last_name",
|
"last_name",
|
||||||
@@ -1322,7 +1443,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenPasswordReset": {
|
"repository.TokenPasswordReset": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
"new_password"
|
"new_password"
|
||||||
@@ -1333,7 +1454,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdate": {
|
"repository.TokenUpdate": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"last_name": {
|
"last_name": {
|
||||||
@@ -1344,7 +1465,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.TokenUpdatePermissions": {
|
"repository.TokenUpdatePermissions": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"is_active": {
|
"is_active": {
|
||||||
@@ -1361,7 +1482,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_repository.Tokens": {
|
"repository.Tokens": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"id": {
|
"id": {
|
||||||
@@ -1393,7 +1514,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry": {
|
"storage.LogEntry": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"agent": {
|
"agent": {
|
||||||
@@ -1412,89 +1533,6 @@
|
|||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"internal_handlers.AgentInfo": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"securityDefinitions": {
|
"securityDefinitions": {
|
||||||
|
|||||||
+112
-95
@@ -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,14 +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.TokenCreate:
|
repository.TokenCreate:
|
||||||
properties:
|
properties:
|
||||||
is_active:
|
is_active:
|
||||||
type: boolean
|
type: boolean
|
||||||
@@ -154,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
|
||||||
@@ -179,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
|
||||||
@@ -200,7 +257,7 @@ definitions:
|
|||||||
token:
|
token:
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
gitea_d3m0k1d_ru_d3m0k1d_HellreigN_backend_internal_storage.LogEntry:
|
storage.LogEntry:
|
||||||
properties:
|
properties:
|
||||||
agent:
|
agent:
|
||||||
type: string
|
type: string
|
||||||
@@ -213,67 +270,13 @@ definitions:
|
|||||||
timestamp:
|
timestamp:
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
internal_handlers.AgentInfo:
|
|
||||||
properties:
|
|
||||||
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
|
|
||||||
info:
|
info:
|
||||||
contact: {}
|
contact: {}
|
||||||
paths:
|
paths:
|
||||||
/agents:
|
/agents:
|
||||||
get:
|
get:
|
||||||
description: Returns a list of all agents currently connected via gRPC streaming
|
description: Returns a list of all agents currently connected via Collector
|
||||||
|
(log streaming)
|
||||||
produces:
|
produces:
|
||||||
- application/json
|
- application/json
|
||||||
responses:
|
responses:
|
||||||
@@ -281,8 +284,10 @@ paths:
|
|||||||
description: OK
|
description: OK
|
||||||
schema:
|
schema:
|
||||||
items:
|
items:
|
||||||
$ref: '#/definitions/internal_handlers.AgentInfo'
|
$ref: '#/definitions/handlers.AgentInfo'
|
||||||
type: array
|
type: array
|
||||||
|
security:
|
||||||
|
- Bearer: []
|
||||||
summary: Get connected agents
|
summary: Get connected agents
|
||||||
tags:
|
tags:
|
||||||
- agents
|
- agents
|
||||||
@@ -298,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:
|
||||||
@@ -333,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
|
||||||
@@ -354,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:
|
||||||
@@ -380,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:
|
||||||
@@ -442,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
|
||||||
@@ -481,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
|
||||||
@@ -538,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:
|
||||||
@@ -575,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
|
||||||
@@ -694,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
|
||||||
@@ -739,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
|
||||||
@@ -778,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
|
||||||
@@ -798,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:
|
||||||
@@ -849,8 +854,10 @@ 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:
|
||||||
|
- Bearer: []
|
||||||
summary: Search logs
|
summary: Search logs
|
||||||
tags:
|
tags:
|
||||||
- logs
|
- logs
|
||||||
@@ -864,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:
|
||||||
@@ -874,6 +881,8 @@ paths:
|
|||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
|
security:
|
||||||
|
- Bearer: []
|
||||||
summary: Insert log entry
|
summary: Insert log entry
|
||||||
tags:
|
tags:
|
||||||
- logs
|
- logs
|
||||||
@@ -889,6 +898,8 @@ paths:
|
|||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
security:
|
||||||
|
- Bearer: []
|
||||||
summary: Get distinct agents
|
summary: Get distinct agents
|
||||||
tags:
|
tags:
|
||||||
- logs
|
- logs
|
||||||
@@ -903,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:
|
||||||
@@ -913,6 +924,8 @@ paths:
|
|||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
|
security:
|
||||||
|
- Bearer: []
|
||||||
summary: Insert log entries (batch)
|
summary: Insert log entries (batch)
|
||||||
tags:
|
tags:
|
||||||
- logs
|
- logs
|
||||||
@@ -928,6 +941,8 @@ paths:
|
|||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
security:
|
||||||
|
- Bearer: []
|
||||||
summary: Get distinct log levels
|
summary: Get distinct log levels
|
||||||
tags:
|
tags:
|
||||||
- logs
|
- logs
|
||||||
@@ -965,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: []
|
||||||
@@ -984,6 +999,8 @@ paths:
|
|||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
security:
|
||||||
|
- Bearer: []
|
||||||
summary: Get distinct services
|
summary: Get distinct services
|
||||||
tags:
|
tags:
|
||||||
- logs
|
- logs
|
||||||
|
|||||||
@@ -81,8 +81,8 @@ func (c *Collector) Stream(stream proto.Collector_StreamServer) error {
|
|||||||
log.Printf("Agent %s connected, streaming logs for service: %s", agentName, service)
|
log.Printf("Agent %s connected, streaming logs for service: %s", agentName, service)
|
||||||
|
|
||||||
// If no ClickHouse, just consume the stream without storing
|
// If no ClickHouse, just consume the stream without storing
|
||||||
if c.logRepo == nil {
|
if !c.logRepo.IsConnected() {
|
||||||
log.Printf("Warning: logRepo is nil, consuming logs without storing for agent %s", agentName)
|
log.Printf("Warning: ClickHouse not connected yet, consuming logs without storing for agent %s", agentName)
|
||||||
for {
|
for {
|
||||||
_, err := stream.Recv()
|
_, err := stream.Recv()
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ type AgentInfo struct {
|
|||||||
// @Summary Get connected agents
|
// @Summary Get connected agents
|
||||||
// @Description Returns a list of all agents currently connected via Collector (log streaming)
|
// @Description Returns a list of all agents currently connected via Collector (log streaming)
|
||||||
// @Tags agents
|
// @Tags agents
|
||||||
|
// @Security Bearer
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {array} AgentInfo
|
// @Success 200 {array} AgentInfo
|
||||||
// @Router /agents [get]
|
// @Router /agents [get]
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ type InsertLogRequest struct {
|
|||||||
// @Produce json
|
// @Produce json
|
||||||
// @Param body body InsertLogRequest true "Log entry"
|
// @Param body body InsertLogRequest true "Log entry"
|
||||||
// @Success 201 {object} map[string]string
|
// @Success 201 {object} map[string]string
|
||||||
|
// @Security Bearer
|
||||||
// @Router /logs [post]
|
// @Router /logs [post]
|
||||||
func (lh *LogHandlers) Insert(c *gin.Context) {
|
func (lh *LogHandlers) Insert(c *gin.Context) {
|
||||||
var req InsertLogRequest
|
var req InsertLogRequest
|
||||||
@@ -72,6 +73,7 @@ type InsertLogsRequest struct {
|
|||||||
// @Produce json
|
// @Produce json
|
||||||
// @Param body body InsertLogsRequest true "Log entries"
|
// @Param body body InsertLogsRequest true "Log entries"
|
||||||
// @Success 201 {object} map[string]string
|
// @Success 201 {object} map[string]string
|
||||||
|
// @Security Bearer
|
||||||
// @Router /logs/batch [post]
|
// @Router /logs/batch [post]
|
||||||
func (lh *LogHandlers) InsertBatch(c *gin.Context) {
|
func (lh *LogHandlers) InsertBatch(c *gin.Context) {
|
||||||
var req InsertLogsRequest
|
var req InsertLogsRequest
|
||||||
@@ -124,6 +126,7 @@ type SearchLogsRequest struct {
|
|||||||
// @Param limit query int false "Limit results" default(100)
|
// @Param limit query int false "Limit results" default(100)
|
||||||
// @Param offset query int false "Offset results" default(0)
|
// @Param offset query int false "Offset results" default(0)
|
||||||
// @Success 200 {array} storage.LogEntry
|
// @Success 200 {array} storage.LogEntry
|
||||||
|
// @Security Bearer
|
||||||
// @Router /logs [get]
|
// @Router /logs [get]
|
||||||
func (lh *LogHandlers) Search(c *gin.Context) {
|
func (lh *LogHandlers) Search(c *gin.Context) {
|
||||||
var req SearchLogsRequest
|
var req SearchLogsRequest
|
||||||
@@ -170,6 +173,7 @@ func (lh *LogHandlers) Search(c *gin.Context) {
|
|||||||
// @Tags logs
|
// @Tags logs
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {array} string
|
// @Success 200 {array} string
|
||||||
|
// @Security Bearer
|
||||||
// @Router /logs/services [get]
|
// @Router /logs/services [get]
|
||||||
func (lh *LogHandlers) GetServices(c *gin.Context) {
|
func (lh *LogHandlers) GetServices(c *gin.Context) {
|
||||||
services, err := lh.LogRepo.GetDistinctServices(c.Request.Context())
|
services, err := lh.LogRepo.GetDistinctServices(c.Request.Context())
|
||||||
@@ -190,6 +194,7 @@ func (lh *LogHandlers) GetServices(c *gin.Context) {
|
|||||||
// @Tags logs
|
// @Tags logs
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {array} string
|
// @Success 200 {array} string
|
||||||
|
// @Security Bearer
|
||||||
// @Router /logs/agents [get]
|
// @Router /logs/agents [get]
|
||||||
func (lh *LogHandlers) GetAgents(c *gin.Context) {
|
func (lh *LogHandlers) GetAgents(c *gin.Context) {
|
||||||
agents, err := lh.LogRepo.GetDistinctAgents(c.Request.Context())
|
agents, err := lh.LogRepo.GetDistinctAgents(c.Request.Context())
|
||||||
@@ -210,6 +215,7 @@ func (lh *LogHandlers) GetAgents(c *gin.Context) {
|
|||||||
// @Tags logs
|
// @Tags logs
|
||||||
// @Produce json
|
// @Produce json
|
||||||
// @Success 200 {array} string
|
// @Success 200 {array} string
|
||||||
|
// @Security Bearer
|
||||||
// @Router /logs/levels [get]
|
// @Router /logs/levels [get]
|
||||||
func (lh *LogHandlers) GetLevels(c *gin.Context) {
|
func (lh *LogHandlers) GetLevels(c *gin.Context) {
|
||||||
levels, err := lh.LogRepo.GetDistinctLevels(c.Request.Context())
|
levels, err := lh.LogRepo.GetDistinctLevels(c.Request.Context())
|
||||||
|
|||||||
@@ -2,44 +2,85 @@ package repository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/storage"
|
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/storage"
|
||||||
"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type LogRepository struct {
|
type LogRepository struct {
|
||||||
Conn driver.Conn
|
mu sync.RWMutex
|
||||||
|
DB *sql.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLogRepository(conn driver.Conn) *LogRepository {
|
func NewLogRepository() *LogRepository {
|
||||||
return &LogRepository{Conn: conn}
|
return &LogRepository{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *LogRepository) SetDB(db *sql.DB) {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
r.DB = db
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *LogRepository) IsConnected() bool {
|
||||||
|
r.mu.RLock()
|
||||||
|
defer r.mu.RUnlock()
|
||||||
|
return r.DB != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *LogRepository) getDB() *sql.DB {
|
||||||
|
r.mu.RLock()
|
||||||
|
defer r.mu.RUnlock()
|
||||||
|
return r.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LogRepository) Init(ctx context.Context) error {
|
func (r *LogRepository) Init(ctx context.Context) error {
|
||||||
return r.Conn.Exec(ctx, storage.CreateLogsTable)
|
db := r.getDB()
|
||||||
|
if db == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
_, err := db.ExecContext(ctx, storage.CreateLogsTable)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LogRepository) Insert(ctx context.Context, log storage.LogEntry) error {
|
func (r *LogRepository) Insert(ctx context.Context, log storage.LogEntry) error {
|
||||||
return r.Conn.Exec(ctx, `
|
db := r.getDB()
|
||||||
|
if db == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
_, err := db.ExecContext(ctx, `
|
||||||
INSERT INTO logs (timestamp, level, service, agent, message)
|
INSERT INTO logs (timestamp, level, service, agent, message)
|
||||||
VALUES ($1, $2, $3, $4, $5)
|
VALUES ($1, $2, $3, $4, $5)
|
||||||
`, log.Timestamp, log.Level, log.Service, log.Agent, log.Message)
|
`, log.Timestamp, log.Level, log.Service, log.Agent, log.Message)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LogRepository) InsertBatch(ctx context.Context, logs []storage.LogEntry) error {
|
func (r *LogRepository) InsertBatch(ctx context.Context, logs []storage.LogEntry) error {
|
||||||
batch, err := r.Conn.PrepareBatch(ctx, "INSERT INTO logs (timestamp, level, service, agent, message)")
|
db := r.getDB()
|
||||||
if err != nil {
|
if db == nil {
|
||||||
return err
|
return nil
|
||||||
|
}
|
||||||
|
if len(logs) == 0 {
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, log := range logs {
|
// Build multi-row INSERT statement
|
||||||
if err := batch.Append(log.Timestamp, log.Level, log.Service, log.Agent, log.Message); err != nil {
|
query := "INSERT INTO logs (timestamp, level, service, agent, message) VALUES "
|
||||||
return err
|
args := make([]interface{}, 0, len(logs)*5)
|
||||||
|
for i, log := range logs {
|
||||||
|
if i > 0 {
|
||||||
|
query += ", "
|
||||||
}
|
}
|
||||||
|
query += fmt.Sprintf("($%d, $%d, $%d, $%d, $%d)",
|
||||||
|
i*5+1, i*5+2, i*5+3, i*5+4, i*5+5)
|
||||||
|
args = append(args, log.Timestamp, log.Level, log.Service, log.Agent, log.Message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return batch.Send()
|
_, err := db.ExecContext(ctx, query, args...)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
type LogFilter struct {
|
type LogFilter struct {
|
||||||
@@ -53,6 +94,11 @@ type LogFilter struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *LogRepository) Search(ctx context.Context, filter LogFilter) ([]storage.LogEntry, error) {
|
func (r *LogRepository) Search(ctx context.Context, filter LogFilter) ([]storage.LogEntry, error) {
|
||||||
|
db := r.getDB()
|
||||||
|
if db == nil {
|
||||||
|
return []storage.LogEntry{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
query := "SELECT timestamp, level, service, agent, message FROM logs WHERE 1=1"
|
query := "SELECT timestamp, level, service, agent, message FROM logs WHERE 1=1"
|
||||||
args := make([]interface{}, 0)
|
args := make([]interface{}, 0)
|
||||||
argIdx := 1
|
argIdx := 1
|
||||||
@@ -102,13 +148,13 @@ func (r *LogRepository) Search(ctx context.Context, filter LogFilter) ([]storage
|
|||||||
args = append(args, filter.Offset)
|
args = append(args, filter.Offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
rows, err := r.Conn.Query(ctx, query, args...)
|
rows, err := db.QueryContext(ctx, query, args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
var logs []storage.LogEntry
|
logs := make([]storage.LogEntry, 0)
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var log storage.LogEntry
|
var log storage.LogEntry
|
||||||
if err := rows.Scan(&log.Timestamp, &log.Level, &log.Service, &log.Agent, &log.Message); err != nil {
|
if err := rows.Scan(&log.Timestamp, &log.Level, &log.Service, &log.Agent, &log.Message); err != nil {
|
||||||
@@ -121,13 +167,17 @@ func (r *LogRepository) Search(ctx context.Context, filter LogFilter) ([]storage
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *LogRepository) GetDistinctServices(ctx context.Context) ([]string, error) {
|
func (r *LogRepository) GetDistinctServices(ctx context.Context) ([]string, error) {
|
||||||
rows, err := r.Conn.Query(ctx, "SELECT DISTINCT service FROM logs ORDER BY service")
|
db := r.getDB()
|
||||||
|
if db == nil {
|
||||||
|
return []string{}, nil
|
||||||
|
}
|
||||||
|
rows, err := db.QueryContext(ctx, "SELECT DISTINCT service FROM logs ORDER BY service")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
var services []string
|
services := make([]string, 0)
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var service string
|
var service string
|
||||||
if err := rows.Scan(&service); err != nil {
|
if err := rows.Scan(&service); err != nil {
|
||||||
@@ -140,13 +190,17 @@ func (r *LogRepository) GetDistinctServices(ctx context.Context) ([]string, erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *LogRepository) GetDistinctAgents(ctx context.Context) ([]string, error) {
|
func (r *LogRepository) GetDistinctAgents(ctx context.Context) ([]string, error) {
|
||||||
rows, err := r.Conn.Query(ctx, "SELECT DISTINCT agent FROM logs ORDER BY agent")
|
db := r.getDB()
|
||||||
|
if db == nil {
|
||||||
|
return []string{}, nil
|
||||||
|
}
|
||||||
|
rows, err := db.QueryContext(ctx, "SELECT DISTINCT agent FROM logs ORDER BY agent")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
var agents []string
|
agents := make([]string, 0)
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var agent string
|
var agent string
|
||||||
if err := rows.Scan(&agent); err != nil {
|
if err := rows.Scan(&agent); err != nil {
|
||||||
@@ -159,13 +213,17 @@ func (r *LogRepository) GetDistinctAgents(ctx context.Context) ([]string, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *LogRepository) GetDistinctLevels(ctx context.Context) ([]string, error) {
|
func (r *LogRepository) GetDistinctLevels(ctx context.Context) ([]string, error) {
|
||||||
rows, err := r.Conn.Query(ctx, "SELECT DISTINCT level FROM logs ORDER BY level")
|
db := r.getDB()
|
||||||
|
if db == nil {
|
||||||
|
return []string{}, nil
|
||||||
|
}
|
||||||
|
rows, err := db.QueryContext(ctx, "SELECT DISTINCT level FROM logs ORDER BY level")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
|
|
||||||
var levels []string
|
levels := make([]string, 0)
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var level string
|
var level string
|
||||||
if err := rows.Scan(&level); err != nil {
|
if err := rows.Scan(&level); err != nil {
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ package storage
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ClickHouse/clickhouse-go/v2"
|
_ "github.com/ClickHouse/clickhouse-go/v2"
|
||||||
"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ClickHouseConfig struct {
|
type ClickHouseConfig struct {
|
||||||
@@ -15,33 +17,46 @@ type ClickHouseConfig struct {
|
|||||||
Database string
|
Database string
|
||||||
}
|
}
|
||||||
|
|
||||||
func OpenClickHouse(cfg ClickHouseConfig) (driver.Conn, error) {
|
func OpenClickHouse(cfg ClickHouseConfig) (*sql.DB, error) {
|
||||||
conn, err := clickhouse.Open(&clickhouse.Options{
|
dsn := fmt.Sprintf("clickhouse://%s:%s@%s/%s",
|
||||||
Addr: []string{cfg.Host},
|
cfg.User, cfg.Password, cfg.Host, cfg.Database)
|
||||||
Auth: clickhouse.Auth{
|
|
||||||
Database: cfg.Database,
|
db, err := sql.Open("clickhouse", dsn)
|
||||||
Username: cfg.User,
|
|
||||||
Password: cfg.Password,
|
|
||||||
},
|
|
||||||
Settings: clickhouse.Settings{
|
|
||||||
"max_execution_time": 60,
|
|
||||||
},
|
|
||||||
Compression: &clickhouse.Compression{
|
|
||||||
Method: clickhouse.CompressionLZ4,
|
|
||||||
},
|
|
||||||
DialTimeout: 30,
|
|
||||||
MaxOpenConns: 10,
|
|
||||||
MaxIdleConns: 5,
|
|
||||||
ConnMaxLifetime: 3600,
|
|
||||||
ConnOpenStrategy: clickhouse.ConnOpenInOrder,
|
|
||||||
})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("clickhouse connect: %w", err)
|
return nil, fmt.Errorf("clickhouse open: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := conn.Ping(context.Background()); err != nil {
|
db.SetMaxOpenConns(5)
|
||||||
|
db.SetMaxIdleConns(2)
|
||||||
|
db.SetConnMaxLifetime(10 * time.Minute)
|
||||||
|
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
if err := db.PingContext(ctx); err != nil {
|
||||||
|
db.Close()
|
||||||
return nil, fmt.Errorf("clickhouse ping: %w", err)
|
return nil, fmt.Errorf("clickhouse ping: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return conn, nil
|
log.Printf("ClickHouse connected via database/sql: %s", cfg.Host)
|
||||||
|
return db, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenClickHouseWithRetry attempts to connect to ClickHouse with retries and backoff.
|
||||||
|
func OpenClickHouseWithRetry(cfg ClickHouseConfig, maxRetries int, initialDelay time.Duration) (*sql.DB, error) {
|
||||||
|
var lastErr error
|
||||||
|
delay := initialDelay
|
||||||
|
|
||||||
|
for i := 0; i < maxRetries; i++ {
|
||||||
|
db, err := OpenClickHouse(cfg)
|
||||||
|
if err == nil {
|
||||||
|
return db, nil
|
||||||
|
}
|
||||||
|
lastErr = err
|
||||||
|
log.Printf("ClickHouse connection attempt %d/%d failed: %v, retrying in %v...", i+1, maxRetries, err, delay)
|
||||||
|
time.Sleep(delay)
|
||||||
|
delay *= 2
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("clickhouse connection failed after %d attempts: %w", maxRetries, lastErr)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,3 +3,6 @@ grpc_url: backend:9001
|
|||||||
label: test-agent-1
|
label: test-agent-1
|
||||||
registration_token: "156616b56774d59ba53f1eb4b096488bb5f755bbf5b737d93a42bb1b583ad7fb"
|
registration_token: "156616b56774d59ba53f1eb4b096488bb5f755bbf5b737d93a42bb1b583ad7fb"
|
||||||
cert_dir: /etc/hellreign-agent/certs
|
cert_dir: /etc/hellreign-agent/certs
|
||||||
|
services:
|
||||||
|
- name: system
|
||||||
|
type: journald
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ clickhouse-client --query "CREATE DATABASE IF NOT EXISTS hellreign;"
|
|||||||
clickhouse-client --query "
|
clickhouse-client --query "
|
||||||
CREATE TABLE IF NOT EXISTS hellreign.logs (
|
CREATE TABLE IF NOT EXISTS hellreign.logs (
|
||||||
timestamp DateTime64(3) DEFAULT now(),
|
timestamp DateTime64(3) DEFAULT now(),
|
||||||
level String,
|
level LowCardinality(String),
|
||||||
service String,
|
service LowCardinality(String),
|
||||||
message String,
|
agent LowCardinality(String),
|
||||||
host String,
|
message String
|
||||||
trace_id String
|
|
||||||
) ENGINE = MergeTree()
|
) ENGINE = MergeTree()
|
||||||
ORDER BY (timestamp, service, level);
|
ORDER BY (timestamp, level, service, agent)
|
||||||
|
SETTINGS index_granularity = 8192;
|
||||||
"
|
"
|
||||||
|
|||||||
@@ -13,6 +13,12 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- clickhouse_data:/var/lib/clickhouse
|
- clickhouse_data:/var/lib/clickhouse
|
||||||
- ./clickhouse/init:/docker-entrypoint-initdb.d
|
- ./clickhouse/init:/docker-entrypoint-initdb.d
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8123/ping"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 20
|
||||||
|
start_period: 30s
|
||||||
networks:
|
networks:
|
||||||
- hellreign
|
- hellreign
|
||||||
|
|
||||||
@@ -33,7 +39,8 @@ services:
|
|||||||
- ./backend/config.yml:/etc/hellreign/config.yml:ro
|
- ./backend/config.yml:/etc/hellreign/config.yml:ro
|
||||||
- backend_data:/var/lib/hellreign
|
- backend_data:/var/lib/hellreign
|
||||||
depends_on:
|
depends_on:
|
||||||
- clickhouse
|
clickhouse:
|
||||||
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- hellreign
|
- hellreign
|
||||||
|
|
||||||
@@ -56,9 +63,13 @@ services:
|
|||||||
container_name: hellreign-agent
|
container_name: hellreign-agent
|
||||||
environment:
|
environment:
|
||||||
CONFIG_FILE: /etc/hellreign-agent/config.yml
|
CONFIG_FILE: /etc/hellreign-agent/config.yml
|
||||||
|
JOURNALD_LOGDIR: /var/log/journal
|
||||||
|
BUFFER_DB: /var/lib/hellreign-agent/agent_buffer.db
|
||||||
volumes:
|
volumes:
|
||||||
- ./agent/config.yml:/etc/hellreign-agent/config.yml:ro
|
- ./agent/config.yml:/etc/hellreign-agent/config.yml:ro
|
||||||
- agent_certs:/etc/hellreign-agent/certs
|
- agent_certs:/etc/hellreign-agent/certs
|
||||||
|
- agent_data:/var/lib/hellreign-agent
|
||||||
|
- /var/log/journal:/var/log/journal:ro
|
||||||
depends_on:
|
depends_on:
|
||||||
- backend
|
- backend
|
||||||
networks:
|
networks:
|
||||||
@@ -71,6 +82,8 @@ volumes:
|
|||||||
driver: local
|
driver: local
|
||||||
agent_certs:
|
agent_certs:
|
||||||
driver: local
|
driver: local
|
||||||
|
agent_data:
|
||||||
|
driver: local
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
hellreign:
|
hellreign:
|
||||||
|
|||||||
Reference in New Issue
Block a user