internal/lib/env.go (76 lines of code) (raw):
package lib
import (
"bufio"
"fmt"
"os"
"regexp"
"strings"
"github.com/Azure/InnovationEngine/internal/lib/fs"
)
// Get environment variables from the current process.
func GetEnvironmentVariables() map[string]string {
envMap := make(map[string]string)
for _, env := range os.Environ() {
pair := strings.SplitN(env, "=", 2)
if len(pair) == 2 {
envMap[pair[0]] = pair[1]
}
}
return envMap
}
// Location where the environment state from commands are to be captured
// and sent to for being able to share state across commands.
var DefaultEnvironmentStateFile = "/tmp/env-vars"
// Loads a file that contains environment variables
func LoadEnvironmentStateFile(path string) (map[string]string, error) {
if !fs.FileExists(path) {
return nil, fmt.Errorf("env file '%s' does not exist", path)
}
file, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("failed to open env file '%s': %w", path, err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
env := make(map[string]string)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, "=") {
parts := strings.SplitN(line, "=", 2) // Split at the first "=" only
value := parts[1]
if len(value) >= 2 && value[0] == '"' && value[len(value)-1] == '"' {
// Remove leading and trailing quotes
value = value[1 : len(value)-1]
}
env[parts[0]] = value
}
}
return env, nil
}
func CleanEnvironmentStateFile(path string) error {
env, err := LoadEnvironmentStateFile(path)
if err != nil {
return err
}
env = filterInvalidKeys(env)
file, err := os.Create(path)
if err != nil {
return err
}
writer := bufio.NewWriter(file)
for k, v := range env {
_, err := fmt.Fprintf(writer, "%s=\"%s\"\n", k, v)
if err != nil {
return err
}
}
return writer.Flush()
}
var environmentVariableName = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$")
func filterInvalidKeys(envMap map[string]string) map[string]string {
validEnvMap := make(map[string]string)
for key, value := range envMap {
if environmentVariableName.MatchString(key) {
validEnvMap[key] = value
}
}
return validEnvMap
}
// Deletes the stored environment variables file.
func DeleteEnvironmentStateFile(path string) error {
return os.Remove(path)
}