vagrant-lxc 1.2.4 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be12d8c8e72a9909dec8bf1a588338dcba483bbc
4
- data.tar.gz: 4331cfda3e8612bf69e4090c383967508387acb6
3
+ metadata.gz: 736cfddbd6bdf4b0fb8d6bbb5291e3dd30722835
4
+ data.tar.gz: 25d7fba64da0b3f42ae5b537b13db95b55db69ae
5
5
  SHA512:
6
- metadata.gz: 48107a2da8b24576f1af4999374f96819441332de0fffeed7602554347aed266a4f15e0f3d07e821b16fb54eb3d888b1556cd2db32ecfda3416415e00191fde0
7
- data.tar.gz: 7e40658d9a437855025e71b57c9ee82f25e532cc439410763adaa312c5abf2852571552159bd183cedfde9c92bf7e95a496fc602fa0ac9449fcc5c012c3875de
6
+ metadata.gz: 085fa926c3d0a3737487d7589b85ab833547bdf19134f544209915742640e5709bcbacef7aaccc76203cdf30068008dabbe509823625072afeb0bfe6d1a04937
7
+ data.tar.gz: 26cfe6cb8982ed036ed70d4b1aac50ff9c5720d87e3aef3cc87696a1c1cfa3697c31018de546c817aa482ac73f61a1f15f8ac678a0b8d0cabdde520691a4c618
data/.gitignore CHANGED
@@ -19,6 +19,7 @@ doc/
19
19
 
20
20
  /tags
21
21
  /gems.tags
22
+ /Gemfile.lock
22
23
 
23
24
  .vagrant
24
25
  /cache
data/.travis.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0.0
4
- - 2.1.1
5
- matrix:
6
- allow_failures:
7
- - rvm: 2.1.1
3
+ - 2.2
4
+ - 2.3
5
+ - 2.4
6
+ install:
7
+ - gem install -v 1.12.5 bundler
8
+ - bundle _1.12.5_ install --jobs=3 --retry=3
8
9
  script: "bundle exec rake ci"
data/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## [1.3.0](https://github.com/fgrehm/vagrant-lxc/compare/v1.2.4...v1.3.0) (Jan 20, 2018)
2
+
3
+ FEATURES:
4
+ - lxc-template: make runnable by unprivileged users [[GH-447]]
5
+ - Use `lxc-info` instead of `lxc-attach` to retrieve container IP
6
+ - Add support for LXC v2.1+ [[GH-445]]
7
+ - Remove 2Gb limitation on `/tmp`. [[GH-406]]
8
+
9
+ OTHERS:
10
+ - Bump Vagrant requirements to v1.8+
11
+ - Bump LXC requirements to v1.0+
12
+
13
+
14
+ [GH-447]: https://github.com/fgrehm/vagrant-lxc/pull/447
15
+ [GH-445]: https://github.com/fgrehm/vagrant-lxc/pull/445
16
+ [GH-406]: https://github.com/fgrehm/vagrant-lxc/pull/406
17
+
1
18
  ## [1.2.4](https://github.com/fgrehm/vagrant-lxc/compare/v1.2.3...v1.2.4) (Dec 20, 2017)
2
19
 
3
20
  BUGFIX:
data/Gemfile CHANGED
@@ -1,17 +1,18 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  group :development do
4
- gem 'vagrant', git: 'https://github.com/mitchellh/vagrant.git', tag: 'v1.7.4'
4
+ gem 'vagrant', git: 'https://github.com/mitchellh/vagrant.git', tag: 'v1.8.7'
5
5
  gem 'guard'
6
6
  gem 'guard-rspec'
7
7
  gem 'rb-inotify'
8
8
  end
9
9
 
10
10
  group :development, :test do
11
- gem 'rake'
12
- gem 'rspec', '2.99.0'
13
- gem 'coveralls', require: (ENV['COVERAGE'] == 'true')
14
- gem 'vagrant-spec', git: 'https://github.com/mitchellh/vagrant-spec.git'
11
+ gem 'rake', '~> 10.4.2'
12
+ gem 'rspec', '~> 2.99.0'
13
+ gem 'coveralls', '~> 0.7.2', require: (ENV['COVERAGE'] == 'true')
14
+ # The is the ref *just* before we switch to childprocess 0.6, which conflicts with vagrant 1.8 deps.
15
+ gem 'vagrant-spec', git: 'https://github.com/mitchellh/vagrant-spec.git', ref: '5006bc73cd8796465ca09307d4774f8ec8375aa0'
15
16
  end
16
17
 
