// File generates an `/etc/coreos/update.conf` file (if any update // configuration options are set in cloud-config) by either rewriting the // existing file on disk, or starting from `/usr/share/coreos/update.conf` func (uc Update) File() (*File, error) { if config.IsZero(uc.Update) { return nil, nil } if err := config.AssertStructValid(uc.Update); err != nil { return nil, err } // Generate the list of possible substitutions to be performed based on the options that are configured subs := map[string]string{} uct := reflect.TypeOf(uc.Update) ucv := reflect.ValueOf(uc.Update) for i := 0; i < uct.NumField(); i++ { val := ucv.Field(i).String() if val == "" { continue } env := uct.Field(i).Tag.Get("env") subs[env] = fmt.Sprintf("%s=%s", env, val) } conf, err := uc.ReadConfig() if err != nil { return nil, err } scanner := bufio.NewScanner(conf) var out string for scanner.Scan() { line := scanner.Text() for env, value := range subs { if strings.HasPrefix(line, env) { line = value delete(subs, env) break } } out += line out += "\n" if err := scanner.Err(); err != nil { return nil, err } } for _, key := range sortedKeys(subs) { out += subs[key] out += "\n" } return &File{config.File{ Path: path.Join("etc", "coreos", "update.conf"), RawFilePermissions: "0644", Content: out, }}, nil }
func getEnvVars(e interface{}) []string { et := reflect.TypeOf(e) ev := reflect.ValueOf(e) vars := []string{} for i := 0; i < et.NumField(); i++ { if val := ev.Field(i).Interface(); !config.IsZero(val) { key := et.Field(i).Tag.Get("env") vars = append(vars, fmt.Sprintf("%s=%v", key, val)) } } return vars }