85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
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
|
|
}
|