translator/util/configutil.go (56 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package util
import (
"errors"
"fmt"
"os"
"strings"
"github.com/aws/amazon-cloudwatch-agent/translator"
"github.com/aws/amazon-cloudwatch-agent/translator/config"
)
const (
source_ENV = "env:"
source_FILE = "file:"
sourceSeparator = ":"
yamlFileMode = 0644
linuxDownloadingPath = "/opt/aws/amazon-cloudwatch-agent/etc/"
windowsDownloadingPath = "\\Amazon\\AmazonCloudWatchAgent\\"
)
func splitConfigPath(configPath string) (string, error) {
locationArray := strings.SplitN(configPath, sourceSeparator, 2)
if locationArray == nil || len(locationArray) < 2 {
return "", errors.New(fmt.Sprintf("config path: %s is malformatted.", configPath))
}
return locationArray[1], nil
}
func getDownloadPath() string {
if translator.GetTargetPlatform() == config.OS_TYPE_WINDOWS {
var downloadingPath string
if _, ok := os.LookupEnv("ProgramData"); ok {
downloadingPath = os.Getenv("ProgramData")
}
return downloadingPath + windowsDownloadingPath
}
return linuxDownloadingPath
}
func GetConfigPath(configFileName string, sectionKey string, defaultPath string, input interface{}) (interface{}, error) {
_, returnVal := translator.DefaultCase(sectionKey, defaultPath, input)
configPath := returnVal.(string)
if strings.HasPrefix(configPath, source_FILE) {
return splitConfigPath(configPath)
} else if strings.HasPrefix(configPath, source_ENV) {
// download the source file to local directory from ENV variable
downloadingPath := getDownloadPath() + configFileName
configEnv, err := splitConfigPath(configPath)
if err != nil {
return nil, err
}
if cc, ok := os.LookupEnv(configEnv); ok {
if err := os.WriteFile(downloadingPath, []byte(cc), yamlFileMode); err != nil {
return "", errors.New(fmt.Sprintf("Failed to download config file %s. Reason: %s", configFileName, err.Error()))
}
} else {
return "", errors.New(fmt.Sprintf("Failed to download config from ENV: %v. Reason: ENV does not exist", configEnv))
}
return downloadingPath, nil
}
return returnVal, nil
}