package local import ( "crypto/sha1" "encoding/hex" "io/ioutil" "os" "path" "github.com/hashicorp/terraform/helper/schema" ) func resourceLocalFile() *schema.Resource { return &schema.Resource{ Create: resourceLocalFileCreate, Read: resourceLocalFileRead, Delete: resourceLocalFileDelete, Schema: map[string]*schema.Schema{ "content": { Type: schema.TypeString, Required: true, ForceNew: true, }, "filename": { Type: schema.TypeString, Description: "Path to the output file", Required: true, ForceNew: true, }, }, } } func resourceLocalFileRead(d *schema.ResourceData, _ interface{}) error { // If the output file doesn't exist, mark the resource for creation. outputPath := d.Get("filename").(string) if _, err := os.Stat(outputPath); os.IsNotExist(err) { d.SetId("") return nil } // Verify that the content of the destination file matches the content we // expect. Otherwise, the file might have been modified externally and we // must reconcile. outputContent, err := ioutil.ReadFile(outputPath) if err != nil { return err } outputChecksum := sha1.Sum([]byte(outputContent)) if hex.EncodeToString(outputChecksum[:]) != d.Id() { d.SetId("") return nil } return nil } func resourceLocalFileCreate(d *schema.ResourceData, _ interface{}) error { content := d.Get("content").(string) destination := d.Get("filename").(string) destinationDir := path.Dir(destination) if _, err := os.Stat(destinationDir); err != nil { if err := os.MkdirAll(destinationDir, 0777); err != nil { return err } } if err := ioutil.WriteFile(destination, []byte(content), 0777); err != nil { return err } checksum := sha1.Sum([]byte(content)) d.SetId(hex.EncodeToString(checksum[:])) return nil } func resourceLocalFileDelete(d *schema.ResourceData, _ interface{}) error { os.Remove(d.Get("filename").(string)) return nil }