config.go 1.9 KB
Newer Older
S
stormgbs 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
package config

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
	"strings"

	specs "github.com/opencontainers/runtime-spec/specs-go"
)

const (
	defaultEnclaveType = "intelSgx"
	envSeparator       = "="
)

// LoadSpec loads the specification from the provided path.
func LoadSpec(cPath string) (spec *specs.Spec, err error) {
	cf, err := os.Open(cPath)
	if err != nil {
		return nil, err
	}
	defer cf.Close()
	if err = json.NewDecoder(cf).Decode(&spec); err != nil {
		return nil, err
	}
	_, err = json.Marshal(spec)
	if err != nil {
		return nil, err
	}
	return spec, nil
}

func SaveSpec(cPath string, spec *specs.Spec) error {
	data, err := json.Marshal(spec)
	if err != nil {
		return err
	}
	return ioutil.WriteFile(cPath, data, 0644)
}

func UpdateEnvs(spec *specs.Spec, kvs map[string]string, overwrite bool) error {
	if spec.Process == nil || kvs == nil || len(kvs) <= 0 {
		return nil
	}
	all := make(map[string]string)
	for _, env := range spec.Process.Env {
		p := strings.SplitN(env, envSeparator, 2)
		if len(p) != 2 {
			continue
		}
		all[p[0]] = p[1]
	}
	for k, v := range kvs {
		if overwrite {
			all[k] = v
		} else if _, ok := all[k]; !ok {
			all[k] = v
		}
	}
	envs := make([]string, 0)
	for k, v := range all {
		envs = append(envs, fmt.Sprintf("%s%s%s", k, envSeparator, v))
	}
	spec.Process.Env = envs
	return nil
}

func GetEnv(spec *specs.Spec, key string) (string, bool) {
	if spec.Process == nil {
		return "", false
	}
	for _, env := range spec.Process.Env {
		p := strings.SplitN(env, envSeparator, 2)
		if len(p) != 2 {
			continue
		}
		if p[0] != key {
			continue
		}
		return p[1], true
	}
84
	return "", false
S
stormgbs 已提交
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
}

func UpdateEnclaveEnvConfig(cPath string) error {
	spec, err := LoadSpec(cPath)
	if err != nil {
		return err
	}
	var name string = "ENCLAVE_TYPE"
	m := map[string]string{name: defaultEnclaveType}
	if err := UpdateEnvs(spec, m, false); err != nil {
		return err
	}
	if err := SaveSpec(cPath, spec); err != nil {
		return err
	}
	return nil
}