duostack 0.2.0 → 0.2.1

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.
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: []