@ -2,6 +2,8 @@ package archive
import (
"crypto/sha1"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"fmt"
"io/ioutil"
@ -11,13 +13,9 @@ import (
"github.com/hashicorp/terraform/helper/schema"
)
func resourceArchiv eFile( ) * schema . Resource {
func dataSourc eFile( ) * schema . Resource {
return & schema . Resource {
Create : resourceArchiveFileCreate ,
Read : resourceArchiveFileRead ,
Update : resourceArchiveFileUpdate ,
Delete : resourceArchiveFileDelete ,
Exists : resourceArchiveFileExists ,
Read : dataSourceFileRead ,
Schema : map [ string ] * schema . Schema {
"type" : & schema . Schema {
@ -64,50 +62,56 @@ func resourceArchiveFile() *schema.Resource {
ForceNew : true ,
Description : "SHA1 checksum of output file" ,
} ,
"output_base64sha256" : & schema . Schema {
Type : schema . TypeString ,
Computed : true ,
ForceNew : true ,
Description : "Base64 Encoded SHA256 checksum of output file" ,
} ,
} ,
}
}
func resourceArchiveFileCreate ( d * schema . ResourceData , meta interface { } ) error {
if err := resourceArchiveFileUpdate ( d , meta ) ; err != nil {
func dataSourceFileRead ( d * schema . ResourceData , meta interface { } ) error {
outputPath := d . Get ( "output_path" ) . ( string )
outputDirectory := path . Dir ( outputPath )
if outputDirectory != "" {
if _ , err := os . Stat ( outputDirectory ) ; err != nil {
if err := os . MkdirAll ( outputDirectory , 0755 ) ; err != nil {
return err
}
}
}
if err := archive ( d ) ; err != nil {
return err
}
return resourceArchiveFileRead ( d , meta )
}
func resourceArchiveFileRead ( d * schema . ResourceData , meta interface { } ) error {
outputPath := d . Get ( "output_path" ) . ( string )
// Generate archived file stats
fi , err := os . Stat ( outputPath )
if os . IsNotExist ( err ) {
d . SetId ( "" )
d . MarkNewResource ( )
return nil
if err != nil {
return err
}
sha , err := genFileSha 1 ( outputPath )
sha 1, base64sha256 , err := genFileSha s ( outputPath )
if err != nil {
return fmt . Errorf ( "could not generate file checksum sha: %s" , err )
return fmt . Errorf ( "could not generate file checksum sha256: %s" , err )
}
d . Set ( "output_sha" , sha )
d . Set ( "output_sha" , sha1 )
d . Set ( "output_base64sha256" , base64sha256 )
d . Set ( "output_size" , fi . Size ( ) )
d . SetId ( d . Get ( "output_sha" ) . ( string ) )
return nil
}
func resourceArchiveFileUpdat e( d * schema . ResourceData , meta interface { } ) error {
func archiv e( d * schema . ResourceData ) error {
archiveType := d . Get ( "type" ) . ( string )
outputPath := d . Get ( "output_path" ) . ( string )
outputDirectory := path . Dir ( outputPath )
if outputDirectory != "" {
if _ , err := os . Stat ( outputDirectory ) ; err != nil {
if err := os . MkdirAll ( outputDirectory , 0777 ) ; err != nil {
return err
}
}
}
archiver := getArchiver ( archiveType , outputPath )
if archiver == nil {
return fmt . Errorf ( "archive type not supported: %s" , archiveType )
@ -129,55 +133,22 @@ func resourceArchiveFileUpdate(d *schema.ResourceData, meta interface{}) error {
} else {
return fmt . Errorf ( "one of 'source_dir', 'source_file', 'source_content_filename' must be specified" )
}
// Generate archived file stats
fi , err := os . Stat ( outputPath )
if err != nil {
return err
}
sha , err := genFileSha1 ( outputPath )
if err != nil {
return fmt . Errorf ( "could not generate file checksum sha: %s" , err )
}
d . Set ( "output_sha" , sha )
d . Set ( "output_size" , fi . Size ( ) )
d . SetId ( d . Get ( "output_sha" ) . ( string ) )
return nil
}
func resourceArchiveFileDelete ( d * schema . ResourceData , meta interface { } ) error {
outputPath := d . Get ( "output_path" ) . ( string )
if _ , err := os . Stat ( outputPath ) ; os . IsNotExist ( err ) {
return nil
}
if err := os . Remove ( outputPath ) ; err != nil {
return fmt . Errorf ( "could not delete zip file %q: %s" , outputPath , err )
}
return nil
}
func resourceArchiveFileExists ( d * schema . ResourceData , meta interface { } ) ( bool , error ) {
outputPath := d . Get ( "output_path" ) . ( string )
_ , err := os . Stat ( outputPath )
if os . IsNotExist ( err ) {
return false , nil
}
if err != nil {
return false , err
}
return true , nil
}
func genFileSha1 ( filename string ) ( string , error ) {
func genFileShas ( filename string ) ( string , string , error ) {
data , err := ioutil . ReadFile ( filename )
if err != nil {
return "" , fmt . Errorf ( "could not compute file '%s' checksum: %s" , filename , err )
return "" , "" , fmt . Errorf ( "could not compute file '%s' checksum: %s" , filename , err )
}
h := sha1 . New ( )
h . Write ( [ ] byte ( data ) )
return hex . EncodeToString ( h . Sum ( nil ) ) , nil
sha1 := hex . EncodeToString ( h . Sum ( nil ) )
h256 := sha256 . New ( )
h256 . Write ( [ ] byte ( data ) )
shaSum := h256 . Sum ( nil )
sha256base64 := base64 . StdEncoding . EncodeToString ( shaSum [ : ] )
return sha1 , sha256base64 , nil
}