From 170b2f3383598fd32cff347c6568a664fa8375bc Mon Sep 17 00:00:00 2001 From: Adrien Delorme Date: Mon, 3 Sep 2018 14:26:07 +0200 Subject: [PATCH 1/4] builder/azure/common.RandomString-> common/random.String * to share them * also removed unused PassworString func & arm.TempPasswordAlphabet package const --- builder/azure/arm/tempname.go | 10 ++--- builder/azure/common/randomstring.go | 45 ----------------------- builder/azure/common/randomstring_test.go | 15 -------- common/random/string.go | 29 +++++++++++++++ 4 files changed, 33 insertions(+), 66 deletions(-) delete mode 100644 builder/azure/common/randomstring.go delete mode 100644 builder/azure/common/randomstring_test.go create mode 100644 common/random/string.go diff --git a/builder/azure/arm/tempname.go b/builder/azure/arm/tempname.go index 501dfda65..0ddc5542a 100644 --- a/builder/azure/arm/tempname.go +++ b/builder/azure/arm/tempname.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/hashicorp/packer/builder/azure/common" + "github.com/hashicorp/packer/common/random" ) const ( @@ -13,8 +13,6 @@ const ( numbers = "0123456789" lowerCase = "abcdefghijklmnopqrstuvwxyz" upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - - TempPasswordAlphabet = numbers + lowerCase + upperCase ) type TempName struct { @@ -34,7 +32,7 @@ type TempName struct { func NewTempName() *TempName { tempName := &TempName{} - suffix := common.RandomString(TempNameAlphabet, 10) + suffix := random.String(TempNameAlphabet, 10) tempName.ComputeName = fmt.Sprintf("pkrvm%s", suffix) tempName.DeploymentName = fmt.Sprintf("pkrdp%s", suffix) tempName.KeyVaultName = fmt.Sprintf("pkrkv%s", suffix) @@ -46,7 +44,7 @@ func NewTempName() *TempName { tempName.ResourceGroupName = fmt.Sprintf("packer-Resource-Group-%s", suffix) tempName.AdminPassword = generatePassword() - tempName.CertificatePassword = common.RandomString(TempPasswordAlphabet, 32) + tempName.CertificatePassword = random.AlphaNum(32) return tempName } @@ -60,7 +58,7 @@ func NewTempName() *TempName { func generatePassword() string { var s string for i := 0; i < 100; i++ { - s := common.RandomString(TempPasswordAlphabet, 32) + s := random.AlphaNum(32) if !strings.ContainsAny(s, numbers) { continue } diff --git a/builder/azure/common/randomstring.go b/builder/azure/common/randomstring.go deleted file mode 100644 index a81f5b3c4..000000000 --- a/builder/azure/common/randomstring.go +++ /dev/null @@ -1,45 +0,0 @@ -package common - -import ( - "math/rand" - "os" - "time" -) - -var pwSymbols = []string{ - "abcdefghijklmnopqrstuvwxyz", - "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "0123456789", -} - -var rnd = rand.New(rand.NewSource(time.Now().UnixNano() + int64(os.Getpid()))) - -func RandomString(chooseFrom string, length int) (randomString string) { - cflen := len(chooseFrom) - for i := 0; i < length; i++ { - randomString += string(chooseFrom[rnd.Intn(cflen)]) - } - return -} - -func RandomPassword() (password string) { - pwlen := 15 - batchsize := pwlen / len(pwSymbols) - pw := make([]byte, 0, pwlen) - // choose character set - for c := 0; len(pw) < pwlen; c++ { - s := RandomString(pwSymbols[c%len(pwSymbols)], rnd.Intn(batchsize-1)+1) - pw = append(pw, []byte(s)...) - } - // truncate - pw = pw[:pwlen] - - // permute - for c := 0; c < pwlen-1; c++ { - i := rnd.Intn(pwlen-c) + c - x := pw[c] - pw[c] = pw[i] - pw[i] = x - } - return string(pw) -} diff --git a/builder/azure/common/randomstring_test.go b/builder/azure/common/randomstring_test.go deleted file mode 100644 index c3e0fae51..000000000 --- a/builder/azure/common/randomstring_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package common - -import ( - "testing" -) - -func TestRandomPassword_generates_15char_passwords(t *testing.T) { - for i := 0; i < 100; i++ { - pw := RandomPassword() - t.Logf("pw: %v", pw) - if len(pw) != 15 { - t.Fatalf("len(pw)!=15, but %v: %v (%v)", len(pw), pw, i) - } - } -} diff --git a/common/random/string.go b/common/random/string.go new file mode 100644 index 000000000..d068cf9d7 --- /dev/null +++ b/common/random/string.go @@ -0,0 +1,29 @@ +package random + +import ( + "math/rand" + "os" + "time" +) + +var ( + numbers = "0123456789" + lowerCase = "abcdefghijklmnopqrstuvwxyz" + upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + alphaNum = numbers + lowerCase + upperCase +) + +var rnd = rand.New(rand.NewSource(time.Now().UnixNano() + int64(os.Getpid()))) + +func AlphaNum(length int) string { + return String(alphaNum, length) +} + +func String(chooseFrom string, length int) (randomString string) { + cflen := len(chooseFrom) + for i := 0; i < length; i++ { + randomString += string(chooseFrom[rnd.Intn(cflen)]) + } + return +} From b80e1d51c6f5538d7f31a2cf01c5028f68a1a62c Mon Sep 17 00:00:00 2001 From: Adrien Delorme Date: Mon, 3 Sep 2018 15:01:14 +0200 Subject: [PATCH 2/4] aws: when building an AMI with 'encrypt_boot: true', randomize the name of the temporary AMI --- builder/amazon/ebs/step_create_ami.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/builder/amazon/ebs/step_create_ami.go b/builder/amazon/ebs/step_create_ami.go index 1d081db70..8d9049f85 100644 --- a/builder/amazon/ebs/step_create_ami.go +++ b/builder/amazon/ebs/step_create_ami.go @@ -7,6 +7,7 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" awscommon "github.com/hashicorp/packer/builder/amazon/common" + "github.com/hashicorp/packer/common/random" "github.com/hashicorp/packer/helper/multistep" "github.com/hashicorp/packer/packer" ) @@ -22,10 +23,17 @@ func (s *stepCreateAMI) Run(ctx context.Context, state multistep.StateBag) multi ui := state.Get("ui").(packer.Ui) // Create the image - ui.Say(fmt.Sprintf("Creating the AMI: %s", config.AMIName)) + amiName := config.AMIName + if config.AMIEncryptBootVolume { + // to avoid having a temporary unencrypted + // image named config.AMIName + amiName = random.AlphaNum(7) + } + + ui.Say(fmt.Sprintf("Creating unencrypted AMI %s from instance %s", amiName, *instance.InstanceId)) createOpts := &ec2.CreateImageInput{ InstanceId: instance.InstanceId, - Name: &config.AMIName, + Name: &amiName, BlockDeviceMappings: config.BlockDevices.BuildAMIDevices(), } From 4682b3a9d2fdd5a0a079f800557038c62db4369b Mon Sep 17 00:00:00 2001 From: Adrien Delorme Date: Wed, 5 Sep 2018 10:26:52 +0200 Subject: [PATCH 3/4] refactor possible random strings into common/random --- builder/azure/arm/tempname.go | 16 ++++------------ builder/azure/arm/tempname_test.go | 14 ++++++++------ common/random/string.go | 17 ++++++++++------- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/builder/azure/arm/tempname.go b/builder/azure/arm/tempname.go index 0ddc5542a..b5289d450 100644 --- a/builder/azure/arm/tempname.go +++ b/builder/azure/arm/tempname.go @@ -7,14 +7,6 @@ import ( "github.com/hashicorp/packer/common/random" ) -const ( - TempNameAlphabet = "0123456789bcdfghjklmnpqrstvwxyz" - - numbers = "0123456789" - lowerCase = "abcdefghijklmnopqrstuvwxyz" - upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -) - type TempName struct { AdminPassword string CertificatePassword string @@ -32,7 +24,7 @@ type TempName struct { func NewTempName() *TempName { tempName := &TempName{} - suffix := random.String(TempNameAlphabet, 10) + suffix := random.AlphaNumLower(10) tempName.ComputeName = fmt.Sprintf("pkrvm%s", suffix) tempName.DeploymentName = fmt.Sprintf("pkrdp%s", suffix) tempName.KeyVaultName = fmt.Sprintf("pkrkv%s", suffix) @@ -59,15 +51,15 @@ func generatePassword() string { var s string for i := 0; i < 100; i++ { s := random.AlphaNum(32) - if !strings.ContainsAny(s, numbers) { + if !strings.ContainsAny(s, random.PossibleNumbers) { continue } - if !strings.ContainsAny(s, lowerCase) { + if !strings.ContainsAny(s, random.PossibleLowerCase) { continue } - if !strings.ContainsAny(s, upperCase) { + if !strings.ContainsAny(s, random.PossibleUpperCase) { continue } diff --git a/builder/azure/arm/tempname_test.go b/builder/azure/arm/tempname_test.go index 120df3ea1..0b3608e18 100644 --- a/builder/azure/arm/tempname_test.go +++ b/builder/azure/arm/tempname_test.go @@ -3,6 +3,8 @@ package arm import ( "strings" "testing" + + "github.com/hashicorp/packer/common/random" ) func TestTempNameShouldCreatePrefixedRandomNames(t *testing.T) { @@ -44,14 +46,14 @@ func TestTempNameShouldCreatePrefixedRandomNames(t *testing.T) { func TestTempAdminPassword(t *testing.T) { tempName := NewTempName() - if !strings.ContainsAny(tempName.AdminPassword, numbers) { - t.Errorf("Expected AdminPassword to contain at least one of '%s'!", numbers) + if !strings.ContainsAny(tempName.AdminPassword, random.PossibleNumbers) { + t.Errorf("Expected AdminPassword to contain at least one of '%s'!", random.PossibleNumbers) } - if !strings.ContainsAny(tempName.AdminPassword, lowerCase) { - t.Errorf("Expected AdminPassword to contain at least one of '%s'!", lowerCase) + if !strings.ContainsAny(tempName.AdminPassword, random.PossibleLowerCase) { + t.Errorf("Expected AdminPassword to contain at least one of '%s'!", random.PossibleLowerCase) } - if !strings.ContainsAny(tempName.AdminPassword, upperCase) { - t.Errorf("Expected AdminPassword to contain at least one of '%s'!", upperCase) + if !strings.ContainsAny(tempName.AdminPassword, random.PossibleUpperCase) { + t.Errorf("Expected AdminPassword to contain at least one of '%s'!", random.PossibleUpperCase) } } diff --git a/common/random/string.go b/common/random/string.go index d068cf9d7..974714fd7 100644 --- a/common/random/string.go +++ b/common/random/string.go @@ -7,18 +7,21 @@ import ( ) var ( - numbers = "0123456789" - lowerCase = "abcdefghijklmnopqrstuvwxyz" - upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + PossibleNumbers = "0123456789" + PossibleLowerCase = "abcdefghijklmnopqrstuvwxyz" + PossibleUpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - alphaNum = numbers + lowerCase + upperCase + PossibleAlphaNum = PossibleNumbers + PossibleLowerCase + PossibleUpperCase + PossibleAlphaNumLower = PossibleNumbers + PossibleLowerCase + PossibleAlphaNumUpper = PossibleNumbers + PossibleUpperCase ) var rnd = rand.New(rand.NewSource(time.Now().UnixNano() + int64(os.Getpid()))) -func AlphaNum(length int) string { - return String(alphaNum, length) -} +func Numbers(length int) string { return String(PossibleNumbers, length) } +func AlphaNum(length int) string { return String(PossibleAlphaNum, length) } +func AlphaNumLower(length int) string { return String(PossibleAlphaNumLower, length) } +func AlphaNumUpper(length int) string { return String(PossibleAlphaNumUpper, length) } func String(chooseFrom string, length int) (randomString string) { cflen := len(chooseFrom) From 5a8af5500ba4b91ce9526e019f03e2d39f331312 Mon Sep 17 00:00:00 2001 From: Adrien Delorme Date: Wed, 5 Sep 2018 10:27:02 +0200 Subject: [PATCH 4/4] random: optimize allocation & simplify loop --- common/random/string.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/common/random/string.go b/common/random/string.go index 974714fd7..74c79bc90 100644 --- a/common/random/string.go +++ b/common/random/string.go @@ -25,8 +25,9 @@ func AlphaNumUpper(length int) string { return String(PossibleAlphaNumUpper, len func String(chooseFrom string, length int) (randomString string) { cflen := len(chooseFrom) - for i := 0; i < length; i++ { - randomString += string(chooseFrom[rnd.Intn(cflen)]) + bytes := make([]byte, length) + for i := range bytes { + bytes[i] = chooseFrom[rnd.Intn(cflen)] } - return + return string(bytes) }