fix: ConfigService now reads subsystems from database
Critical regression fix - subsystems were hardcoded instead of reading user settings. Added CreateDefaultSubsystems to queries/subsystems.go. ConfigService now queries agent_subsystems table for actual user configuration. AgentLifecycleService creates default subsystems when creating new agents. Respects user-configured enabled/auto_run settings from UI.
This commit is contained in:
@@ -280,6 +280,23 @@ func (q *SubsystemQueries) DeleteSubsystem(agentID uuid.UUID, subsystem string)
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateDefaultSubsystems creates default subsystems for a new agent
|
||||||
|
func (q *SubsystemQueries) CreateDefaultSubsystems(agentID uuid.UUID) error {
|
||||||
|
defaults := []models.AgentSubsystem{
|
||||||
|
{AgentID: agentID, Subsystem: "updates", Enabled: true, AutoRun: true, IntervalMinutes: 60},
|
||||||
|
{AgentID: agentID, Subsystem: "storage", Enabled: true, AutoRun: true, IntervalMinutes: 5},
|
||||||
|
{AgentID: agentID, Subsystem: "system", Enabled: true, AutoRun: true, IntervalMinutes: 5},
|
||||||
|
{AgentID: agentID, Subsystem: "docker", Enabled: true, AutoRun: true, IntervalMinutes: 15},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, sub := range defaults {
|
||||||
|
if err := q.CreateSubsystem(&sub); err != nil {
|
||||||
|
return fmt.Errorf("failed to create subsystem %s: %w", sub.Subsystem, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Helper function to join update statements
|
// Helper function to join update statements
|
||||||
func joinUpdates(updates []string) string {
|
func joinUpdates(updates []string) string {
|
||||||
result := ""
|
result := ""
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Fimeg/RedFlag/aggregator-server/internal/config"
|
"github.com/Fimeg/RedFlag/aggregator-server/internal/config"
|
||||||
|
"github.com/Fimeg/RedFlag/aggregator-server/internal/database/queries"
|
||||||
"github.com/Fimeg/RedFlag/aggregator-server/internal/models"
|
"github.com/Fimeg/RedFlag/aggregator-server/internal/models"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/jmoiron/sqlx"
|
"github.com/jmoiron/sqlx"
|
||||||
@@ -40,6 +41,7 @@ type AgentLifecycleService struct {
|
|||||||
buildService *BuildService
|
buildService *BuildService
|
||||||
configService *ConfigService
|
configService *ConfigService
|
||||||
artifactService *ArtifactService
|
artifactService *ArtifactService
|
||||||
|
subsystemQueries *queries.SubsystemQueries
|
||||||
logger *log.Logger
|
logger *log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,6 +57,7 @@ func NewAgentLifecycleService(
|
|||||||
buildService: NewBuildService(db, cfg, logger),
|
buildService: NewBuildService(db, cfg, logger),
|
||||||
configService: NewConfigService(db, cfg, logger),
|
configService: NewConfigService(db, cfg, logger),
|
||||||
artifactService: NewArtifactService(db, cfg, logger),
|
artifactService: NewArtifactService(db, cfg, logger),
|
||||||
|
subsystemQueries: queries.NewSubsystemQueries(db),
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -190,7 +193,17 @@ func (s *AgentLifecycleService) createAgent(
|
|||||||
VALUES (:id, :hostname, :os_type, :agent_version, :machine_id, :created_at, :updated_at)
|
VALUES (:id, :hostname, :os_type, :agent_version, :machine_id, :created_at, :updated_at)
|
||||||
`
|
`
|
||||||
_, err := s.db.NamedExecContext(ctx, query, agent)
|
_, err := s.db.NamedExecContext(ctx, query, agent)
|
||||||
return err
|
if err != nil {
|
||||||
|
return fmt.Errorf("agent record creation failed: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create default subsystems for new agent
|
||||||
|
if err := s.subsystemQueries.CreateDefaultSubsystems(agent.ID); err != nil {
|
||||||
|
s.logger.Printf("Warning: failed to create default subsystems: %v", err)
|
||||||
|
// Non-fatal error - agent still created
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateAgent updates existing agent record
|
// updateAgent updates existing agent record
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Fimeg/RedFlag/aggregator-server/internal/config"
|
"github.com/Fimeg/RedFlag/aggregator-server/internal/config"
|
||||||
|
"github.com/Fimeg/RedFlag/aggregator-server/internal/database/queries"
|
||||||
"github.com/Fimeg/RedFlag/aggregator-server/internal/models"
|
"github.com/Fimeg/RedFlag/aggregator-server/internal/models"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/jmoiron/sqlx"
|
"github.com/jmoiron/sqlx"
|
||||||
@@ -18,6 +19,7 @@ type ConfigService struct {
|
|||||||
db *sqlx.DB
|
db *sqlx.DB
|
||||||
config *config.Config
|
config *config.Config
|
||||||
logger *log.Logger
|
logger *log.Logger
|
||||||
|
subsystemQueries *queries.SubsystemQueries
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewConfigService creates a new configuration service
|
// NewConfigService creates a new configuration service
|
||||||
@@ -26,6 +28,7 @@ func NewConfigService(db *sqlx.DB, cfg *config.Config, logger *log.Logger) *Conf
|
|||||||
db: db,
|
db: db,
|
||||||
config: cfg,
|
config: cfg,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
subsystemQueries: queries.NewSubsystemQueries(db),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,6 +61,27 @@ func (s *ConfigService) GenerateNewConfig(agentCfg *AgentConfig) ([]byte, error)
|
|||||||
serverURL = s.config.Server.PublicURL
|
serverURL = s.config.Server.PublicURL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get subsystems from database (not hardcoded!)
|
||||||
|
agentID := uuid.MustParse(agentCfg.AgentID)
|
||||||
|
subsystems, err := s.subsystemQueries.GetSubsystems(agentID)
|
||||||
|
if err != nil || len(subsystems) == 0 {
|
||||||
|
// If not found, create defaults
|
||||||
|
if err := s.subsystemQueries.CreateDefaultSubsystems(agentID); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to create default subsystems: %w", err)
|
||||||
|
}
|
||||||
|
subsystems, _ = s.subsystemQueries.GetSubsystems(agentID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert to map format for JSON
|
||||||
|
subsystemMap := make(map[string]interface{})
|
||||||
|
for _, sub := range subsystems {
|
||||||
|
subsystemMap[sub.Subsystem] = map[string]interface{}{
|
||||||
|
"enabled": sub.Enabled,
|
||||||
|
"auto_run": sub.AutoRun,
|
||||||
|
"interval": sub.IntervalMinutes,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cfg := &AgentConfigData{
|
cfg := &AgentConfigData{
|
||||||
AgentID: agentCfg.AgentID,
|
AgentID: agentCfg.AgentID,
|
||||||
Version: agentCfg.Version,
|
Version: agentCfg.Version,
|
||||||
@@ -69,12 +93,7 @@ func (s *ConfigService) GenerateNewConfig(agentCfg *AgentConfig) ([]byte, error)
|
|||||||
"updates": 3600, // 1 hour
|
"updates": 3600, // 1 hour
|
||||||
"commands": 30, // 30 seconds
|
"commands": 30, // 30 seconds
|
||||||
},
|
},
|
||||||
Subsystems: map[string]interface{}{
|
Subsystems: subsystemMap, // ← USE DATABASE VALUES!
|
||||||
"updates": map[string]interface{}{"enabled": true, "auto_run": true, "timeout": 300},
|
|
||||||
"storage": map[string]interface{}{"enabled": true, "auto_run": true, "timeout": 60},
|
|
||||||
"system": map[string]interface{}{"enabled": true, "auto_run": true, "timeout": 60},
|
|
||||||
"docker": map[string]interface{}{"enabled": true, "auto_run": true, "timeout": 120},
|
|
||||||
},
|
|
||||||
MaxRetries: 3,
|
MaxRetries: 3,
|
||||||
TimeoutSeconds: 30,
|
TimeoutSeconds: 30,
|
||||||
MachineID: agentCfg.MachineID,
|
MachineID: agentCfg.MachineID,
|
||||||
|
|||||||
Reference in New Issue
Block a user