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.
@@ -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