vagrant-lxc 1.2.4 → 1.3.0

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: 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