Class: Lux::App
- Inherits:
-
Thor
- Object
- Thor
- Lux::App
- Defined in:
- lib/lux/app.rb
Overview
The Thor subclass containing useful tasks shared between the Lux standalone executable and Rake tasks.
Constant Summary collapse
- EXCLUDE_VARS =
%w{ _ HOME PWD TMPDIR SSH_AUTH_SOCK SHLVL DISPLAY Apple_PubSub_Socket_Render SECURITYSESSIONID XPC_SERVICE_NAME XPC_FLAGS __CF_USER_TEXT_ENCODING TERM_PROGRAM TERM_PROGRAM_VERSION TERM_SESSION_ID }
Instance Method Summary collapse
- #check ⇒ Object
- #clean ⇒ Object
- #clobber ⇒ Object
- #dockerip ⇒ Object
- #exec(image, *command) ⇒ Object
- #lsimages(pattern = nil) ⇒ Object
- #rmimages(pattern = nil) ⇒ Object
- #start(image) ⇒ Object
- #tidy ⇒ Object
- #version ⇒ Object
Instance Method Details
#check ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/lux/app.rb', line 19 def check repobranch = `git symbolic-ref -q HEAD`.chomp.gsub(%r{^.*/},'') puts "Repository is on branch #{repobranch}" `git fetch --recurse-submodules=on-demand` nModuleErr = 0 nModuleWarn = 0 # Inspect any submodules currently checked out submodules = Hash[`git submodule status --recursive`.split(/\n/).map do |s| Lux.die "Bad submodule status #{s}" unless /^(?<flag>[-+U\s])(?<sha>[0-9a-f]{40})\s(?<path>\S+)(\s*\((?<ref>\S+)\))?$/ =~ s case flag when '-' Highline.say "Submodule at #{path} is <%= color('not initialized', RED) %>!" nModuleWarn += 1 when '+' Highline.say "Submodule at #{path} is <%= color('not at correct commit', RED) %>!" nModuleErr += 1 when 'U' Highline.say "Submodule at #{path} is <%= color('conflicted', RED) %>!" nModuleErr += 1 else Highline.say "Submodule at #{path} is <%= color('OK', GREEN) %>" end [path, [flag, sha, ref]] end ] Lux.die "There were #{nModuleErr} submodule errors and #{nModuleWarn} warnings" if nModuleErr > 0 # If the submodule status (above) was good, then we can ignore any submodule issues here changes = `git status --porcelain`.split(/\n/).reject do |ch| Lux.die "Bad status #{ch}" unless /^(?<x>.)(?<y>.)\s(?<path1>\S+)( -> (?<path2>\S+))?$/ =~ ch submodules.include? path1 end if changes.size > 0 Lux.die "Repository is not clean (#{changes.size} issues), use 'git status'" else HighLine.say "<%= color('Repository is clean', GREEN) %>" end end |
#clean ⇒ Object
96 97 98 99 100 101 102 103 |
# File 'lib/lux/app.rb', line 96 def clean exited = `docker ps -q -f status=exited`.gsub! /\n/,' ' if exited and not exited.empty? system "docker rm #{exited}" else puts "No exited containers" end end |
#clobber ⇒ Object
166 167 168 169 170 171 172 173 174 |
# File 'lib/lux/app.rb', line 166 def clobber clean running = `docker ps -q -f status=running`.gsub! /\n/,' ' if running and not running.empty? system "docker rm -f #{running}" else puts "No running containers" end end |
#dockerip ⇒ Object
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/lux/app.rb', line 180 def dockerip name, uri, info = Lux.dockerip return Lux.info "Docker is not available" unless name var = 'DOCKER_HOST' case uri.scheme when 'tcp' uri.host = name if STDOUT.isatty Lux.info "Please export: #{var}=#{uri.to_s}" Lux.info "(You can use '$(lux dockerip)' to do this)" else Lux.info "Exported: #{var}=#{uri.to_s}" puts "export #{var}=#{uri.to_s}" end when 'unix' Lux.info "Docker is running on a Unix socket" end Lux.info "Version #{info['Version']}, OS: #{info['Os']}, Arch: #{info['Arch']}, Kernel: #{info['KernelVersion']}" if info end |
#exec(image, *command) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/lux/app.rb', line 83 def exec(image, *command) image = Lux.findimage image me, setup_cmd = user_setup_cmd Lux.die "You must be within your home directory!" unless relwd = Pathname.pwd.to_s.gsub!(/^#{ENV['HOME']}/,'~') command.map!{|m| m.start_with?('/') ? Pathname.new(m).relative_path_from(Pathname.pwd) : m } env = ENV.reject{|k,v| EXCLUDE_VARS.include? k or v =~/\s+/}.map{|k,v| "#{k}=#{v.shellescape}"} env += IO.readlines(.env).grep(/^(?!#)/).map(&:rstrip) if .env cmd = setup_cmd + "su - #{me} -c 'cd #{relwd}; env -i #{env.join(' ')} #{command.join(' ')}'" args = ["-v #{ENV['HOME']}:#{ENV['HOME']}"] system "docker run --rm #{args.join(' ')} #{image} /bin/bash -c #{cmd.shellescape}" end |
#lsimages(pattern = nil) ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/lux/app.rb', line 117 def lsimages(pattern=nil) if .regex pattern = '.*' unless pattern rx = Regexp.new(pattern) matcher = lambda {|s| rx.match(s)} else pattern = '*' unless pattern matcher = lambda {|s| File.fnmatch?(pattern, s)} end imagelines = `docker images`.split("\n")[1..-1].sort imagelines.each do |imageline| imageinfo = imageline.split(/\s+/) next if imageinfo[0] == '<none>' imagename = imageinfo[0]+':'+imageinfo[1] imagesize = imageinfo[-2]+' '+imageinfo[-1] imageage = imageinfo[3..-3].join(' ') next unless matcher.call(imagename) printf "%-54s%-16s%10s\n", imagename, imageage, imagesize end end |
#rmimages(pattern = nil) ⇒ Object
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/lux/app.rb', line 141 def rmimages(pattern=nil) if .regex pattern = '.*' unless pattern rx = Regexp.new(pattern) matcher = lambda {|s| rx.match(s)} else pattern = '*' unless pattern matcher = lambda {|s| File.fnmatch?(pattern, s)} end imagelines = `docker images`.split("\n")[1..-1] imagelines.each do |imageline| imageinfo = imageline.split(/\s+/) next if imageinfo[0] == '<none>' imagename = imageinfo[0]+':'+imageinfo[1] imagesize = imageinfo[-2]+' '+imageinfo[-1] imageage = imageinfo[3..-3].join(' ') next unless matcher.call(imagename) if .force or (agree("Delete #{imagename} (#{imageage}, #{imagesize})? "){|q|q.echo=true}) `docker rmi #{options.force ? '-f':''} #{imageinfo[2]}` HighLine.say "Image <%= color('#{imagename}', RED)%> deleted" end end end |
#start(image) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/lux/app.rb', line 60 def start(image) image = Lux.findimage image raise "no image" if image.empty? puts "Starting #{image} container..." me, setup_cmd = Lux.user_setup_cmd() args = ["-v #{ENV['HOME']}:#{ENV['HOME']}"] args << "--env-file=#{options.env}" if .env args << "--name=#{options.name}" unless .name == '<autogenerated>' args << (.port ? "-p #{options.port}" : "-P") cid = `docker run -dit #{args.join(' ')} #{image} /bin/bash`.strip Lux.die "Container failed to start" unless cid =~ /^[a-z0-9]+$/ system "docker exec #{cid} bash -c #{setup_cmd.shellescape}" puts "Type 'su [-] #{me}' then hit enter to attach to the container as yourself:" Kernel.exec "docker attach #{cid}" end |
#tidy ⇒ Object
106 107 108 109 110 111 112 113 |
# File 'lib/lux/app.rb', line 106 def tidy images = `docker images -f "dangling=true" -q` if images.size > 0 system 'docker rmi $(docker images -f "dangling=true" -q)' else puts "No dangling images" end end |
#version ⇒ Object
14 15 16 |
# File 'lib/lux/app.rb', line 14 def version puts "Version #{Lux::VERSION}" end |