// Copyright (C) 2020 Marius Schellenberger package pve import ( "gopkg.in/yaml.v2" ) var cloudConfig = []byte("#cloud-config\n") const ( minBytes = 87 pad = "########################################################################\n" ) //TODO //func parseUserData(s string) (u *UserData, err error) { // s, err = url.QueryUnescape(s) // if err != nil { // return // } // b, err := base64.StdEncoding.DecodeString(s) // if err != nil { // return // } // return UnmarshalUserData(b) //} func UnmarshalUserData(b []byte) (u *UserData, err error) { u = new(UserData) err = yaml.Unmarshal(b, u) return } //TODO //func MarshalUserData(u *UserData) ([]byte, error) { // if u == nil { // return nil, nil // } // b, err := yaml.Marshal(u) // if err == nil { // if len(b)+len(cloudConfig) < minBytes { // b = append([]byte(pad[len(b):]), b...) // } // b = append(cloudConfig, b...) // } // return b, err //} type UserData struct { Hostname string `yaml:"hostname"` ManageEtcHosts bool `yaml:"manage_etc_hosts,omitempty"` SSHAuthorizedKeys []string `yaml:"ssh_authorized_keys,omitempty"` PackageUpdate bool `yaml:"package_update,omitempty"` PackageUpgrade bool `yaml:"package_upgrade,omitempty"` APT APTConfig `yaml:"apt,omitempty"` NTP NTP `yaml:"ntp,omitempty"` Users []User `yaml:"users,omitempty"` Packages [][]string `yaml:"packages,omitempty"` Runcmd []string `yaml:"runcmd,omitempty"` FinalMessage string `yaml:"final_message,omitempty"` WriteFiles []File `yaml:"write_files,omitempty"` } // TODO // func (u *UserData) String() (s string, err error) { // b, err := MarshalUserData(u) // if err != nil { // return // } // s = url.QueryEscape(base64.StdEncoding.EncodeToString(b)) // return // } func (u *UserData) String() (s string, err error) { b, err := u.Bytes() if err != nil { return } s = string(b) return } func (u *UserData) Bytes() (b []byte, err error) { b, err = yaml.Marshal(u) if err == nil { if len(b)+len(cloudConfig) < minBytes { b = append([]byte(pad[len(b):]), b...) } b = append(cloudConfig, b...) } return } type NTP struct { Servers []string `yaml:"servers,omitempty"` Enabled *bool `yaml:"enabled,omitempty"` } type User struct { Name string `yaml:"name"` Gecos *string `yaml:"gecos,omitempty"` Groups *string `yaml:"groups,omitempty"` HomeDir *string `yaml:"homedir,omitempty"` Inactive *bool `yaml:"inactive,omitempty"` Shell *string `yaml:"shell,omitempty"` Passwd *string `yaml:"passwd,omitempty"` PrimaryGroup *string `yaml:"primary_group,omitempty"` LockPassword *bool `yaml:"lock_passwd,omitempty"` Sudo *string `yaml:"sudo,omitempty"` SSHAuthorizedKeys []string `yaml:"ssh_authorized_keys,omitempty"` } type File struct { Content string `yaml:"content"` Path string `yaml:"path"` Owner string `yaml:"owner,omitempty"` Permissions string `yaml:"permissions,omitempty"` } type APTConfig struct { Sources map[string]APTSource } type APTSource struct { Arches string `yaml:"arches,omitempty"` Source string `yaml:"source"` Keyserver string `yaml:"keyserver"` Keyid string `yaml:"keyid"` }