lux 1.0.5 → 1.0.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8d5b17560966b0d42c68cc11280dd78d122555c1
4
- data.tar.gz: adbebd07c74ce022217dee2464969dc3bfef7de7
3
+ metadata.gz: 8be0be4990f3bbdb5b2d7117a756996543f38262
4
+ data.tar.gz: 90e03ff7bcdd4cb679d728258d5cf27b8ec8d907
5
5
  SHA512:
6
- metadata.gz: 2b176d8c351517d852d173ee752bd83648a7e4d82dcea665585c90d35cfd27e628729b1878f42af2c1d33cb477e6b882abbe9aadb45ea3f5db096d8e7924a6dd
7
- data.tar.gz: da28e7e66292c1e92faf4ae8a99915f9ff98a1093d540650017a1d17545d925f2e64603688e59b66ef4252e016e9a5858985b70c488c2f913f1ec37cc82d5885
6
+ metadata.gz: 2b855936cae4a5b38ef7e94e9bbba9e9d99e2175c825132efca363a1c18627b063e7f6a9665a3f5a0515ea9158e0c4bdafd9bf8cf44fba2b4d01d5e7025646e2
7
+ data.tar.gz: ae712eb0ab6690e7edb49ced1c7592f119aedba172c4863aaa0f86f6a42a639e4a5bbfc58fd579bbd5db8a69ace4198f57ac5237646666983b8f58b4dbeae328
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ lux (1.0.6)
2
+
3
+ * Improve address check for Docker server
4
+ * Disable Docker tasks if tcp based server cannot be found
5
+ * Return Docker version number on 'dockerip' command
6
+
7
+ -- Nick Townsend <nick.townsend@mac.com> Fri, 21 Aug 2015 17:12:20 -0700
8
+
1
9
  lux (1.0.5)
2
10
 
3
11
  * Send only 'export' command to STDOUT in lux dockerip.
data/lib/lux.rb CHANGED
@@ -1,32 +1,43 @@
1
1
  require 'highline/import'
2
2
  require 'uri'
3
3
  require 'socket'
4
+ require 'json'
4
5
 
5
6
  module Lux
6
7
 
8
+ module_function
9
+
7
10
  # Determine the IPv4 address of the current Docker host
8
11
  # Used to avoid long reverse DNS lookups on .local names
9
- # Returns either nil if the lookup failed, or a triplet:
10
- # - the IPv4 address as a string
11
- # - a URI object
12
+ # Returns an array of four items:
13
+ # - the IPv4 address as a string or nil if it couldn't be found
14
+ # or wasn't an IP URL
12
15
  # - a string saying which variable was used, 'URL' or 'HOST'
16
+ # - a URI object
17
+ # - a hash containing the Docker version information
13
18
  # Note that DOCKER_URL is used by the docker-api client, but
14
19
  # as Docker uses the misleading DOCKER_HOST we fallback to that.
15
20
  #
16
- def self.dockerip
21
+ def dockerip
17
22
  vars = ['DOCKER_URL', 'DOCKER_HOST']
18
23
  var, url = vars.map{|v| [v, ENV[v]]}.find{|d| d[1]}
19
- return nil unless var
24
+ return nil, nil, nil, nil unless var
20
25
  uri = URI.parse(url)
21
- name = uri.host
22
- addrs = Socket.getaddrinfo(name, nil, :INET, :STREAM, 0, 0, false) rescue []
23
- name = addrs.first[3] if addrs.size > 0
24
- return name, var, uri
26
+ return nil, var, url, nil unless uri.scheme == 'tcp'
27
+ addr = nil
28
+ info = nil
29
+ Addrinfo.tcp(uri.host, uri.port).connect(timeout: 5) {|s|
30
+ addr = s.remote_address.ip_address
31
+ s.print "GET /version HTTP/1.0\r\nHost: localhost\r\n\r\n"
32
+ response, emptyline, body = s.read.partition(/(\r\n){2}/)
33
+ info = JSON.parse(body, symbolize_names: true)
34
+ } rescue nil
35
+ return addr, var, uri, info
25
36
  end
26
37
 
27
38
  # Get the current list of images and make a guess at which one it is...
28
39
  #
29
- def self.findimage image
40
+ def findimage image
30
41
  local_images = `docker images`.strip.split("\n")[1..-1].map{|l| l.gsub!(/^(\S+)\s+(\S+).*/,'\1:\2')}.sort
31
42
  matching_images = local_images.select{|l| l.include? image }
32
43
  if matching_images.size > 0
@@ -51,7 +62,7 @@ module Lux
51
62
  # - user name (defaults to current user), and
52
63
  # - a bash script setup command
53
64
  #
54
- def self.user_setup_cmd user = `id -nu`.strip
65
+ def user_setup_cmd user = `id -nu`.strip
55
66
  [user, <<-COMMAND.gsub(/^\s*/,'').gsub(/\n/,' ; ')]
