duostack 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/bin/duostack +43 -5
  2. data/vendor/duostack-startcom.pem +44 -0
  3. metadata +5 -4
@@ -28,8 +28,8 @@ $client = File.basename(__FILE__)
28
28
  module Duostack
29
29
  class Client
30
30
 
31
- VERSION = '0.2.0'
32
- DEPENDENCIES_LAST_MODIFIED = 1297154481
31
+ VERSION = '0.2.1'
32
+ DEPENDENCIES_LAST_MODIFIED = 1298683372
33
33
  USER_AGENT = "duostack-#{VERSION}"
34
34
 
35
35
  DEFAULTS = {
@@ -184,6 +184,15 @@ module Duostack
184
184
  exit_with "missing dependency, please install curl (http://curl.haxx.se/download.html)"
185
185
  end
186
186
 
187
+ # curl with --cacert flag (version >= 7.5)
188
+ version = `curl -V`.split.select { |s| s =~ /^(\d+\.)?(\d+\.)?(\d+\.)?(\*|\d+)$/ }.first # http://stackoverflow.com/questions/82064/a-regex-for-version-number-parsing
189
+ major, minor, patch = version.split('.').collect { |s| s.to_i } # split on dots and convert to ints
190
+ major, minor, patch = [major, minor, patch].collect { |v| v ||= 0 } # default each to 0
191
+ if major < 7 || (major == 7 && minor < 5)
192
+ exit_with "missing dependency, curl 7.5 or later is required (you have #{version})"
193
+ end
194
+
195
+
187
196
  # curl SSL
188
197
  # handled inside api_host method
189
198
 
@@ -236,7 +245,8 @@ module Duostack
236
245
  end
237
246
 
238
247
  def require_ssh_key
239
- @ssh_key ||= `cat #{ssh_key_location}`.chomp
248
+ keyfile = ssh_key_location
249
+ @ssh_key ||= `cat #{keyfile}`.chomp if keyfile
240
250
  unless @ssh_key
241
251
  exit_with "an SSH key is required to run this command, please generate an SSH key and try again (http://docs.duostack.com/command-line-client#setup)"
242
252
  end
@@ -305,6 +315,11 @@ module Duostack
305
315
 
306
316
  # clean up argument
307
317
  argument = CGI::escape(argument)
318
+ else
319
+ # ensure we *don't* have any further arguments for list/clear which don't allow them
320
+ unless @args.empty?
321
+ exit_with("unrecognized argument: '#{@args.first}', run '#{@client} help #{@command}' for usage")
322
+ end
308
323
  end
309
324
 
310
325
  # finally, process action
@@ -366,6 +381,26 @@ module Duostack
366
381
  end
367
382
  end
368
383
 
384
+ def ca_cert_location
385
+ return @ca_cert_location if @ca_cert_location # easy memoization
386
+
387
+ candidates = [
388
+ File.join($dir, '..', 'vendor', 'duostack-startcom.pem'), # gem packages
389
+ File.join($dir, '.duostack-startcom.pem') # npm, tgz packages
390
+ ]
391
+
392
+ candidates.each do |filename|
393
+ if File.exist?(filename)
394
+ @ca_cert_location = filename
395
+ return filename
396
+ end
397
+ end
398
+
399
+ # if we get to this point, the cert wasn't found
400
+ warn_with "custom certificate authority file not present, using system CA bundle"
401
+ return nil
402
+ end
403
+
369
404
  def api_host
370
405
  @api_host ||= begin
371
406
  host = "https://duostack.duostack.net"
@@ -393,11 +428,14 @@ module Duostack
393
428
  end
394
429
 
395
430
  def curl_get(url, timeout=nil)
396
- command = "curl -s#{'v' if ENV['DSDEBUG']} -A '#{USER_AGENT}' -w '\n%{http_code}' '#{url}'" # use w flag to append http status code
431
+ command = "curl -s -A '#{USER_AGENT}' -w '\n%{http_code}'" # use w flag to append http status code, set user-agent header
432
+ command += " --cacert #{ca_cert_location}" if ca_cert_location # use our own certificate if present
397
433
  command += " -m #{timeout}" if timeout
398
- raw = `#{command}`
434
+ command += " -v" if ENV['DSDEBUG']
435
+ command += " '#{url}'" # finally, the actual URL to curl
399
436
 
400
437
  debug command
438
+ raw = `#{command}`
401
439
  debug raw
402
440
 
403
441
  # break apart the raw result and extract the HTTP status code, reassemble
@@ -0,0 +1,44 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
3
+ MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
4
+ Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
5
+ dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
6
+ MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
7
+ U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
8
+ cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
9
+ A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
10
+ pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
11
+ OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
12
+ Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
13
+ Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
14
+ HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
15
+ Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
16
+ +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
17
+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
18
+ Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
19
+ 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
20
+ AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
21
+ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
22
+ ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
23
+ LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
24
+ BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
25
+ Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
26
+ dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
27
+ cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
28
+ YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
29
+ dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
30
+ bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
31
+ YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
32
+ TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
33
+ 9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
34
+ jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
35
+ FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
36
+ ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
37
+ ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
38
+ EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
39
+ L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
40
+ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
41
+ O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
42
+ um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
43
+ NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
44
+ -----END CERTIFICATE-----
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: duostack
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 0
10
- version: 0.2.0
9
+ - 1
10
+ version: 0.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Todd Eichel
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-17 00:00:00 -05:00
18
+ date: 2011-02-28 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -33,6 +33,7 @@ files:
33
33
  - bin/.duostack-console-expect
34
34
  - bin/bash/.duostack-console-expect
35
35
  - bin/duostack
36
+ - vendor/duostack-startcom.pem
36
37
  has_rdoc: true
37
38
  homepage: http://www.duostack.com/
38
39
  licenses: []