Merge pull request #29 from bcwaldon/permissions

Fix permissions-related bugs
This commit is contained in:
Brian Waldon 2014-03-17 17:22:43 -07:00
commit 5185fe48da
3 changed files with 66 additions and 23 deletions

View File

@ -91,8 +91,8 @@ hostname: trontastic
if wf.Encoding != "" { if wf.Encoding != "" {
t.Errorf("WriteFile has incorrect encoding %s", wf.Encoding) t.Errorf("WriteFile has incorrect encoding %s", wf.Encoding)
} }
if wf.Permissions != "0644" { if perm, _ := wf.Permissions(); perm != 0644 {
t.Errorf("WriteFile has incorrect permissions %s", wf.Permissions) t.Errorf("WriteFile has incorrect permissions %s", perm)
} }
if wf.Path != "/etc/dogepack.conf" { if wf.Path != "/etc/dogepack.conf" {
t.Errorf("WriteFile has incorrect path %s", wf.Path) t.Errorf("WriteFile has incorrect path %s", wf.Path)

View File

@ -2,6 +2,7 @@ package cloudinit
import ( import (
"errors" "errors"
"fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"os/exec" "os/exec"
@ -10,27 +11,43 @@ import (
) )
type WriteFile struct { type WriteFile struct {
Encoding string Encoding string
Content string Content string
Owner string Owner string
Path string Path string
Permissions string RawFilePermissions string `yaml:"permissions"`
} }
func ProcessWriteFile(base string, wf *WriteFile) error { func (wf *WriteFile) Permissions() (os.FileMode, error) {
fullPath := path.Join(base, wf.Path) if wf.RawFilePermissions == "" {
return os.FileMode(0644), nil
if err := os.MkdirAll(path.Dir(fullPath), os.FileMode(0744)); err != nil {
return err
} }
// Parse string representation of file mode as octal // Parse string representation of file mode as octal
perm, err := strconv.ParseInt(wf.Permissions, 8, 32) perm, err := strconv.ParseInt(wf.RawFilePermissions, 8, 32)
if err != nil { if err != nil {
return errors.New("Unable to parse file permissions as octal integer") return 0, errors.New("Unable to parse file permissions as octal integer")
}
return os.FileMode(perm), nil
}
func ProcessWriteFile(base string, wf *WriteFile) error {
if wf.Encoding != "" {
return fmt.Errorf("Unable to write file with encoding %s", wf.Encoding)
} }
if err := ioutil.WriteFile(fullPath, []byte(wf.Content), os.FileMode(perm)); err != nil { fullPath := path.Join(base, wf.Path)
if err := os.MkdirAll(path.Dir(fullPath), os.FileMode(0755)); err != nil {
return err
}
perm, err := wf.Permissions()
if err != nil {
return err
}
if err := ioutil.WriteFile(fullPath, []byte(wf.Content), perm); err != nil {
return err return err
} }

View File

@ -10,9 +10,8 @@ import (
func TestWriteFileUnencodedContent(t *testing.T) { func TestWriteFileUnencodedContent(t *testing.T) {
wf := WriteFile{ wf := WriteFile{
Path: "/tmp/foo", Path: "/tmp/foo",
Content: "bar", Content: "bar",
Permissions: "0644",
} }
dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-") dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-")
if err != nil { if err != nil {
@ -47,9 +46,9 @@ func TestWriteFileUnencodedContent(t *testing.T) {
func TestWriteFileInvalidPermission(t *testing.T) { func TestWriteFileInvalidPermission(t *testing.T) {
wf := WriteFile{ wf := WriteFile{
Path: "/tmp/foo", Path: "/tmp/foo",
Content: "bar", Content: "bar",
Permissions: "pants", RawFilePermissions: "pants",
} }
dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-") dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-")
if err != nil { if err != nil {
@ -62,10 +61,37 @@ func TestWriteFileInvalidPermission(t *testing.T) {
} }
} }
func TestWriteFilePermissions(t *testing.T) {
wf := WriteFile{
Path: "/tmp/foo",
RawFilePermissions: "0755",
}
dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-")
if err != nil {
t.Fatalf("Unable to create tempdir: %v", err)
}
defer syscall.Rmdir(dir)
if err := ProcessWriteFile(dir, &wf); err != nil {
t.Fatalf("Processing of WriteFile failed: %v", err)
}
fullPath := path.Join(dir, "tmp", "foo")
fi, err := os.Stat(fullPath)
if err != nil {
t.Fatalf("Unable to stat file: %v", err)
}
if fi.Mode() != os.FileMode(0755) {
t.Errorf("File has incorrect mode: %v", fi.Mode())
}
}
func TestWriteFileEncodedContent(t *testing.T) { func TestWriteFileEncodedContent(t *testing.T) {
wf := WriteFile{ wf := WriteFile{
Path: "/tmp/foo", Path: "/tmp/foo",
Content: "", Content: "",
Encoding: "base64", Encoding: "base64",
} }