17
18
  group :plugins do
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/fgrehm/vagrant-lxc.png?branch=master)](https://travis-ci.org/fgrehm/vagrant-lxc) [![Gem Version](https://badge.fury.io/rb/vagrant-lxc.png)](http://badge.fury.io/rb/vagrant-lxc) [![Code Climate](https://codeclimate.com/github/fgrehm/vagrant-lxc.png)](https://codeclimate.com/github/fgrehm/vagrant-lxc) [![Coverage Status](https://coveralls.io/repos/fgrehm/vagrant-lxc/badge.png?branch=master)](https://coveralls.io/r/fgrehm/vagrant-lxc) [![Gitter chat](https://badges.gitter.im/fgrehm/vagrant-lxc.png)](https://gitter.im/fgrehm/vagrant-lxc)
4
4
 
5
- [LXC](http://lxc.sourceforge.net/) provider for [Vagrant](http://www.vagrantup.com/) 1.6+
5
+ [LXC](http://lxc.sourceforge.net/) provider for [Vagrant](http://www.vagrantup.com/) 1.8+
6
6
 
7
7
  This is a Vagrant plugin that allows it to control and provision Linux Containers
8
8
  as an alternative to the built in VirtualBox provider for Linux hosts. Check out
@@ -17,17 +17,14 @@ to see it in action.
17
17
 
18
18
  ## Requirements
19
19
 
20
- * [Vagrant 1.5+](http://www.vagrantup.com/downloads.html) (tested with 1.7.2)
21
- * lxc >=0.7.5 and <2.1.0 (see [#445](https://github.com/fgrehm/vagrant-lxc/issues/445))
22
- * tar 1.27 (the lxc-template script uses the --xattrs option)
20
+ * [Vagrant 1.8+](http://www.vagrantup.com/downloads.html)
21
+ * lxc >=1.0
23
22
  * `redir` (if you are planning to use port forwarding)
24
23
  * `brctl` (if you are planning to use private networks, on Ubuntu this means `apt-get install bridge-utils`)
25
- * A [kernel != 3.5.0-17.28](https://github.com/fgrehm/vagrant-lxc/wiki/Troubleshooting#wiki-im-unable-to-restart-containers)
26
24
 
27
25
  The plugin is known to work better and pretty much out of the box on Ubuntu 14.04+
28
- hosts and installing the dependencies on it basically means a `apt-get install lxc lxc-templates cgroup-lite redir`
29
- (older LXC versions like 0.7.5 shipped with Ubuntu 12.04 by default might require
30
- [additional configurations to work](#backingstore-options)). For setting up other
26
+ hosts and installing the dependencies on it basically means a
27
+ `apt-get install lxc lxc-templates cgroup-lite redir`. For setting up other
31
28
  types of hosts please have a look at the [Wiki](https://github.com/fgrehm/vagrant-lxc/wiki).
32
29
 
33
30
  If you are on a Mac or Windows machine, you might want to have a look at [this](http://the.taoofmac.com/space/HOWTO/Vagrant)
@@ -155,16 +152,14 @@ end
155
152
 
156
153
  ## Avoiding `sudo` passwords
157
154
 
158
- This plugin requires **a lot** of `sudo`ing since [user namespaces](https://wiki.ubuntu.com/UserNamespace)
159
- is not supported yet. To work around that, you can use the `vagrant lxc sudoers`
155
+ This plugin requires **a lot** of `sudo`ing since [unprivileged containers](https://github.com/fgrehm/vagrant-lxc/issues/312)
156
+ are not supported yet. To work around that, you can use the `vagrant lxc sudoers`
160
157
  command which will create a file under `/etc/sudoers.d/vagrant-lxc` whitelisting
161
158
  all commands required by `vagrant-lxc` to run.
162
159
 
163
160
  If you are interested on what will be generated by that command, please check
164
161
  [this code](lib/vagrant-lxc/command/sudoers.rb).
165
162
 
166
- _vagrant-lxc < 1.0.0 users, please check this [Wiki page](https://github.com/fgrehm/vagrant-lxc/wiki/Avoiding-%27sudo%27-passwords)_
167
-
168
163
 
169
164
  ## More information
170
165
 
@@ -26,9 +26,6 @@ module Vagrant
26
26
  config.customize 'mount.entry', '/sys/fs/selinux sys/fs/selinux none bind,ro 0 0'
27
27
  end
28
28
 
29
- # Make /tmp a tmpfs to prevent init scripts from nuking synced folders mounted in here
30
- config.customize 'mount.entry', 'tmpfs tmp tmpfs nodev,nosuid,size=2G 0 0'
31
-
32
29
  env[:ui].info I18n.t("vagrant_lxc.messages.starting")
33
30
  env[:machine].provider.driver.start(config.customizations)
34
31
 
@@ -19,7 +19,8 @@ module Vagrant
19
19
  container_name = generate_container_name(env)
20
20
  end
21
21
 
22
- env[:machine].provider.driver.create(
22
+ driver = env[:machine].provider.driver
23
+ driver.create(
23
24
  container_name,
24
25
  config.backingstore,
25
26
  config.backingstore_options,
@@ -27,6 +28,7 @@ module Vagrant
27
28
  env[:lxc_template_config],
28
29
  env[:lxc_template_opts]
29
30
  )
31
+ driver.update_config_keys
30
32
 
31
33
  env[:machine].id = container_name
32
34
 
@@ -1,19 +1,17 @@
1
1
  module Vagrant
2
2
  module LXC
3
3
  module Action
4
- class FetchIpWithLxcAttach
4
+ class FetchIpWithLxcInfo
5
5
  # Include this so we can use `Subprocess` more easily.
6
6
  include Vagrant::Util::Retryable
7
7
 
8
8
  def initialize(app, env)
9
9
  @app = app
10
- @logger = Log4r::Logger.new("vagrant::lxc::action::fetch_ip_with_lxc_attach")
10
+ @logger = Log4r::Logger.new("vagrant::lxc::action::fetch_ip_with_lxc_info")
11
11
  end
12
12
 
13
13
  def call(env)
14
14
  env[:machine_ip] ||= assigned_ip(env)
15
- rescue LXC::Errors::NamespacesNotSupported
16
- @logger.info 'The `lxc-attach` command available does not support the --namespaces parameter, falling back to dnsmasq leases to fetch container ip'
17
15
  ensure
18
16
  @app.call(env)
19
17
  end
@@ -26,7 +24,7 @@ module Vagrant
26
24
  retryable(:on => LXC::Errors::ExecuteError, :tries => fetch_ip_tries, :sleep => 3) do
27
25
  unless ip = get_container_ip_from_ip_addr(driver)
28
26
  # retry
29
- raise LXC::Errors::ExecuteError, :command => "lxc-attach"
27
+ raise LXC::Errors::ExecuteError, :command => "lxc-info"
30
28
  end
31
29
  end
32
30
  ip
@@ -34,8 +32,8 @@ module Vagrant
34
32
 
35
33
  # From: https://github.com/lxc/lxc/blob/staging/src/python-lxc/lxc/__init__.py#L371-L385
36
34
  def get_container_ip_from_ip_addr(driver)
37
- output = driver.attach '/sbin/ip', '-4', 'addr', 'show', 'scope', 'global', 'eth0', namespaces: ['network', 'mount']
38
- if output =~ /^\s+inet ([0-9.]+)\/[0-9]+\s+/
35
+ output = driver.info '-iH'
36
+ if output =~ /^([0-9.]+)/
39
37
  return $1.to_s
40
38
  end
41
39
  end
@@ -0,0 +1,23 @@
1
+ module Vagrant
2
+ module LXC
3
+ module Action
4
+ class RemoveTemporaryFiles
5
+ def initialize(app, env)
6
+ @app = app
7
+ @logger = Log4r::Logger.new("vagrant::lxc::action::remove_tmp_files")
8
+ end
9
+
10
+ def call(env)
11
+ @logger.debug 'Removing temporary files'
12
+ driver = env[:machine].provider.driver
13
+ # To prevent host-side data loss, it's important that all mounts under /tmp are unmounted
14
+ # before we proceed with the `rm -rf` operation. See #68 and #360.
15
+ driver.attach("findmnt -R /tmp -o TARGET --list --noheadings | xargs -L 1 --no-run-if-empty umount")
16
+ driver.attach("rm -rf /tmp/*")
17
+
18
+ @app.call env
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -4,8 +4,7 @@ require 'vagrant-lxc/action/create'
4
4
  require 'vagrant-lxc/action/destroy'
5
5
  require 'vagrant-lxc/action/destroy_confirm'
6
6
  require 'vagrant-lxc/action/compress_rootfs'
7
- require 'vagrant-lxc/action/fetch_ip_with_lxc_attach'
8
- require 'vagrant-lxc/action/fetch_ip_from_dnsmasq_leases'
7
+ require 'vagrant-lxc/action/fetch_ip_with_lxc_info'
9
8
  require 'vagrant-lxc/action/forced_halt'
10
9
  require 'vagrant-lxc/action/forward_ports'
11
10
  require 'vagrant-lxc/action/gc_private_network_bridges'
@@ -13,6 +12,7 @@ require 'vagrant-lxc/action/handle_box_metadata'
13
12
  require 'vagrant-lxc/action/prepare_nfs_settings'
14
13
  require 'vagrant-lxc/action/prepare_nfs_valid_ids'
15
14
  require 'vagrant-lxc/action/private_networks'
15
+ require 'vagrant-lxc/action/remove_temporary_files'
16
16
  require 'vagrant-lxc/action/setup_package_files'
17
17
  require 'vagrant-lxc/action/warn_networks'
18
18
 
@@ -125,6 +125,7 @@ module Vagrant
125
125
  end
126
126
 
127
127
  b2.use ClearForwardedPorts
128
+ b2.use RemoveTemporaryFiles
128
129
  b2.use GcPrivateNetworkBridges
129
130
  b2.use Builtin::Call, Builtin::GracefulHalt, :stopped, :running do |env2, b3|
130
131
  if !env2[:result]
@@ -182,8 +183,7 @@ module Vagrant
182
183
  def self.action_ssh_ip
183
184
  Builder.new.tap do |b|
184
185
  b.use Builtin::Call, Builtin::ConfigValidate do |env, b2|
185
- b2.use FetchIpWithLxcAttach if env[:machine].provider.driver.supports_attach?
186
- b2.use FetchIpFromDnsmasqLeases
186
+ b2.use FetchIpWithLxcInfo
187
187
  end
188
188
  end
189
189
  end
@@ -1,6 +1,7 @@
1
1
  require 'tempfile'
2
2
 
3
3
  require "vagrant-lxc/driver"
4
+ require "vagrant-lxc/sudo_wrapper"
4
5
 
5
6
  module Vagrant
6
7
  module LXC
@@ -27,7 +28,7 @@ module Vagrant
27
28
  argv = parse_options(opts)
28
29
  return unless argv
29
30
 
30
- wrapper_path = Vagrant::LXC.sudo_wrapper_path
31
+ wrapper_path = SudoWrapper.dest_path
31
32
  wrapper = create_wrapper!
32
33
  sudoers = create_sudoers!(options[:user], wrapper_path)
33
34
 
@@ -45,7 +46,7 @@ module Vagrant
45
46
 
46
47
  # This requires vagrant 1.5.2+ https://github.com/mitchellh/vagrant/commit/3371c3716278071680af9b526ba19235c79c64cb
47
48
  def create_wrapper!
48
- lxc_base_path = Driver.new(0, LXC.sudo_wrapper).containers_path
49
+ lxc_base_path = Driver.new("").containers_path
49
50
  wrapper = Tempfile.new('lxc-wrapper').tap do |file|
50
51
  template = Vagrant::Util::TemplateRenderer.new(
51
52
  'sudoers.rb',
@@ -24,7 +24,6 @@ module Vagrant
24
24
  @customizations = []
25
25
  @backingstore = UNSET_VALUE
26
26
  @backingstore_options = []
27
- @sudo_wrapper = UNSET_VALUE
28
27
  @container_name = UNSET_VALUE
29
28
  @fetch_ip_tries = UNSET_VALUE
30
29
  end
@@ -50,7 +49,6 @@ module Vagrant
50
49
  end
51
50
 
52
51
  def finalize!
53
- @sudo_wrapper = nil if @sudo_wrapper == UNSET_VALUE
54
52
  @container_name = nil if @container_name == UNSET_VALUE
55
53
  @backingstore = "best" if @backingstore == UNSET_VALUE
56
54
  @existing_container_name = nil if @existing_container_name == UNSET_VALUE
@@ -29,7 +29,7 @@ module Vagrant
29
29
 
30
30
  def version
31
31
  return @version if @version
32
- @version = support_version_command? ? run(:version) : run(:create, '--version')
32
+ @version = run(:create, '--version')
33
33
  if @version =~ /(lxc version:\s+|)(.+)\s*$/
34
34
  @version = $2.downcase
35
35
  else
@@ -39,11 +39,11 @@ module Vagrant
39
39
  end
40
40
 
41
41
  def config(param)
42
- if support_config_command?
43
- run(:config, param).gsub("\n", '')
44
- else
45
- raise Errors::CommandNotSupported, name: 'config', available_version: '> 1.x.x', version: version
46
- end
42
+ run(:config, param).gsub("\n", '')
43
+ end
44
+
45
+ def update_config(path)
46
+ run('update-config', '-c', path)
47
47
  end
48
48
 
49
49
  def state
@@ -114,17 +114,17 @@ module Vagrant
114
114
  end
115
115
 
116
116
  if namespaces
117
- if supports_attach_with_namespaces?
118
- extra = ['--namespaces', namespaces]
119
- else
120
- raise LXC::Errors::NamespacesNotSupported
121
- end
117
+ extra = ['--namespaces', namespaces]
122
118
  end
123
119
  end
124
120
 
125
121
  run :attach, '--name', @name, *((extra || []) + cmd)
126
122
  end
127
123
 
124
+ def info(*cmd)
125
+ run(:info, '--name', @name, *cmd)
126
+ end
127
+
128
128
  def transition_to(target_state, tries = 30, timeout = 1, &block)
129
129
  raise TransitionBlockNotProvided unless block_given?
130
130
 
@@ -155,29 +155,11 @@ module Vagrant
155
155
  return @supports_attach
156
156
  end
157
157
 
158
- def support_config_command?
159
- version[0].to_i >= 1
160
- end
161
-
162
- def support_version_command?
163
- @sudo_wrapper.run('which', 'lxc-version').strip.chomp != ''
164
- rescue Vagrant::LXC::Errors::ExecuteError
165
- return false
166
- end
167
-
168
158
  private
169
159
 
170
160
  def run(command, *args)
171
161
  @sudo_wrapper.run("lxc-#{command}", *args)
172
162
  end
173
-
174
- def supports_attach_with_namespaces?
175
- unless defined?(@supports_attach_with_namespaces)
176
- @supports_attach_with_namespaces = run(:attach, '-h', :show_stderr => true).values.join.include?('--namespaces')
177
- end
178
-
179
- return @supports_attach_with_namespaces
180
- end
181
163
  end
182
164
  end
183
165
  end
@@ -3,6 +3,7 @@ require "vagrant/util/subprocess"
3
3
 
4
4
  require "vagrant-lxc/errors"
5
5
  require "vagrant-lxc/driver/cli"
6
+ require "vagrant-lxc/sudo_wrapper"
6
7
 
7
8
  require "etc"
8
9
 
@@ -16,15 +17,13 @@ module Vagrant
16
17
  class ContainerNotFound < StandardError; end
17
18
 
18
19
  # Default root folder where container configs are stored
19
- DEFAULT_CONTAINERS_PATH = '/var/lib/lxc'
20
-
21
20
  attr_reader :container_name,
22
21
  :customizations
23
22
 
24
- def initialize(container_name, sudo_wrapper, cli = nil)
23
+ def initialize(container_name, sudo_wrapper = nil, cli = nil)
25
24
  @container_name = container_name
26
- @sudo_wrapper = sudo_wrapper
27
- @cli = cli || CLI.new(sudo_wrapper, container_name)
25
+ @sudo_wrapper = sudo_wrapper || SudoWrapper.new()
26
+ @cli = cli || CLI.new(@sudo_wrapper, container_name)
28
27
  @logger = Log4r::Logger.new("vagrant::provider::lxc::driver")
29
28
  @customizations = []
30
29
  end
@@ -35,7 +34,7 @@ module Vagrant
35
34
 
36
35
  # Root folder where container configs are stored
37
36
  def containers_path
38
- @containers_path ||= @cli.support_config_command? ? @cli.config('lxc.lxcpath') : DEFAULT_CONTAINERS_PATH
37
+ @containers_path ||= @cli.config('lxc.lxcpath')
39
38
  end
40
39
 
41
40
  def all_containers
@@ -46,6 +45,10 @@ module Vagrant
46
45
  Pathname.new("#{containers_path}/#{@container_name}")
47
46
  end
48
47
 
48
+ def config_path
49
+ base_path.join('config').to_s
50
+ end
51
+
49
52
  def rootfs_path
50
53
  config_entry = config_string.match(/^lxc\.rootfs\s+=\s+(.+)$/)[1]
51
54
  case config_entry
@@ -73,7 +76,7 @@ module Vagrant
73
76
  end
74
77
 
75
78
  def config_string
76
- @sudo_wrapper.run('cat', base_path.join('config').to_s)
79
+ @sudo_wrapper.run('cat', config_path)
77
80
  end
78
81
 
79
82
  def create(name, backingstore, backingstore_options, template_path, config_file, template_options = {})
@@ -126,6 +129,10 @@ module Vagrant
126
129
  @cli.attach(*command)
127
130
  end
128
131
 
132
+ def info(*command)
133
+ @cli.info(*command)
134
+ end
135
+
129
136
  def configure_private_network(bridge_name, bridge_ip, container_name, address_type, ip)
130
137
  @logger.info "Configuring network interface for #{container_name} using #{ip} and bridge #{bridge_name}"
131
138
  if ip
@@ -237,6 +244,12 @@ module Vagrant
237
244
  write_config(contents)
238
245
  end
239
246
 
247
+ def update_config_keys
248
+ @cli.update_config(config_path)
249
+ rescue Errors::ExecuteError
250
+ # not on LXC 2.1+. Doesn't matter, ignore.
251
+ end
252
+
240
253
  protected
241
254
 
242
255
  def write_customizations(customizations)
@@ -257,8 +270,8 @@ module Vagrant
257
270
  file.chmod 0644
258
271
  file.write contents
259
272
  file.close
260
- @sudo_wrapper.run 'cp', '-f', file.path, base_path.join('config').to_s
261
- @sudo_wrapper.run 'chown', 'root:root', base_path.join('config').to_s
273
+ @sudo_wrapper.run 'cp', '-f', file.path, config_path
274
+ @sudo_wrapper.run 'chown', 'root:root', config_path
262
275
  end
263
276
  end
264
277
  end
@@ -25,9 +25,6 @@ module Vagrant
25
25
  end
26
26
 
27
27
 
28
- class NamespacesNotSupported < Vagrant::Errors::VagrantError
29
- end
30
-
31
28
  class LxcLinuxRequired < Vagrant::Errors::VagrantError
32
29
  error_key(:lxc_linux_required)
33
30
  end
@@ -2,6 +2,7 @@ require "log4r"
2
2
 
3
3
  require "vagrant-lxc/action"
4
4
  require "vagrant-lxc/driver"
5
+ require "vagrant-lxc/sudo_wrapper"
5
6
 
6
7
  module Vagrant
7
8
  module LXC
@@ -24,13 +25,9 @@ module Vagrant
24
25
  machine_id_changed
25
26
  end
26
27
 
27
- def sudo_wrapper
28
- @shell ||= LXC.sudo_wrapper
29
- end
30
-
31
28
  def ensure_lxc_installed!
32
29
  begin
33
- sudo_wrapper.run("which", "lxc-create")
30
+ SudoWrapper.new().run("which", "lxc-create")
34
31
  rescue Vagrant::LXC::Errors::ExecuteError
35
32
  raise Errors::LxcNotInstalled
36
33
  end
@@ -43,7 +40,7 @@ module Vagrant
43
40
 
44
41
  begin
45
42
  @logger.debug("Instantiating the container for: #{id.inspect}")
46
- @driver = Driver.new(id, self.sudo_wrapper)
43
+ @driver = Driver.new(id)
47
44
  @driver.validate!
48
45
  rescue Driver::ContainerNotFound
49
46
  # The container doesn't exist, so we probably have a stale
@@ -6,8 +6,12 @@ module Vagrant
6
6
 
7
7
  attr_reader :wrapper_path
8
8
 
9
- def initialize(wrapper_path = nil)
10
- @wrapper_path = wrapper_path
9
+ def self.dest_path
10
+ "/usr/local/bin/vagrant-lxc-wrapper"
11
+ end
12
+
13
+ def initialize()
14
+ @wrapper_path = Pathname.new(SudoWrapper.dest_path).exist? && SudoWrapper.dest_path || nil
11
15
  @logger = Log4r::Logger.new("vagrant::lxc::sudo_wrapper")
12
16
  end
13
17
 
@@ -1,5 +1,5 @@
1
1
  module Vagrant
2
2
  module LXC
3
- VERSION = "1.2.4"
3
+ VERSION = "1.3.0"
4
4
  end
5
5
  end
data/lib/vagrant-lxc.rb CHANGED
@@ -1,22 +1,10 @@
1
1
  require "vagrant-lxc/version"
2
2
  require "vagrant-lxc/plugin"
3
- require "vagrant-lxc/sudo_wrapper"
4
3
 
5
4
  module Vagrant
6
5
  module LXC
7
6
  def self.source_root
8
7
  @source_root ||= Pathname.new(File.dirname(__FILE__)).join('..').expand_path
9
8
  end
10
-
11
- def self.sudo_wrapper_path
12
- "/usr/local/bin/vagrant-lxc-wrapper"
13
- end
14
-
15
- def self.sudo_wrapper
16
- wrapper = Pathname.new(sudo_wrapper_path).exist? &&
17
- sudo_wrapper_path || nil
18
- SudoWrapper.new(wrapper)
19
- end
20
-
21
9
  end
22
10
  end
data/scripts/lxc-template CHANGED
@@ -110,7 +110,6 @@ fi
110
110
  # Unpack the rootfs
111
111
  echo "Unpacking the rootfs"
112
112
 
113
- mkdir -p /var/lock/subsys
114
113
  (
115
114
  flock -x 200
116
115
  if [ $? -ne 0 ]; then
@@ -119,13 +118,14 @@ mkdir -p /var/lock/subsys
119
118
  fi
120
119
 
121
120
  mkdir -p ${LXC_ROOTFS}
122
- (cd ${LXC_ROOTFS} && tar xfz ${LXC_TARBALL} --strip-components=${LXC_STRIP_COMPONENTS} --xattrs --xattrs-include=*)
123
- if [ $? -ne 0 ]; then
121
+ (cd ${LXC_ROOTFS} && tar xfz ${LXC_TARBALL} --strip-components=${LXC_STRIP_COMPONENTS} --xattrs --xattrs-include=* || true)
122
+ if [ ! -f ${LXC_ROOTFS}/bin/true ]; then
124
123
  echo "Failed to extract rootfs"
125
124
  exit 1
126
125
  fi
127
126
 
128
- ) 200>/var/lock/subsys/lxc
127
+ ) 200>${LXC_PATH}/vagrant_lock
128
+ rm ${LXC_PATH}/vagrant_lock
129
129
 
130
130
  mkdir -p ${LXC_ROOTFS}/dev/pts/
131
131
 
data/spec/Vagrantfile CHANGED
@@ -15,10 +15,6 @@ Vagrant.configure("2") do |config|
15
15
 
16
16
  config.cache.auto_detect = true
17
17
 
18
- config.vm.provider :lxc do |lxc|
19
- # lxc.sudo_wrapper = '/usr/bin/lxc-vagrant-wrapper'
20
- end
21
-
22
18
  config.vm.provision :shell,
23
19
  inline: 'mkdir -p /vagrant/tmp && echo -n "Provisioned" > /vagrant/tmp/provisioning'
24
20
 
@@ -30,16 +30,7 @@ describe Vagrant::LXC::Driver::CLI do
30
30
 
31
31
  describe 'version' do
32
32
  before do
33
- allow(subject).to receive(:support_version_command?).and_return(true)
34
- allow(subject).to receive(:run).with(:version).and_return(lxc_version_out)
35
- end
36
-
37
- describe 'lxc version before 1.x.x' do
38
- let(:lxc_version_out) { "lxc version: 0.x.y-rc1\n" }
39
-
40
- it 'parses the version from the output' do
41
- expect(subject.version).to eq('0.x.y-rc1')
42
- end
33
+ allow(subject).to receive(:run).with(:create, '--version').and_return(lxc_version_out)
43
34
  end
44
35
 
45
36
  describe 'lxc version after 1.x.x' do
@@ -53,24 +44,11 @@ describe Vagrant::LXC::Driver::CLI do
53
44
 
54
45
  describe 'config' do
55
46
  before do
56
- allow(subject).to receive(:support_version_command?).and_return(support_version_command?)
57
47
  allow(subject).to receive(:run).with(:config, 'lxc.lxcpath').and_return(lxc_config_out)
58
- allow(subject).to receive(:run).with(:version).and_return(lxc_version_out)
59
48
  allow(subject).to receive(:run).with(:create, '--version').and_return(lxc_version_out)
60
49
  end
61
50
 
62
- describe 'lxc version before 1.x.x' do
63
- let(:support_version_command?) { true }
64
- let(:lxc_config_out) { "/var/lib/lxc\n" }
65
- let(:lxc_version_out) { "lxc version: 0.x.y-rc1\n" }
66
-
67
- it 'not supported' do
68
- expect{subject.config('lxc.lxcpath')}.to raise_error(Vagrant::LXC::Errors::CommandNotSupported)
69
- end
70
- end
71
-
72
- describe 'lxc version before after 1.x.x'do
73
- let(:support_version_command?) { false }
51
+ describe 'lxc version after 1.x.x'do
74
52
  let(:lxc_config_out) { "/var/lib/lxc\n" }
75
53
  let(:lxc_version_out) { "1.0.0\n" }
76
54
 
@@ -232,13 +210,6 @@ describe Vagrant::LXC::Driver::CLI do
232
210
  subject.attach *(command + [{namespaces: ['network', 'mount']}])
233
211
  expect(subject).to have_received(:run).with(:attach, '--name', name, '--namespaces', 'NETWORK|MOUNT', '--', *command)
234
212
  end
235
-
236
- it 'raises a NamespacesNotSupported error if not supported' do
237
- allow(subject).to receive(:run).with(:attach, '-h', :show_stderr => true).and_return({:stdout => '', :stderr => 'not supported'})
238
- expect {
239
- subject.attach *(command + [{namespaces: ['network', 'mount']}])
240
- }.to raise_error(Vagrant::LXC::Errors::NamespacesNotSupported)
241
- end
242
213
  end
243
214
 
244
215
  describe 'transition block' do
@@ -89,7 +89,7 @@ describe Vagrant::LXC::Driver do
89
89
  describe 'start' do
90
90
  let(:customizations) { [['a', '1'], ['b', '2']] }
91
91
  let(:internal_customization) { ['internal', 'customization'] }
92
- let(:cli) { double(Vagrant::LXC::Driver::CLI, start: true, support_config_command?: false) }
92
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, start: true) }
93
93
  let(:sudo) { double(Vagrant::LXC::SudoWrapper) }
94
94
 
95
95
  subject { described_class.new('name', sudo, cli) }
@@ -99,6 +99,7 @@ describe Vagrant::LXC::Driver do
99
99
  and_return('# CONFIGURATION')
100
100
  sudo.should_receive(:run).twice.with('cp', '-f', %r{/(run|tmp)/.*}, '/var/lib/lxc/name/config')
101
101
  sudo.should_receive(:run).twice.with('chown', 'root:root', '/var/lib/lxc/name/config')
102
+ expect(cli).to receive(:config).with("lxc.lxcpath").and_return("/var/lib/lxc")
102
103
 
103
104
  subject.customizations << internal_customization
104
105
  subject.start(customizations)
@@ -152,21 +153,11 @@ describe Vagrant::LXC::Driver do
152
153
  end
153
154
 
154
155
  describe 'containers_path' do
155
- let(:cli) { double(Vagrant::LXC::Driver::CLI, config: cli_config_value, support_config_command?: cli_support_config_command_value) }
156
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, config: cli_config_value) }
156
157
 
157
158
  subject { described_class.new('name', nil, cli) }
158
159
 
159
- describe 'lxc version before 1.x.x' do
160
- let(:cli_support_config_command_value) { false }
161
- let(:cli_config_value) { '/var/lib/lxc' }
162
-
163
- it 'delegates to cli' do
164
- expect(subject.containers_path).to eq(cli_config_value)
165
- end
166
- end
167
-
168
160
  describe 'lxc version after 1.x.x' do
169
- let(:cli_support_config_command_value) { true }
170
161
  let(:cli_config_value) { '/etc/lxc' }
171
162
 
172
163
  it 'delegates to cli' do
@@ -109,6 +109,7 @@ Whitelist.add_regex %r{<%= pipework_regex %>}, '**'
109
109
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-version'
110
110
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-ls'
111
111
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-info', '--name', /.*/
112
+ Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-info', '--name', /.*/, '-iH'
112
113
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-create', '-B', /.*/, '--template', /.*/, '--name', /.*/, '**'
113
114
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-create', '--version'
114
115
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-destroy', '--name', /.*/
@@ -118,6 +119,7 @@ Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-shutdown', '--name', /.*/
118
119
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-attach', '--name', /.*/, '**'
119
120
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-attach', '-h'
120
121
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-config', 'lxc.lxcpath'
122
+ Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-update-config', '-c', /.*/
121
123
 
122
124
  ##
123
125
  # Commands from driver/action/remove_temporary_files.rb
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-lxc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Rehm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-20 00:00:00.000000000 Z
11
+ date: 2018-01-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Linux Containers provider for Vagrant
14
14
  email:
@@ -25,7 +25,6 @@ files:
25
25
  - CHANGELOG.md
26
26
  - CONTRIBUTING.md
27
27
  - Gemfile
28
- - Gemfile.lock
29
28
  - Guardfile
30
29
  - LICENSE.txt
31
30
  - README.md
@@ -38,8 +37,7 @@ files:
38
37
  - lib/vagrant-lxc/action/create.rb
39
38
  - lib/vagrant-lxc/action/destroy.rb
40
39
  - lib/vagrant-lxc/action/destroy_confirm.rb
41
- - lib/vagrant-lxc/action/fetch_ip_from_dnsmasq_leases.rb
42
- - lib/vagrant-lxc/action/fetch_ip_with_lxc_attach.rb
40
+ - lib/vagrant-lxc/action/fetch_ip_with_lxc_info.rb
43
41
  - lib/vagrant-lxc/action/forced_halt.rb
44
42
  - lib/vagrant-lxc/action/forward_ports.rb
45
43
  - lib/vagrant-lxc/action/gc_private_network_bridges.rb
@@ -47,6 +45,7 @@ files:
47
45
  - lib/vagrant-lxc/action/prepare_nfs_settings.rb
48
46
  - lib/vagrant-lxc/action/prepare_nfs_valid_ids.rb
49
47
  - lib/vagrant-lxc/action/private_networks.rb
48
+ - lib/vagrant-lxc/action/remove_temporary_files.rb
50
49
  - lib/vagrant-lxc/action/setup_package_files.rb
51
50
  - lib/vagrant-lxc/action/warn_networks.rb
52
51
  - lib/vagrant-lxc/command/root.rb
data/Gemfile.lock DELETED
@@ -1,182 +0,0 @@
1
- GIT
2
- remote: https://github.com/fgrehm/vagrant-cachier.git
3
- revision: 40dddfb368526948e769492a00a7937c5a044a4d
4
- specs:
5
- vagrant-cachier (1.2.1)
6
-
7
- GIT
8
- remote: https://github.com/fgrehm/vagrant-pristine.git
9
- revision: 6d044265db17451c606f000bf43437e95a742bb4
10
- specs:
11
- vagrant-pristine (0.3.0)
12
-
13
- GIT
14
- remote: https://github.com/mitchellh/vagrant-spec.git
15
- revision: 1df5a3af81cb7cce568b2eac52b8f6822bcb1d8e
16
- specs:
17
- vagrant-spec (0.0.1)
18
- childprocess (~> 0.5.0)
19
- log4r (~> 1.1.9)
20
- rspec (~> 2.14)
21
- thor (~> 0.18.1)
22
-
23
- GIT
24
- remote: https://github.com/mitchellh/vagrant.git
25
- revision: 78ea5e4a78ce644717ab16d8001ab77430168f0f
26
- tag: v1.7.4
27
- specs:
28
- vagrant (1.7.4)
29
- bundler (>= 1.5.2, <= 1.10.5)
30
- childprocess (~> 0.5.0)
31
- erubis (~> 2.7.0)
32
- hashicorp-checkpoint (~> 0.1.1)
33
- i18n (>= 0.6.0, <= 0.8.0)
34
- listen (~> 3.0.2)
35
- log4r (~> 1.1.9, < 1.1.11)
36
- net-scp (~> 1.1.0)
37
- net-sftp (~> 2.1)
38
- net-ssh (>= 2.6.6, < 2.10.0)
39
- nokogiri (= 1.6.3.1)
40
- rb-kqueue (~> 0.2.0)
41
- rest-client (>= 1.6.0, < 2.0)
42
- wdm (~> 0.1.0)
43
- winrm (~> 1.3)
44
- winrm-fs (~> 0.2.0)
45
-
46
- PATH
47
- remote: .
48
- specs:
49
- vagrant-lxc (1.2.4)
50
-
51
- GEM
52
- remote: https://rubygems.org/
53
- specs:
54
- builder (3.2.2)
55
- childprocess (0.5.6)
56
- ffi (~> 1.0, >= 1.0.11)
57
- coderay (1.1.0)
58
- coveralls (0.7.2)
59
- multi_json (~> 1.3)
60
- rest-client (= 1.6.7)
61
- simplecov (>= 0.7)
62
- term-ansicolor (= 1.2.2)
63
- thor (= 0.18.1)
64
- diff-lcs (1.2.5)
65
- docile (1.1.5)
66
- erubis (2.7.0)
67
- ffi (1.9.10)
68
- formatador (0.2.5)
69
- gssapi (1.2.0)
70
- ffi (>= 1.0.1)
71
- guard (2.12.8)
72
- formatador (>= 0.2.4)
73
- listen (>= 2.7, <= 4.0)
74
- lumberjack (~> 1.0)
75
- nenv (~> 0.1)
76
- notiffany (~> 0.0)
77
- pry (>= 0.9.12)
78
- shellany (~> 0.0)
79
- thor (>= 0.18.1)
80
- guard-compat (1.2.1)
81
- guard-rspec (4.6.2)
82
- guard (~> 2.1)
83
- guard-compat (~> 1.1)
84
- rspec (>= 2.99.0, < 4.0)
85
- gyoku (1.3.1)
86
- builder (>= 2.1.2)
87
- hashicorp-checkpoint (0.1.4)
88
- httpclient (2.6.0.1)
89
- i18n (0.7.0)
90
- json (1.8.3)
91
- listen (3.0.2)
92
- rb-fsevent (>= 0.9.3)
93
- rb-inotify (>= 0.9)
94
- little-plugger (1.1.3)
95
- log4r (1.1.10)
96
- logging (1.8.2)
97
- little-plugger (>= 1.1.3)
98
- multi_json (>= 1.8.4)
99
- lumberjack (1.0.9)
100
- method_source (0.8.2)
101
- mime-types (2.6.1)
102
- mini_portile (0.6.0)
103
- multi_json (1.11.2)
104
- nenv (0.2.0)
105
- net-scp (1.1.2)
106
- net-ssh (>= 2.6.5)
107
- net-sftp (2.1.2)
108
- net-ssh (>= 2.6.5)
109
- net-ssh (2.9.2)
110
- nokogiri (1.6.3.1)
111
- mini_portile (= 0.6.0)
112
- nori (2.6.0)
113
- notiffany (0.0.6)
114
- nenv (~> 0.1)
115
- shellany (~> 0.0)
116
- pry (0.10.1)
117
- coderay (~> 1.1.0)
118
- method_source (~> 0.8.1)
119
- slop (~> 3.4)
120
- rake (10.4.2)
121
- rb-fsevent (0.9.5)
122
- rb-inotify (0.9.5)
123
- ffi (>= 0.5.0)
124
- rb-kqueue (0.2.4)
125
- ffi (>= 0.5.0)
126
- rest-client (1.6.7)
127
- mime-types (>= 1.16)
128
- rspec (2.99.0)
129
- rspec-core (~> 2.99.0)
130
- rspec-expectations (~> 2.99.0)
131
- rspec-mocks (~> 2.99.0)
132
- rspec-core (2.99.2)
133
- rspec-expectations (2.99.2)
134
- diff-lcs (>= 1.1.3, < 2.0)
135
- rspec-mocks (2.99.4)
136
- rubyntlm (0.4.0)
137
- rubyzip (1.1.7)
138
- shellany (0.0.1)
139
- simplecov (0.10.0)
140
- docile (~> 1.1.0)
141
- json (~> 1.8)
142
- simplecov-html (~> 0.10.0)
143
- simplecov-html (0.10.0)
144
- slop (3.6.0)
145
- term-ansicolor (1.2.2)
146
- tins (~> 0.8)
147
- thor (0.18.1)
148
- tins (0.13.2)
149
- uuidtools (2.1.5)
150
- vagrant-omnibus (1.4.1)
151
- wdm (0.1.1)
152
- winrm (1.3.3)
153
- builder (>= 2.1.2)
154
- gssapi (~> 1.2)
155
- gyoku (~> 1.0)
156
- httpclient (~> 2.2, >= 2.2.0.2)
157
- logging (~> 1.6, >= 1.6.1)
158
- nori (~> 2.0)
159
- rubyntlm (~> 0.4.0)
160
- uuidtools (~> 2.1.2)
161
- winrm-fs (0.2.0)
162
- erubis (~> 2.7)
163
- logging (~> 1.6, >= 1.6.1)
164
- rubyzip (~> 1.1)
165
- winrm (~> 1.3.0)
166
-
167
- PLATFORMS
168
- ruby
169
-
170
- DEPENDENCIES
171
- coveralls
172
- guard
173
- guard-rspec
174
- rake
175
- rb-inotify
176
- rspec (= 2.99.0)
177
- vagrant!
178
- vagrant-cachier!
179
- vagrant-lxc!
180
- vagrant-omnibus
181
- vagrant-pristine!
182
- vagrant-spec!
@@ -1,49 +0,0 @@
1
- module Vagrant
2
- module LXC
3
- module Action
4
- class FetchIpFromDnsmasqLeases
5
- def initialize(app, env)
6
- @app = app
7
- @logger = Log4r::Logger.new("vagrant::lxc::action::fetch_ip_from_dnsmasq_leases")
8
- end
9
-
10
- def call(env)
11
- env[:machine_ip] ||= assigned_ip(env)
12
- @app.call(env)
13
- end
14
-
15
- def assigned_ip(env)
16
- mac_address = env[:machine].provider.driver.mac_address
17
- ip = nil
18
- 10.times do
19
- dnsmasq_leases = read_dnsmasq_leases
20
- @logger.debug "Attempting to load ip from dnsmasq leases (mac: #{mac_address})"
21
- @logger.debug dnsmasq_leases
22
- if dnsmasq_leases =~ /#{Regexp.escape mac_address.to_s}\s+([0-9.]+)\s+/i
23
- ip = $1.to_s
24
- break
25
- else
26
- @logger.debug 'Ip could not be parsed from dnsmasq leases file'
27
- sleep 2
28
- end
29
- end
30
- ip
31
- end
32
-
33
- LEASES_PATHS = %w(
34
- /var/lib/misc/dnsmasq.*.leases
35
- /var/lib/misc/dnsmasq.leases
36
- /var/lib/dnsmasq/dnsmasq.leases
37
- /var/db/dnsmasq.leases
38
- /var/lib/libvirt/dnsmasq/*.leases
39
- )
40
-
41
- def read_dnsmasq_leases
42
- Dir["{#{LEASES_PATHS.join(',')}}"].map do |file|
43
- File.read(file)
44
- end.join("\n")
45
- end
46
- end
47
- end
48
- end
49
- end