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:
Fimeg
2025-11-10 22:32:22 -05:00
parent e1173c9f3b
commit 455bc75044
3 changed files with 74 additions and 25 deletions

View File

@@ -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 := ""

View File

@@ -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

View File

@@ -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,