pupistry 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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::Storage_AWS
7
+ # Pupistry::StorageAWS
7
8
 
8
- class Storage_AWS
9
+ class StorageAWS
9
10
  attr_accessor :s3
10
11
  attr_accessor :bucket
11
12
 
12
- def initialize mode
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["general"]["s3_bucket"]
19
- $logger.fatal "You must set the AWS s3_bucket"
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]["access_key_id"]
25
- unless $config[mode]["access_key_id"] == ''
26
- $logger.debug "Loading AWS credentials from configuration file"
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
- :access_key_id => $config[mode]["access_key_id"],
30
- :secret_access_key => $config[mode]["secret_access_key"],
31
- :region => $config[mode]["region"],
32
- :proxy_uri => $config[mode]["proxy_uri"],
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 "No AWS IAM credentials specified, defaulting to environmental discovery"
40
- $logger.debug "If you get weird permissions errors, try setting the credentials explicity in config first."
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[ $config[mode]["s3_bucket"] ]
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["general"]["s3_prefix"]}#{dest}"
57
- s3_obj = @s3.buckets[$config["general"]["s3_bucket"]].objects[s3_obj_name]
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(:file => src)
58
+ s3_obj.write(file: src)
61
59
 
62
- rescue AWS::S3::Errors::NoSuchBucket => e
63
- $logger.fatal "S3 bucket #{$config["general"]["s3_bucket"]} does not exist"
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 => e
67
- $logger.fatal "Access to S3 bucket #{$config["general"]["s3_bucket"]} denied"
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["general"]["s3_bucket"]}."
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["general"]["s3_bucket"]}, probably invalid IAM credentials"
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 => e
79
- $logger.error "AWS credentials not supplied. You must either:"
80
- $logger.error "a) Specify them in the config file for Pupistry"
81
- $logger.error "b) Use IAM roles with an EC2 instance."
82
- $logger.error "c) Set them in ENV as AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY"
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 Exception => e
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["general"]["s3_prefix"]}#{src}"
98
- s3_obj = @s3.buckets[$config["general"]["s3_bucket"]].objects[s3_obj_name]
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 => e
115
- $logger.debug "No such file exists for download, this is normal at times."
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 => e
119
- $logger.fatal "S3 bucket #{$config["general"]["s3_bucket"]} does not exist"
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 => e
123
- $logger.fatal "Access to S3 bucket #{$config["general"]["s3_bucket"]} denied"
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["general"]["s3_bucket"]}."
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["general"]["s3_bucket"]}, probably invalid IAM credentials"
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 => e
135
- $logger.error "AWS credentials not supplied. You must either:"
136
- $logger.error "a) Specify them in the config file for Pupistry"
137
- $logger.error "b) Use IAM roles with an EC2 instance."
138
- $logger.error "c) Set them in ENV as AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY"
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 Exception => e
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
@@ -0,0 +1,3 @@
1
+ module Pupistry
2
+ VERSION = '1.1.0'
3
+ end
@@ -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.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jethro Carr
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2015-05-10 00:00:00.000000000 Z
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
- - bin/pupistry
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