120 lines
2.3 KiB
Go
120 lines
2.3 KiB
Go
|
package resource
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"os/user"
|
||
|
"io"
|
||
|
"syscall"
|
||
|
"gopkg.in/yaml.v3"
|
||
|
"strconv"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
ResourceTypes.Register("file", func() Resource { return NewFile() })
|
||
|
}
|
||
|
|
||
|
type File struct {
|
||
|
loader YamlLoader
|
||
|
Path string `yaml:"path"`
|
||
|
Owner string `yaml:"owner"`
|
||
|
Group string `yaml:"group"`
|
||
|
Mode string `yaml:"mode"`
|
||
|
Content string `yaml:"content"`
|
||
|
State string `yaml:"state"`
|
||
|
}
|
||
|
|
||
|
func NewFile() *File {
|
||
|
return &File{ loader: YamlLoadDecl }
|
||
|
}
|
||
|
|
||
|
func (f *File) Apply() error {
|
||
|
|
||
|
switch f.State {
|
||
|
case "absent":
|
||
|
removeErr := os.Remove(f.Path)
|
||
|
if removeErr != nil {
|
||
|
return removeErr
|
||
|
}
|
||
|
case "present": {
|
||
|
uid,uidErr := LookupUID(f.Owner)
|
||
|
if uidErr != nil {
|
||
|
return uidErr
|
||
|
}
|
||
|
|
||
|
gid,gidErr := LookupGID(f.Group)
|
||
|
if gidErr != nil {
|
||
|
return gidErr
|
||
|
}
|
||
|
|
||
|
//e := os.Stat(f.path)
|
||
|
//if os.IsNotExist(e) {
|
||
|
createdFile,e := os.Create(f.Path)
|
||
|
if e != nil {
|
||
|
return e
|
||
|
}
|
||
|
defer createdFile.Close()
|
||
|
|
||
|
if chownErr := createdFile.Chown(uid, gid); chownErr != nil {
|
||
|
return chownErr
|
||
|
}
|
||
|
|
||
|
mode,modeErr := strconv.ParseInt(f.Mode, 8, 64)
|
||
|
if modeErr != nil {
|
||
|
return modeErr
|
||
|
}
|
||
|
|
||
|
if chmodErr := createdFile.Chmod(os.FileMode(mode)); chmodErr != nil {
|
||
|
return chmodErr
|
||
|
}
|
||
|
|
||
|
_,writeErr := createdFile.Write([]byte(f.Content))
|
||
|
if writeErr != nil {
|
||
|
return writeErr
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (f *File) LoadDecl(yamlFileResourceDeclaration string) error {
|
||
|
return f.loader(yamlFileResourceDeclaration, f)
|
||
|
}
|
||
|
|
||
|
func (f *File) Read() ([]byte, error) {
|
||
|
info, e := os.Stat(f.Path)
|
||
|
|
||
|
if e != nil {
|
||
|
panic(e)
|
||
|
}
|
||
|
|
||
|
if stat, ok := info.Sys().(*syscall.Stat_t); ok {
|
||
|
fileUser, userErr := user.LookupId(strconv.Itoa(int(stat.Uid)))
|
||
|
if userErr != nil { //UnknownUserIdError
|
||
|
panic(userErr)
|
||
|
}
|
||
|
fileGroup, groupErr := user.LookupGroupId(strconv.Itoa(int(stat.Gid)))
|
||
|
if groupErr != nil {
|
||
|
panic(groupErr)
|
||
|
}
|
||
|
f.Owner = fileUser.Name
|
||
|
f.Group = fileGroup.Name
|
||
|
}
|
||
|
|
||
|
f.Mode = fmt.Sprintf("%04o", info.Mode().Perm())
|
||
|
|
||
|
file, fileErr := os.Open(f.Path)
|
||
|
if fileErr != nil {
|
||
|
panic(fileErr)
|
||
|
}
|
||
|
|
||
|
fileContent, ioErr := io.ReadAll(file)
|
||
|
if ioErr != nil {
|
||
|
panic(ioErr)
|
||
|
}
|
||
|
f.Content = string(fileContent)
|
||
|
f.State = "present"
|
||
|
return yaml.Marshal(f)
|
||
|
}
|