diff --git a/cloudinit/cloud_config_test.go b/cloudinit/cloud_config_test.go index 81158f2..76e5b82 100644 --- a/cloudinit/cloud_config_test.go +++ b/cloudinit/cloud_config_test.go @@ -91,8 +91,8 @@ hostname: trontastic if wf.Encoding != "" { t.Errorf("WriteFile has incorrect encoding %s", wf.Encoding) } - if wf.Permissions != "0644" { - t.Errorf("WriteFile has incorrect permissions %s", wf.Permissions) + if perm, _ := wf.Permissions(); perm != 0644 { + t.Errorf("WriteFile has incorrect permissions %s", perm) } if wf.Path != "/etc/dogepack.conf" { t.Errorf("WriteFile has incorrect path %s", wf.Path) diff --git a/cloudinit/write_file.go b/cloudinit/write_file.go index 601b725..8f43bbc 100644 --- a/cloudinit/write_file.go +++ b/cloudinit/write_file.go @@ -2,6 +2,7 @@ package cloudinit import ( "errors" + "fmt" "io/ioutil" "os" "os/exec" @@ -10,27 +11,43 @@ import ( ) type WriteFile struct { - Encoding string - Content string - Owner string - Path string - Permissions string + Encoding string + Content string + Owner string + Path string + RawFilePermissions string `yaml:"permissions"` +} + +func (wf *WriteFile) Permissions() (os.FileMode, error) { + if wf.RawFilePermissions == "" { + return os.FileMode(0644), nil + } + + // Parse string representation of file mode as octal + perm, err := strconv.ParseInt(wf.RawFilePermissions, 8, 32) + if err != nil { + 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) + } + fullPath := path.Join(base, wf.Path) if err := os.MkdirAll(path.Dir(fullPath), os.FileMode(0744)); err != nil { return err } - // Parse string representation of file mode as octal - perm, err := strconv.ParseInt(wf.Permissions, 8, 32) + perm, err := wf.Permissions() if err != nil { - return errors.New("Unable to parse file permissions as octal integer") + return err } - if err := ioutil.WriteFile(fullPath, []byte(wf.Content), os.FileMode(perm)); err != nil { + if err := ioutil.WriteFile(fullPath, []byte(wf.Content), perm); err != nil { return err } diff --git a/cloudinit/write_file_test.go b/cloudinit/write_file_test.go index 7111f4a..3e489bf 100644 --- a/cloudinit/write_file_test.go +++ b/cloudinit/write_file_test.go @@ -10,9 +10,8 @@ import ( func TestWriteFileUnencodedContent(t *testing.T) { wf := WriteFile{ - Path: "/tmp/foo", - Content: "bar", - Permissions: "0644", + Path: "/tmp/foo", + Content: "bar", } dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-") if err != nil { @@ -47,9 +46,9 @@ func TestWriteFileUnencodedContent(t *testing.T) { func TestWriteFileInvalidPermission(t *testing.T) { wf := WriteFile{ - Path: "/tmp/foo", - Content: "bar", - Permissions: "pants", + Path: "/tmp/foo", + Content: "bar", + RawFilePermissions: "pants", } dir, err := ioutil.TempDir(os.TempDir(), "coreos-cloudinit-") 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) { wf := WriteFile{ - Path: "/tmp/foo", - Content: "", + Path: "/tmp/foo", + Content: "", Encoding: "base64", }