pupistry 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +13 -1
- data/{bin → exe}/pupistry +45 -76
- data/lib/pupistry.rb +1 -1
- data/lib/pupistry/agent.rb +40 -60
- data/lib/pupistry/artifact.rb +136 -172
- data/lib/pupistry/bootstrap.rb +30 -35
- data/lib/pupistry/config.rb +59 -31
- data/lib/pupistry/gpg.rb +71 -102
- data/lib/pupistry/storage_aws.rb +56 -61
- data/lib/pupistry/version.rb +3 -0
- data/resources/aws/cfn_pupistry_bucket_and_iam.template +11 -1
- data/resources/packer/amazon_linux.json +17 -0
- data/resources/packer/test_user_data.txt +33 -0
- metadata +92 -5
data/lib/pupistry/storage_aws.rb
CHANGED
@@ -1,101 +1,97 @@
|
|
1
|
+
# rubocop:disable Style/Documentation, Style/GlobalVars
|
1
2
|
require 'rubygems'
|
2
3
|
require 'yaml'
|
3
4
|
require 'aws-sdk-v1'
|
4
5
|
|
5
6
|
module Pupistry
|
6
|
-
# Pupistry::
|
7
|
+
# Pupistry::StorageAWS
|
7
8
|
|
8
|
-
class
|
9
|
+
class StorageAWS
|
9
10
|
attr_accessor :s3
|
10
11
|
attr_accessor :bucket
|
11
12
|
|
12
|
-
def initialize
|
13
|
+
def initialize(mode)
|
13
14
|
# mode is either "build" or "agent", depending which we load a different
|
14
15
|
# set of permissions. Awareness of both is intentional, since we want the
|
15
16
|
# build machines to known the agent creds so we can generate bootstrap
|
16
17
|
# template files.
|
17
18
|
|
18
|
-
unless defined? $config[
|
19
|
-
$logger.fatal
|
19
|
+
unless defined? $config['general']['s3_bucket']
|
20
|
+
$logger.fatal 'You must set the AWS s3_bucket'
|
20
21
|
exit 0
|
21
22
|
end
|
22
23
|
|
23
24
|
# Define AWS configuration
|
24
|
-
if defined? $config[mode][
|
25
|
-
|
26
|
-
$logger.debug
|
25
|
+
if defined? $config[mode]['access_key_id']
|
26
|
+
if $config[mode]['access_key_id'] == ''
|
27
|
+
$logger.debug 'No AWS IAM credentials specified, defaulting to environmental discovery'
|
28
|
+
$logger.debug 'If you get weird permissions errors, try setting the credentials explicity in config first.'
|
29
|
+
else
|
30
|
+
$logger.debug 'Loading AWS credentials from configuration file'
|
27
31
|
|
28
32
|
AWS.config(
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
|
33
|
+
access_key_id: $config[mode]['access_key_id'],
|
34
|
+
secret_access_key: $config[mode]['secret_access_key'],
|
35
|
+
region: $config[mode]['region'],
|
36
|
+
proxy_uri: $config[mode]['proxy_uri']
|
33
37
|
)
|
34
|
-
else
|
35
|
-
$logger.debug "No AWS IAM credentials specified, defaulting to environmental discovery"
|
36
|
-
$logger.debug "If you get weird permissions errors, try setting the credentials explicity in config first."
|
37
38
|
end
|
38
39
|
else
|
39
|
-
$logger.debug
|
40
|
-
$logger.debug
|
40
|
+
$logger.debug 'No AWS IAM credentials specified, defaulting to environmental discovery'
|
41
|
+
$logger.debug 'If you get weird permissions errors, try setting the credentials explicity in config first.'
|
41
42
|
end
|
42
43
|
|
43
44
|
# Setup S3 bucket
|
44
45
|
@s3 = AWS::S3.new
|
45
|
-
@bucket = @s3.buckets[
|
46
|
-
|
46
|
+
@bucket = @s3.buckets[$config[mode]['s3_bucket']]
|
47
47
|
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
def upload src, dest
|
52
|
-
$logger.debug "Pushing file #{src} to s3://#{$config["general"]["s3_bucket"]}/#{$config["general"]["s3_prefix"]}#{dest}"
|
49
|
+
def upload(src, dest)
|
50
|
+
$logger.debug "Pushing file #{src} to s3://#{$config['general']['s3_bucket']}/#{$config['general']['s3_prefix']}#{dest}"
|
53
51
|
|
54
52
|
begin
|
55
53
|
# Generate the object name/key based on the relative file name and path.
|
56
|
-
s3_obj_name = "#{$config[
|
57
|
-
s3_obj = @s3.buckets[$config[
|
54
|
+
s3_obj_name = "#{$config['general']['s3_prefix']}#{dest}"
|
55
|
+
s3_obj = @s3.buckets[$config['general']['s3_bucket']].objects[s3_obj_name]
|
58
56
|
|
59
57
|
# Perform S3 upload
|
60
|
-
s3_obj.write(:
|
58
|
+
s3_obj.write(file: src)
|
61
59
|
|
62
|
-
rescue AWS::S3::Errors::NoSuchBucket
|
63
|
-
$logger.fatal "S3 bucket #{$config[
|
60
|
+
rescue AWS::S3::Errors::NoSuchBucket
|
61
|
+
$logger.fatal "S3 bucket #{$config['general']['s3_bucket']} does not exist"
|
64
62
|
exit 0
|
65
63
|
|
66
|
-
rescue AWS::S3::Errors::AccessDenied
|
67
|
-
$logger.fatal "Access to S3 bucket #{$config[
|
64
|
+
rescue AWS::S3::Errors::AccessDenied
|
65
|
+
$logger.fatal "Access to S3 bucket #{$config['general']['s3_bucket']} denied"
|
68
66
|
exit 0
|
69
67
|
|
70
68
|
rescue AWS::S3::Errors::PermanentRedirect => e
|
71
|
-
$logger.error "The wrong endpoint has been specified (or autodetected) for #{$config[
|
69
|
+
$logger.error "The wrong endpoint has been specified (or autodetected) for #{$config['general']['s3_bucket']}."
|
72
70
|
raise e
|
73
71
|
|
74
72
|
rescue AWS::S3::Errors::SignatureDoesNotMatch => e
|
75
|
-
$logger.error "IAM signature error when accessing #{$config[
|
73
|
+
$logger.error "IAM signature error when accessing #{$config['general']['s3_bucket']}, probably invalid IAM credentials"
|
76
74
|
raise e
|
77
75
|
|
78
|
-
rescue AWS::S3::Errors::MissingCredentialsError
|
79
|
-
$logger.error
|
80
|
-
$logger.error
|
81
|
-
$logger.error
|
82
|
-
$logger.error
|
76
|
+
rescue AWS::S3::Errors::MissingCredentialsError
|
77
|
+
$logger.error 'AWS credentials not supplied. You must either:'
|
78
|
+
$logger.error 'a) Specify them in the config file for Pupistry'
|
79
|
+
$logger.error 'b) Use IAM roles with an EC2 instance.'
|
80
|
+
$logger.error 'c) Set them in ENV as AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY'
|
83
81
|
return false
|
84
|
-
|
85
|
-
rescue
|
82
|
+
|
83
|
+
rescue StandardError => e
|
86
84
|
raise e
|
87
85
|
end
|
88
86
|
end
|
89
87
|
|
90
|
-
|
91
|
-
|
92
|
-
def download src, dest = 'stream'
|
93
|
-
$logger.debug "Downloading file s3://#{$config["general"]["s3_bucket"]}/#{$config["general"]["s3_prefix"]}#{src} to #{dest}"
|
88
|
+
def download(src, dest = 'stream')
|
89
|
+
$logger.debug "Downloading file s3://#{$config['general']['s3_bucket']}/#{$config['general']['s3_prefix']}#{src} to #{dest}"
|
94
90
|
|
95
91
|
begin
|
96
92
|
# Generate the object name/key based on the relative file name and path.
|
97
|
-
s3_obj_name = "#{$config[
|
98
|
-
s3_obj = @s3.buckets[$config[
|
93
|
+
s3_obj_name = "#{$config['general']['s3_prefix']}#{src}"
|
94
|
+
s3_obj = @s3.buckets[$config['general']['s3_bucket']].objects[s3_obj_name]
|
99
95
|
|
100
96
|
# Download the file
|
101
97
|
if dest == 'stream'
|
@@ -111,38 +107,37 @@ module Pupistry
|
|
111
107
|
end
|
112
108
|
end
|
113
109
|
|
114
|
-
rescue AWS::S3::Errors::NoSuchKey
|
115
|
-
$logger.debug
|
110
|
+
rescue AWS::S3::Errors::NoSuchKey
|
111
|
+
$logger.debug 'No such file exists for download, this is normal at times.'
|
116
112
|
return false
|
117
113
|
|
118
|
-
rescue AWS::S3::Errors::NoSuchBucket
|
119
|
-
$logger.fatal "S3 bucket #{$config[
|
114
|
+
rescue AWS::S3::Errors::NoSuchBucket
|
115
|
+
$logger.fatal "S3 bucket #{$config['general']['s3_bucket']} does not exist"
|
120
116
|
exit 0
|
121
117
|
|
122
|
-
rescue AWS::S3::Errors::AccessDenied
|
123
|
-
$logger.fatal "Access to S3 bucket #{$config[
|
118
|
+
rescue AWS::S3::Errors::AccessDenied
|
119
|
+
$logger.fatal "Access to S3 bucket #{$config['general']['s3_bucket']} denied"
|
124
120
|
exit 0
|
125
121
|
|
126
122
|
rescue AWS::S3::Errors::PermanentRedirect => e
|
127
|
-
$logger.error "The wrong endpoint has been specified (or autodetected) for #{$config[
|
123
|
+
$logger.error "The wrong endpoint has been specified (or autodetected) for #{$config['general']['s3_bucket']}."
|
128
124
|
raise e
|
129
125
|
|
130
126
|
rescue AWS::S3::Errors::SignatureDoesNotMatch => e
|
131
|
-
$logger.error "IAM signature error when accessing #{$config[
|
127
|
+
$logger.error "IAM signature error when accessing #{$config['general']['s3_bucket']}, probably invalid IAM credentials"
|
132
128
|
raise e
|
133
129
|
|
134
|
-
rescue AWS::S3::Errors::MissingCredentialsError
|
135
|
-
$logger.error
|
136
|
-
$logger.error
|
137
|
-
$logger.error
|
138
|
-
$logger.error
|
130
|
+
rescue AWS::S3::Errors::MissingCredentialsError
|
131
|
+
$logger.error 'AWS credentials not supplied. You must either:'
|
132
|
+
$logger.error 'a) Specify them in the config file for Pupistry'
|
133
|
+
$logger.error 'b) Use IAM roles with an EC2 instance.'
|
134
|
+
$logger.error 'c) Set them in ENV as AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY'
|
139
135
|
return false
|
140
|
-
|
141
|
-
rescue
|
136
|
+
|
137
|
+
rescue StandardError => e
|
142
138
|
raise e
|
143
139
|
end
|
144
140
|
end
|
145
|
-
|
146
141
|
end
|
147
142
|
end
|
148
143
|
# vim:shiftwidth=2:tabstop=2:softtabstop=2:expandtab:smartindent
|
@@ -48,12 +48,22 @@
|
|
48
48
|
"LifecycleConfiguration" : {
|
49
49
|
"Rules" : [{
|
50
50
|
"Status": "Enabled",
|
51
|
+
"Prefix": "artifact.",
|
51
52
|
"ExpirationInDays": { "Ref" : "S3BucketPurge" },
|
52
53
|
"Transition": {
|
53
54
|
"StorageClass": "Glacier",
|
54
55
|
"TransitionInDays": { "Ref" : "S3BucketArchive" }
|
55
56
|
}
|
56
|
-
}
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"Status": "Enabled",
|
60
|
+
"Prefix": "manifest.",
|
61
|
+
"ExpirationInDays": { "Ref" : "S3BucketPurge" },
|
62
|
+
"Transition": {
|
63
|
+
"StorageClass": "Glacier",
|
64
|
+
"TransitionInDays": { "Ref" : "S3BucketArchive" }
|
65
|
+
}
|
66
|
+
}]
|
57
67
|
}
|
58
68
|
},
|
59
69
|
"DeletionPolicy" : "Delete"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
{
|
2
|
+
"variables": {
|
3
|
+
"aws_access_key": "",
|
4
|
+
"aws_secret_key": ""
|
5
|
+
},
|
6
|
+
"builders": [{
|
7
|
+
"type": "amazon-ebs",
|
8
|
+
"access_key": "{{user `aws_access_key`}}",
|
9
|
+
"secret_key": "{{user `aws_secret_key`}}",
|
10
|
+
"region": "ap-southeast-2",
|
11
|
+
"source_ami": "ami-fd9cecc7",
|
12
|
+
"instance_type": "m3.medium",
|
13
|
+
"ssh_username": "ec2-user",
|
14
|
+
"ami_name": "pupistry default {{timestamp}}",
|
15
|
+
"user_data": "test_user_data.txt"
|
16
|
+
}]
|
17
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
-- Bootstrap Start --
|
2
|
+
IyEvYmluL2Jhc2ggLXgKIyBUaGlzIGJvb3RzdHJhcCBpcyBzcGVjaWZjaWFs
|
3
|
+
bHkgZm9yIEFtYXpvbidzIExpbnV4IEFNSXMsIGlmIHlvdSBhcmUgdXNpbmcK
|
4
|
+
IyBvdGhlciBkaXN0cmlidXRpb25zIGxpa2UgVWJ1bnR1IG9yIENlbnRPUyBv
|
5
|
+
biBBV1MsIHVzZSB0aG9zZSBib290c3RyYXAKIyB0ZW1wbGF0ZXMuCiMKIyBB
|
6
|
+
bWF6b24gTGludXggaXMgYmFzZWQgb24gUkhFTCwgYnV0IGhhcyBhIGxvdCBt
|
7
|
+
b3JlIHZhcmlhdGlvbnMgdGhhdCBvdGhlcgojIGNsb25lcyBsaWtlIENlbnRP
|
8
|
+
Uywgc3VjaCBhcyBzaGlwcGluZyB3aXRoIG11bHRpcGxlIHZlcnNpb25zIG9m
|
9
|
+
IFB1cHBldAojIGFuZCBSdWJ5IC0gd2hpY2ggaXMgdXNlZnVsLCBidXQgY2Fu
|
10
|
+
IGFsc28gbWFrZSBsaWZlLi4uLiBpbnRlcmVzdGluZy4KKApleGVjIDE+ID4o
|
11
|
+
bG9nZ2VyIC1zIC10IHVzZXItZGF0YSkgMj4mMQoKZXhwb3J0IFBBVEg9JFBB
|
12
|
+
VEg6L3Vzci9sb2NhbC9iaW4KCnl1bSB1cGRhdGUgLS1hc3N1bWV5ZXMKeXVt
|
13
|
+
IGluc3RhbGwgLS1hc3N1bWV5ZXMgcHVwcGV0MyBydWJ5LWRldmVsIHJ1Ynln
|
14
|
+
ZW1zIGdjYyB6bGliLWRldmVsIGxpYnhtbDItZGV2ZWwgcGF0Y2ggZ251cGcy
|
15
|
+
CgojIE5vdCBzdXJlIHdoeSB0aGlzIGRvZXNuJ3QgZ2V0IHB1bGxlZCBkb3du
|
16
|
+
IHByb3Blcmx5LCBtYXliZSBpdCdzIGNvcmUgYW5kCiMgQW1hem9uIGRpZG4n
|
17
|
+
dCBwYWNrYWdlIGl0IHByb3Blcmx5PyBOZWVkIGl0IGZvciBUaG9yIHdoaWNo
|
18
|
+
IGlzIHVzZWQgYnkgUHVwaXN0cnkKZ2VtIGluc3RhbGwgaW8tY29uc29sZQoK
|
19
|
+
Z2VtIGluc3RhbGwgcHVwaXN0cnkKbWtkaXIgLXAgL2V0Yy9wdXBpc3RyeQpt
|
20
|
+
a2RpciAtcCAvZXRjL3B1cHBldGxhYnMvY29kZS9lbnZpcm9ubWVudHMKY2F0
|
21
|
+
ID4gL2V0Yy9wdXBpc3RyeS9zZXR0aW5ncy55YW1sIDw8ICJFT0YiCmdlbmVy
|
22
|
+
YWw6CiAgYXBwX2NhY2hlOiB+Ly5wdXBpc3RyeS9jYWNoZQogIHMzX2J1Y2tl
|
23
|
+
dDogcHVwaXN0cnktcmVzb3VyY2VzCiAgczNfcHJlZml4OiAKICBncGdfZGlz
|
24
|
+
YWJsZTogZmFsc2UKICBncGdfc2lnbmluZ19rZXk6IEE4MEFDQTZGCmFnZW50
|
25
|
+
OgogIHB1cHBldGNvZGU6IC9ldGMvcHVwcGV0bGFicy9jb2RlL2Vudmlyb25t
|
26
|
+
ZW50cwogIGFjY2Vzc19rZXlfaWQ6IEFLSUFKMlhKQ01TNFJBUDNCVFpBCiAg
|
27
|
+
c2VjcmV0X2FjY2Vzc19rZXk6IHdoQWlFaCtZV1hzaUw4Y0NONitLSFovT1Zs
|
28
|
+
M1VCK3ZZb0FHZEd4eDkKICByZWdpb246IGFwLXNvdXRoZWFzdC0yCiAgcHJv
|
29
|
+
eHlfdXJpOiAKICBkYWVtb25fZnJlcXVlbmN5OiA2MAogIGRhZW1vbl9taW5p
|
30
|
+
bWFsOiB0cnVlCkVPRgpjaG1vZCA3MDAgL2V0Yy9wdXBpc3RyeS9zZXR0aW5n
|
31
|
+
cy55YW1sCmNobW9kIDcwMCAvZXRjL3B1cHBldGxhYnMvY29kZS9lbnZpcm9u
|
32
|
+
bWVudHMKcHVwaXN0cnkgYXBwbHkgLS12ZXJib3NlCgopCg==
|
33
|
+
-- Bootstrap End --
|
metadata
CHANGED
@@ -1,15 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pupistry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jethro Carr
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.9'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.6'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.6'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.10'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.10'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
13
83
|
- !ruby/object:Gem::Dependency
|
14
84
|
name: aws-sdk-v1
|
15
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +122,20 @@ dependencies:
|
|
52
122
|
- - '>='
|
53
123
|
- !ruby/object:Gem::Version
|
54
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: safe_yaml
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
55
139
|
- !ruby/object:Gem::Dependency
|
56
140
|
name: rufus-scheduler
|
57
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,14 +171,15 @@ executables:
|
|
87
171
|
extensions: []
|
88
172
|
extra_rdoc_files: []
|
89
173
|
files:
|
90
|
-
-
|
91
|
-
- lib/pupistry.rb
|
174
|
+
- exe/pupistry
|
92
175
|
- lib/pupistry/agent.rb
|
93
176
|
- lib/pupistry/artifact.rb
|
94
177
|
- lib/pupistry/bootstrap.rb
|
95
178
|
- lib/pupistry/config.rb
|
96
179
|
- lib/pupistry/gpg.rb
|
97
180
|
- lib/pupistry/storage_aws.rb
|
181
|
+
- lib/pupistry/version.rb
|
182
|
+
- lib/pupistry.rb
|
98
183
|
- resources/aws/cfn_pupistry_bucket_and_iam.template
|
99
184
|
- resources/aws/README_AWS.md
|
100
185
|
- resources/bootstrap/amazon-any.erb
|
@@ -105,6 +190,8 @@ files:
|
|
105
190
|
- resources/bootstrap/fedora-any.erb
|
106
191
|
- resources/bootstrap/freebsd-10.erb
|
107
192
|
- resources/bootstrap/ubuntu-14.04.erb
|
193
|
+
- resources/packer/amazon_linux.json
|
194
|
+
- resources/packer/test_user_data.txt
|
108
195
|
- README.md
|
109
196
|
- settings.example.yaml
|
110
197
|
homepage: https://github.com/jethrocarr/pupistry
|