pupistry 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|