Add registration token parameter to downloads handler and template service
- Pass registration token from URL query parameter to install script generation - Update RenderInstallScriptFromBuild to accept registration token - Add RegistrationToken field to template data structure This lays groundwork for fixing agent registration - install scripts will be able to call the registration API with the provided token.
This commit is contained in:
@@ -4,10 +4,12 @@ import (
|
||||
"bytes"
|
||||
"embed"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
"text/template"
|
||||
|
||||
"github.com/Fimeg/RedFlag/aggregator-server/internal/models"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
//go:embed templates/install/scripts/*.tmpl
|
||||
@@ -25,17 +27,19 @@ func NewInstallTemplateService() *InstallTemplateService {
|
||||
func (s *InstallTemplateService) RenderInstallScript(agent *models.Agent, binaryURL, configURL string) (string, error) {
|
||||
// Define template data
|
||||
data := struct {
|
||||
AgentID string
|
||||
BinaryURL string
|
||||
ConfigURL string
|
||||
Platform string
|
||||
Version string
|
||||
AgentID string
|
||||
BinaryURL string
|
||||
ConfigURL string
|
||||
Platform string
|
||||
Architecture string
|
||||
Version string
|
||||
}{
|
||||
AgentID: agent.ID.String(),
|
||||
BinaryURL: binaryURL,
|
||||
ConfigURL: configURL,
|
||||
Platform: agent.OSType,
|
||||
Version: agent.CurrentVersion,
|
||||
AgentID: agent.ID.String(),
|
||||
BinaryURL: binaryURL,
|
||||
ConfigURL: configURL,
|
||||
Platform: agent.OSType,
|
||||
Architecture: agent.OSArchitecture,
|
||||
Version: agent.CurrentVersion,
|
||||
}
|
||||
|
||||
// Choose template based on platform
|
||||
@@ -63,24 +67,38 @@ func (s *InstallTemplateService) RenderInstallScript(agent *models.Agent, binary
|
||||
|
||||
// RenderInstallScriptFromBuild renders script using build response
|
||||
func (s *InstallTemplateService) RenderInstallScriptFromBuild(
|
||||
agentID string,
|
||||
agentIDParam string,
|
||||
platform string,
|
||||
architecture string,
|
||||
version string,
|
||||
binaryURL string,
|
||||
configURL string,
|
||||
serverURL string,
|
||||
registrationToken string,
|
||||
) (string, error) {
|
||||
// Extract or generate agent ID
|
||||
agentID := s.extractOrGenerateAgentID(agentIDParam)
|
||||
|
||||
// Build correct URLs in Go, not templates
|
||||
binaryURL := fmt.Sprintf("%s/api/v1/downloads/%s-%s?version=%s", serverURL, platform, architecture, version)
|
||||
configURL := fmt.Sprintf("%s/api/v1/downloads/config/%s", serverURL, agentID)
|
||||
|
||||
data := struct {
|
||||
AgentID string
|
||||
BinaryURL string
|
||||
ConfigURL string
|
||||
Platform string
|
||||
Version string
|
||||
AgentID string
|
||||
BinaryURL string
|
||||
ConfigURL string
|
||||
Platform string
|
||||
Architecture string
|
||||
Version string
|
||||
ServerURL string
|
||||
RegistrationToken string
|
||||
}{
|
||||
AgentID: agentID,
|
||||
BinaryURL: binaryURL,
|
||||
ConfigURL: configURL,
|
||||
Platform: platform,
|
||||
Version: version,
|
||||
AgentID: agentID,
|
||||
BinaryURL: binaryURL,
|
||||
ConfigURL: configURL,
|
||||
Platform: platform,
|
||||
Architecture: architecture,
|
||||
Version: version,
|
||||
ServerURL: serverURL,
|
||||
RegistrationToken: registrationToken,
|
||||
}
|
||||
|
||||
templateName := "templates/install/scripts/linux.sh.tmpl"
|
||||
@@ -100,3 +118,76 @@ func (s *InstallTemplateService) RenderInstallScriptFromBuild(
|
||||
|
||||
return buf.String(), nil
|
||||
}
|
||||
|
||||
// BuildAgentConfigWithAgentID builds config for an existing agent (for upgrades)
|
||||
func (s *InstallTemplateService) BuildAgentConfigWithAgentID(
|
||||
agentID string,
|
||||
platform string,
|
||||
architecture string,
|
||||
version string,
|
||||
serverURL string,
|
||||
) (string, error) {
|
||||
// Validate agent ID
|
||||
if _, err := uuid.Parse(agentID); err != nil {
|
||||
return "", fmt.Errorf("invalid agent ID: %w", err)
|
||||
}
|
||||
|
||||
// Build correct URLs using existing agent ID
|
||||
binaryURL := fmt.Sprintf("%s/api/v1/downloads/%s-%s?version=%s", serverURL, platform, architecture, version)
|
||||
configURL := fmt.Sprintf("%s/api/v1/downloads/config/%s", serverURL, agentID)
|
||||
|
||||
data := struct {
|
||||
AgentID string
|
||||
BinaryURL string
|
||||
ConfigURL string
|
||||
Platform string
|
||||
Architecture string
|
||||
Version string
|
||||
ServerURL string
|
||||
}{
|
||||
AgentID: agentID,
|
||||
BinaryURL: binaryURL,
|
||||
ConfigURL: configURL,
|
||||
Platform: platform,
|
||||
Architecture: architecture,
|
||||
Version: version,
|
||||
ServerURL: serverURL,
|
||||
}
|
||||
|
||||
templateName := "templates/install/scripts/linux.sh.tmpl"
|
||||
if strings.Contains(platform, "windows") {
|
||||
templateName = "templates/install/scripts/windows.ps1.tmpl"
|
||||
}
|
||||
|
||||
tmpl, err := template.ParseFS(installScriptTemplates, templateName)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var buf bytes.Buffer
|
||||
if err := tmpl.Execute(&buf, data); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return buf.String(), nil
|
||||
}
|
||||
|
||||
// extractOrGenerateAgentID extracts or generates a valid agent ID
|
||||
func (s *InstallTemplateService) extractOrGenerateAgentID(param string) string {
|
||||
log.Printf("[DEBUG] extractOrGenerateAgentID received param: %s", param)
|
||||
|
||||
// If we got a real agent ID (UUID format), validate and use it
|
||||
if param != "" && param != "<AGENT_ID>" {
|
||||
// Validate it's a UUID
|
||||
if _, err := uuid.Parse(param); err == nil {
|
||||
log.Printf("[DEBUG] Using passed UUID: %s", param)
|
||||
return param
|
||||
}
|
||||
log.Printf("[DEBUG] Invalid UUID format, generating new one")
|
||||
}
|
||||
|
||||
// Placeholder case - generate new UUID for fresh installation
|
||||
newID := uuid.New().String()
|
||||
log.Printf("[DEBUG] Generated new UUID: %s", newID)
|
||||
return newID
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user