cloudstrap-azure 0.4.6.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,140 @@
1
+ #! /usr/bin/env ruby -W0
2
+ # coding: utf-8
3
+ # -*- ruby -*-
4
+
5
+ require 'json' # Ruby Standard Library
6
+ require 'optparse' # Ruby Standard Library
7
+ require 'ostruct' # Ruby Standard Library
8
+ require 'set' # Ruby Standard Library
9
+ require 'time' # Ruby Standard Library
10
+
11
+ require 'azure_mgmt_subscriptions' # MIT License
12
+ require 'tty-prompt' # MIT License
13
+ require 'tty-which' # MIT License
14
+
15
+ #############
16
+ # Constants #
17
+ #############
18
+
19
+ NullToken = Struct.new(:accessToken)
20
+
21
+ ####################
22
+ # Helper Functions #
23
+ ####################
24
+
25
+ Or = ->(first, *rest) { first || (Or.(*rest) unless rest.empty?) }
26
+ CommandInPath = ->(command) { TTY::Which.which(command) }
27
+ Environment = ->(variable) { ENV.fetch(variable) { nil } }
28
+ EnvironmentKey = ->(*strings) { strings.flatten.join('_').upcase.tr('.', '_') }
29
+ ExpandPath = ->(*paths) { File.expand_path(File.join(paths.flatten)) }
30
+ IsExecutable = ->(file) { File.executable?(file.to_s) }
31
+ ReadFile = ->(file) { File.read(file) if File.exist?(file) }
32
+ RunCommand = ->(command, *args) { %x(#{command} #{args.join(' ')}) if IsExecutable.(command) }
33
+ ParseJSON = ->(json) { [JSON.parse((json || '[]'), object_class: OpenStruct)].flatten.reject(&:nil?) }
34
+ HasExpiration = ->(token) { token.expiresOn }
35
+ ExpirationToTime = ->(token) { token.expiresOn = Time.parse(token.expiresOn) }
36
+ TokensFromJSON = ->(json) { ParseJSON.(json).select(&HasExpiration).each(&ExpirationToTime) }
37
+ Stale = ->(token) { token.expiresOn < Time.now }
38
+ Freshest = ->(tokens) { tokens.reject(&Stale).sort_by(&:expiresOn).last }
39
+ Resource = ->(resource) { "https://#{resource}/" }
40
+ ForResource = ->(resource, token) { (token.resource == Resource.(resource)) if token.respond_to?(:resource) }.curry
41
+ PrettyJSON = ->(object) { object.is_a?(String) ? PrettyJSON.(JSON.parse(string)) : JSON.pretty_generate(object) }
42
+ Warn = ->(message) { TTY::Prompt.new.warn message }
43
+ Error = ->(message) { TTY::Prompt.new.error message }
44
+
45
+ ################
46
+ # Main Program #
47
+ ################
48
+
49
+ features = Set.new
50
+
51
+ OptionParser.new do |parser|
52
+ parser.on('-S', '--with-subscription-id') { features << :subscription_id }
53
+ parser.on('-T', '--with-tenant-id') { features << :tenant_id }
54
+ end.parse!
55
+
56
+ env = %w(management.azure.com graph.windows.net).map do |resource|
57
+ variable = EnvironmentKey.(resource, 'ACCESS_TOKEN')
58
+ access_token = Environment.(variable) || (
59
+ Freshest.(
60
+ TokensFromJSON.(
61
+ ReadFile.(
62
+ ExpandPath.(
63
+ Or.(
64
+ Environment.('DOT_AZURE'),
65
+ %w(~ .azure)),
66
+ 'accessTokens.json')))
67
+ .select(
68
+ &ForResource.(
69
+ resource))) ||
70
+ Freshest.(
71
+ TokensFromJSON.(
72
+ RunCommand.(
73
+ Or.(
74
+ Environment.('AZURE_CLI'),
75
+ CommandInPath.('az')),
76
+ 'account',
77
+ 'get-access-token',
78
+ '--resource',
79
+ Resource.(
80
+ resource)))) ||
81
+ NullToken.new
82
+ ).accessToken
83
+ [variable, access_token]
84
+ end.to_h
85
+
86
+ if [:subscription_id, :tenant_id].any? { |feature| features.include?(feature) }
87
+ ACCESS_TOKEN = MsRest::TokenCredentials.new(env['MANAGEMENT_AZURE_COM_ACCESS_TOKEN'])
88
+
89
+ azure = Azure::Subscriptions::Mgmt::V2016_06_01::SubscriptionClient.new(ACCESS_TOKEN)
90
+
91
+ begin
92
+ subscriptions = azure.subscriptions.list
93
+ .select { |subscription| subscription.state == 'Enabled' }
94
+ tenants = azure.tenants.list
95
+ rescue MsRestAzure::AzureOperationError => error
96
+ abort Error.(PrettyJSON.(error.response.body))
97
+ end
98
+ end
99
+
100
+ if features.include?(:subscription_id)
101
+ env['AZURE_SUBSCRIPTION_ID'] = ENV['AZURE_SUBSCRIPTION_ID'] || (
102
+ case subscriptions.size
103
+ when 0
104
+ abort Error.('ERROR: No Subscriptions are Enabled')
105
+ when 1
106
+ subscriptions.first.subscription_id
107
+ else
108
+ Warn.('Multiple Subscriptions Found')
109
+ SelectFromMenu.(
110
+ 'Select a Subscription:',
111
+ subscriptions.map { |subscription| [
112
+ subscription.display_name,
113
+ subscription.subscription_id]})
114
+ end)
115
+ end
116
+
117
+ if features.include? :tenant_id
118
+ env['AZURE_TENANT_ID'] = ENV['AZURE_TENANT_ID'] || (
119
+ case tenants.size
120
+ when 0
121
+ abort Error.('Error: No Tenants Available')
122
+ when 1
123
+ tenants.first.tenant_id
124
+ else
125
+ Warn.('Multiple Tenants Found')
126
+ SelectFromMenu.(
127
+ 'Select a Tenant:',
128
+ tenants.map(&:tenant_id))
129
+ end)
130
+ end
131
+
132
+ env['AZURE_ACCESS_TOKEN'] = env['MANAGEMENT_AZURE_COM_ACCESS_TOKEN']
133
+
134
+ abort if env.values.any?(&:nil?)
135
+
136
+ if ARGV.empty?
137
+ STDOUT.puts PrettyJSON.(env)
138
+ else
139
+ exec(env, *ARGV)
140
+ end
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIENDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdjaHJp
3
+ cy9EQz1vbHN0cm9tL0RDPWNvbTAeFw0xODAzMTUxODMxMTdaFw0xOTAzMTUxODMx
4
+ MTdaMCIxIDAeBgNVBAMMF2NocmlzL0RDPW9sc3Ryb20vREM9Y29tMIIBojANBgkq
5
+ hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAp31YmQvpMuQSlgX22B++/rxl4p4LYyaq
6
+ cDDbi8DBro9cm2H60lbpCuAUALiED2CagZEK0vel5W8AnZhhns0OEYAlpQtBSJtN
7
+ 8P/jlNYruuY26aVhfHfyA5j1n7tVecJz3i/awEPGC3zuTfvUq7Ahn5czOy+hIm4M
8
+ epee881dqnJlXjzTX/TKFYQa9tYj4bhsjfJOV+EDMcao/DE3vmNcBKH8XFVv/wQe
9
+ MGC7VY5zBwow00AkCicNmIr0Psy5hLvqphJ/E3Eiu4UpXhiBfM0z7xiBPoPMBqOx
10
+ r1RzgfKm/JbDO7leFmrEi8hLofyMmbuGvrSTE274vS4EnKaW6OtK7QM5R+jOJZbd
11
+ 67KUgSw+LdHNwu8xCuuQOdKPeSfWdNz94KAdczjzHdXUl/SpfmTuN/D+BCZjTxSo
12
+ F1kACSU6uGTBFKZy35XK+yqeny/1l6xRs6j+cON+LSRMKYSt7jdLcKQVk5wH2xLo
13
+ 83njwnumFxKhiWu0oaT5dlDCtyYM85j9AgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYD
14
+ VR0PBAQDAgSwMB0GA1UdDgQWBBQEd3/D0MMj9FHhMZk0QJDlrUtKaTAcBgNVHREE
15
+ FTATgRFjaHJpc0BvbHN0cm9tLmNvbTAcBgNVHRIEFTATgRFjaHJpc0BvbHN0cm9t
16
+ LmNvbTANBgkqhkiG9w0BAQsFAAOCAYEALritM5RkGNZ7cs8hlljSEyuwJrbJYOSX
17
+ 6p1S0D83GlfGZ/5XABy1p4EGQjxiAYuDrnnIw6GLHpgxFEtUNvyNYVfAa6u6yz4Y
18
+ nEjbEF76zAAxoRfivDApGJ3G9wuZ14cHZswFJppf2N4RG14F8bfLtU1OMYDLw8eK
19
+ QJOpynqHtrSj+FfsyNb6d93K8rlNCEd4UHkdRH1m7VnG6M18HvkbQCRMJtOFg/3j
20
+ c66TgdClDMJJXXiktVinfsmpTwxe2IzjGvwo2CZ/S53WPU/jb4uQMUzY0tMw48rl
21
+ S07/1DQNogstTnLYueqkUS1PYEwtavKVnpAtnaOdf0rJ/Rk4hA36BRgAVyQrp0uu
22
+ mSbo3NCvepJNYsTOUM+Df421VuPq713JV0aJDqltyfPptTM7fmNMcukbRh0aRuMT
23
+ EIKh6yDoB+oCRuiTV0uw/lKE2PtbONhJb7uN1qhZqla/iBpmUjiEu8+skI+ygv9n
24
+ 7Krw8FJrV3+VRCiZTPKHeshAfL9yeIZh
25
+ -----END CERTIFICATE-----
metadata ADDED
@@ -0,0 +1,390 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloudstrap-azure
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.6.pre
5
+ platform: ruby
6
+ authors:
7
+ - Chris Olstrom
8
+ autorequire:
9
+ bindir: command
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIENDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdjaHJp
14
+ cy9EQz1vbHN0cm9tL0RDPWNvbTAeFw0xODAzMTUxODMxMTdaFw0xOTAzMTUxODMx
15
+ MTdaMCIxIDAeBgNVBAMMF2NocmlzL0RDPW9sc3Ryb20vREM9Y29tMIIBojANBgkq
16
+ hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAp31YmQvpMuQSlgX22B++/rxl4p4LYyaq
17
+ cDDbi8DBro9cm2H60lbpCuAUALiED2CagZEK0vel5W8AnZhhns0OEYAlpQtBSJtN
18
+ 8P/jlNYruuY26aVhfHfyA5j1n7tVecJz3i/awEPGC3zuTfvUq7Ahn5czOy+hIm4M
19
+ epee881dqnJlXjzTX/TKFYQa9tYj4bhsjfJOV+EDMcao/DE3vmNcBKH8XFVv/wQe
20
+ MGC7VY5zBwow00AkCicNmIr0Psy5hLvqphJ/E3Eiu4UpXhiBfM0z7xiBPoPMBqOx
21
+ r1RzgfKm/JbDO7leFmrEi8hLofyMmbuGvrSTE274vS4EnKaW6OtK7QM5R+jOJZbd
22
+ 67KUgSw+LdHNwu8xCuuQOdKPeSfWdNz94KAdczjzHdXUl/SpfmTuN/D+BCZjTxSo
23
+ F1kACSU6uGTBFKZy35XK+yqeny/1l6xRs6j+cON+LSRMKYSt7jdLcKQVk5wH2xLo
24
+ 83njwnumFxKhiWu0oaT5dlDCtyYM85j9AgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYD
25
+ VR0PBAQDAgSwMB0GA1UdDgQWBBQEd3/D0MMj9FHhMZk0QJDlrUtKaTAcBgNVHREE
26
+ FTATgRFjaHJpc0BvbHN0cm9tLmNvbTAcBgNVHRIEFTATgRFjaHJpc0BvbHN0cm9t
27
+ LmNvbTANBgkqhkiG9w0BAQsFAAOCAYEALritM5RkGNZ7cs8hlljSEyuwJrbJYOSX
28
+ 6p1S0D83GlfGZ/5XABy1p4EGQjxiAYuDrnnIw6GLHpgxFEtUNvyNYVfAa6u6yz4Y
29
+ nEjbEF76zAAxoRfivDApGJ3G9wuZ14cHZswFJppf2N4RG14F8bfLtU1OMYDLw8eK
30
+ QJOpynqHtrSj+FfsyNb6d93K8rlNCEd4UHkdRH1m7VnG6M18HvkbQCRMJtOFg/3j
31
+ c66TgdClDMJJXXiktVinfsmpTwxe2IzjGvwo2CZ/S53WPU/jb4uQMUzY0tMw48rl
32
+ S07/1DQNogstTnLYueqkUS1PYEwtavKVnpAtnaOdf0rJ/Rk4hA36BRgAVyQrp0uu
33
+ mSbo3NCvepJNYsTOUM+Df421VuPq713JV0aJDqltyfPptTM7fmNMcukbRh0aRuMT
34
+ EIKh6yDoB+oCRuiTV0uw/lKE2PtbONhJb7uN1qhZqla/iBpmUjiEu8+skI+ygv9n
35
+ 7Krw8FJrV3+VRCiZTPKHeshAfL9yeIZh
36
+ -----END CERTIFICATE-----
37
+ date: 2018-04-19 00:00:00.000000000 Z
38
+ dependencies:
39
+ - !ruby/object:Gem::Dependency
40
+ name: azure_graph_rbac
41
+ requirement: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - "~>"
44
+ - !ruby/object:Gem::Version
45
+ version: '0.16'
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 0.16.0
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0.16'
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: 0.16.0
59
+ - !ruby/object:Gem::Dependency
60
+ name: azure_mgmt_authorization~> 0.17
61
+ requirement: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: 0.17.0
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 0.17.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: azure_mgmt_compute~> 0.17
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.17.0
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 0.17.0
87
+ - !ruby/object:Gem::Dependency
88
+ name: azure_mgmt_container_service
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '0.16'
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 0.16.0
97
+ type: :runtime
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.16'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 0.16.0
107
+ - !ruby/object:Gem::Dependency
108
+ name: azure_mgmt_network
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '0.16'
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 0.16.0
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '0.16'
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 0.16.0
127
+ - !ruby/object:Gem::Dependency
128
+ name: azure_mgmt_resources~> 0.16
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: 0.16.0
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: 0.16.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: azure_mgmt_subscriptions~> 0.16
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: 0.16.0
148
+ type: :runtime
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: 0.16.0
155
+ - !ruby/object:Gem::Dependency
156
+ name: chamber
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: '2.12'
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: 2.12.0
165
+ type: :runtime
166
+ prerelease: false
167
+ version_requirements: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '2.12'
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: 2.12.0
175
+ - !ruby/object:Gem::Dependency
176
+ name: chronic
177
+ requirement: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: '0.10'
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: 0.10.0
185
+ type: :runtime
186
+ prerelease: false
187
+ version_requirements: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - "~>"
190
+ - !ruby/object:Gem::Version
191
+ version: '0.10'
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 0.10.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: concurrent-ruby
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.0'
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: 1.0.5
205
+ type: :runtime
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - "~>"
210
+ - !ruby/object:Gem::Version
211
+ version: '1.0'
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: 1.0.5
215
+ - !ruby/object:Gem::Dependency
216
+ name: pastel
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '0.7'
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: 0.7.0
225
+ type: :runtime
226
+ prerelease: false
227
+ version_requirements: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - "~>"
230
+ - !ruby/object:Gem::Version
231
+ version: '0.7'
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: 0.7.0
235
+ - !ruby/object:Gem::Dependency
236
+ name: sshkey~> 1.9
237
+ requirement: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ version: 1.9.0
242
+ type: :runtime
243
+ prerelease: false
244
+ version_requirements: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - ">="
247
+ - !ruby/object:Gem::Version
248
+ version: 1.9.0
249
+ - !ruby/object:Gem::Dependency
250
+ name: tty-prompt
251
+ requirement: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - "~>"
254
+ - !ruby/object:Gem::Version
255
+ version: '0.16'
256
+ - - ">="
257
+ - !ruby/object:Gem::Version
258
+ version: 0.16.0
259
+ type: :runtime
260
+ prerelease: false
261
+ version_requirements: !ruby/object:Gem::Requirement
262
+ requirements:
263
+ - - "~>"
264
+ - !ruby/object:Gem::Version
265
+ version: '0.16'
266
+ - - ">="
267
+ - !ruby/object:Gem::Version
268
+ version: 0.16.0
269
+ - !ruby/object:Gem::Dependency
270
+ name: tty-spinner
271
+ requirement: !ruby/object:Gem::Requirement
272
+ requirements:
273
+ - - "~>"
274
+ - !ruby/object:Gem::Version
275
+ version: '0.8'
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: 0.8.0
279
+ type: :runtime
280
+ prerelease: false
281
+ version_requirements: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: '0.8'
286
+ - - ">="
287
+ - !ruby/object:Gem::Version
288
+ version: 0.8.0
289
+ - !ruby/object:Gem::Dependency
290
+ name: tty-which
291
+ requirement: !ruby/object:Gem::Requirement
292
+ requirements:
293
+ - - "~>"
294
+ - !ruby/object:Gem::Version
295
+ version: '0.3'
296
+ - - ">="
297
+ - !ruby/object:Gem::Version
298
+ version: 0.3.0
299
+ type: :runtime
300
+ prerelease: false
301
+ version_requirements: !ruby/object:Gem::Requirement
302
+ requirements:
303
+ - - "~>"
304
+ - !ruby/object:Gem::Version
305
+ version: '0.3'
306
+ - - ">="
307
+ - !ruby/object:Gem::Version
308
+ version: 0.3.0
309
+ - !ruby/object:Gem::Dependency
310
+ name: uuid
311
+ requirement: !ruby/object:Gem::Requirement
312
+ requirements:
313
+ - - "~>"
314
+ - !ruby/object:Gem::Version
315
+ version: '2.3'
316
+ - - ">="
317
+ - !ruby/object:Gem::Version
318
+ version: 2.3.8
319
+ type: :runtime
320
+ prerelease: false
321
+ version_requirements: !ruby/object:Gem::Requirement
322
+ requirements:
323
+ - - "~>"
324
+ - !ruby/object:Gem::Version
325
+ version: '2.3'
326
+ - - ">="
327
+ - !ruby/object:Gem::Version
328
+ version: 2.3.8
329
+ - !ruby/object:Gem::Dependency
330
+ name: xxhash
331
+ requirement: !ruby/object:Gem::Requirement
332
+ requirements:
333
+ - - "~>"
334
+ - !ruby/object:Gem::Version
335
+ version: '0.4'
336
+ - - ">="
337
+ - !ruby/object:Gem::Version
338
+ version: 0.4.0
339
+ type: :runtime
340
+ prerelease: false
341
+ version_requirements: !ruby/object:Gem::Requirement
342
+ requirements:
343
+ - - "~>"
344
+ - !ruby/object:Gem::Version
345
+ version: '0.4'
346
+ - - ">="
347
+ - !ruby/object:Gem::Version
348
+ version: 0.4.0
349
+ description:
350
+ email: chris@olstrom.com
351
+ executables:
352
+ - cloudstrap-azure
353
+ extensions: []
354
+ extra_rdoc_files: []
355
+ files:
356
+ - ".gitignore"
357
+ - Gemfile
358
+ - LICENSE.txt
359
+ - README.org
360
+ - cloudstrap-azure.gemspec
361
+ - command/cloudstrap-azure
362
+ - command/internal/cloudstrap-azure.configure
363
+ - command/internal/cloudstrap-azure.deploy
364
+ - command/internal/cloudstrap-azure.environment
365
+ - trust/certificates/colstrom.pem
366
+ homepage: https://github.com/colstrom/cloudstrap-azure
367
+ licenses:
368
+ - MIT
369
+ metadata: {}
370
+ post_install_message:
371
+ rdoc_options: []
372
+ require_paths:
373
+ - lib
374
+ required_ruby_version: !ruby/object:Gem::Requirement
375
+ requirements:
376
+ - - ">="
377
+ - !ruby/object:Gem::Version
378
+ version: '0'
379
+ required_rubygems_version: !ruby/object:Gem::Requirement
380
+ requirements:
381
+ - - ">"
382
+ - !ruby/object:Gem::Version
383
+ version: 1.3.1
384
+ requirements: []
385
+ rubyforge_project:
386
+ rubygems_version: 2.7.6
387
+ signing_key:
388
+ specification_version: 4
389
+ summary: Cloudstrap for Azure
390
+ test_files: []