56
67
  uid=$(echo $(stat -c %u:%g #{ENV['HOME']}) | cut -d: -f2)
57
68
  useradd -M -d #{ENV['HOME']} -u $uid -s #{ENV['SHELL']} #{user}
@@ -59,9 +70,17 @@ module Lux
59
70
  COMMAND
60
71
  end
61
72
 
62
- def self.die msg, rc = 1
73
+ def die msg, rc = 1
74
+ error msg
75
+ exit rc
76
+ end
77
+
78
+ def error msg
63
79
  HighLine.new(STDIN, STDERR).say HighLine.color(msg, HighLine::RED)
64
- exit(rc)
80
+ end
81
+
82
+ def info msg
83
+ HighLine.new(STDIN, STDERR).say HighLine.color(msg, HighLine::YELLOW)
65
84
  end
66
85
 
67
86
  end
data/lib/lux/app.rb CHANGED
@@ -175,13 +175,18 @@ class Lux::App < Thor
175
175
 
176
176
  desc "dockerip", "Show DOCKER_HOST IP address in exportable format. Use $(lux dockerip) to set it"
177
177
  def dockerip
178
- name, var, uri = Lux.dockerip
179
- Lux.die "Docker URL or HOST not found" unless name
180
- STDERR.puts "Found #{var}=#{uri.to_s}"
178
+ name, var, uri, info = Lux.dockerip
179
+ Lux.die "Not found: #{var}=#{uri.to_s}" unless name
181
180
  if uri.host != name
182
181
  uri.host = name
182
+ msg = "Set"
183
183
  puts "export #{var}=#{uri.to_s}"
184
+ else
185
+ msg = "Found"
184
186
  end
187
+ msg << ": #{var}=#{uri.to_s}"
188
+ msg << " (version #{info[:Version]})" if info
189
+ Lux.info msg
185
190
  end
186
191
 
187
192
  end
@@ -5,11 +5,6 @@ require 'lux'
5
5
  require 'rake'
6
6
  require 'socket'
7
7
 
8
- # Set this to avoid 5 sec timeouts with .local addresses
9
- # which don't resolve in IPv6
10
- #
11
- Docker.options = { family: Socket::Constants::AF_INET }
12
-
13
8
  module Rake
14
9
  module DSL
15
10
  def dockerimage(*args, &block)
@@ -22,6 +17,26 @@ module Rake
22
17
  end
23
18
 
24
19
  module Lux
20
+
21
+ addr, var, uri = Lux.dockerip
22
+
23
+ DISABLED = case
24
+ when !addr && var && uri.scheme == 'tcp'
25
+ error "Invalid Docker server, disabling Docker tasks!"
26
+ true
27
+ else
28
+ begin
29
+ # Set this to avoid 5 sec timeouts with .local addresses
30
+ # which don't resolve in IPv6
31
+ Docker.options = { family: Socket::Constants::AF_INET, connect_timeout: 5 }
32
+ Docker.validate_version!
33
+ false
34
+ rescue Exception => e
35
+ error "Docker problem (#{e.message}), tasks will be disabled"
36
+ true
37
+ end
38
+ end
39
+
25
40
  class DockerImageTask < Rake::FileTask
26
41
  # This task checks to see if the image is present in the local Docker Server
27
42
  # If present it returns the creation date as the timestamp, if not then it
@@ -32,14 +47,17 @@ module Lux
32
47
  super(task_name, app)
33
48
  @imagename = @name
34
49
  @imagename += ':latest' unless @imagename.index(':')
35
- @image = Docker::Image.all.select{|i| i.info['RepoTags'].include? @imagename}.first
50
+ @image = DISABLED ? nil :
51
+ Docker::Image.all.select{|i| i.info['RepoTags'].include? @imagename}.first
36
52
  end
37
53
 
38
54
  def needed?
55
+ return false if DISABLED
39
56
  ! @image || out_of_date?(timestamp) || @application.options.build_all
40
57
  end
41
58
 
42
59
  def timestamp
60
+ return Time.now if DISABLED
43
61
  if @image = Docker::Image.all.select{|i| i.info['RepoTags'].include? @imagename}.first
44
62
  Time.at(@image.info['Created'])
45
63
  else
@@ -61,12 +79,15 @@ module Lux
61
79
  super(task_name, app)
62
80
  @containername, sep, @imagename = task_name.partition('@')
63
81
  raise "Task #{task_name} must be name@image" if @containername.empty? or @imagename.empty?
64
- @container = Docker::Container.get(@containername) rescue nil
65
- @imagename += ':latest' unless @imagename.index(':')
66
- @image = Docker::Image.all.select{|i| i.info['RepoTags'].include? @imagename}.first
82
+ unless DISABLED
83
+ @container = Docker::Container.get(@containername) rescue nil
84
+ @imagename += ':latest' unless @imagename.index(':')
85
+ @image = Docker::Image.all.select{|i| i.info['RepoTags'].include? @imagename}.first
86
+ end
67
87
  end
68
88
 
69
89
  def needed?
90
+ return false if DISABLED
70
91
  not @container or
71
92
  @container.info["Image"] != @image.id or
72
93
  not @container.info["State"]["Running"] or
@@ -102,6 +123,7 @@ module Lux
102
123
  end
103
124
 
104
125
  def timestamp
126
+ return Time.now if DISABLED
105
127
  if @container = Docker::Container.get(@containername) rescue nil
106
128
  Time.iso8601(@container.info['Created'])
107
129
  else
data/lib/lux/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lux
2
- VERSION = "1.0.5"
2
+ VERSION = "1.0.6"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lux
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Townsend
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-14 00:00:00.000000000 Z
11
+ date: 2015-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor