vagrant_bootstrap 0.1.11 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,34 +1,43 @@
1
1
  require 'erb'
2
2
  require 'fileutils'
3
3
  require 'ostruct'
4
+ require 'log4r'
4
5
 
5
6
  module VagrantBootstrap
6
7
  class Bootstrap
7
8
  def initialize(opts)
8
- dir = opts.name
9
+ @opts = opts
10
+ end
11
+
12
+ def setup
13
+ make_directory
14
+ render
15
+ end
16
+
17
+ private
18
+
19
+ def make_directory
20
+ dir = @opts[:name]
21
+ FileUtils.rm_rf dir if @opts[:force]
9
22
  begin
10
- puts "Making directory #{dir}..." if opts.verbose
11
23
  FileUtils.mkdir_p dir
12
24
  rescue
13
25
  STDERR.puts "FATAL: #{dir} already exists!"
14
26
  exit false
15
27
  end
16
- render opts.template_file, "#{dir}/Vagrantfile", opts
17
28
  end
18
29
 
19
- private
20
-
21
- def render(template_file, target, opts)
22
- file = template_path(template_file)
30
+ def render
31
+ template_file = @opts[:template]
32
+ target = "#{@opts[:name]}/Vagrantfile"
33
+ file = template_path(template_file)
23
34
  if file.nil?
24
35
  STDERR.puts "FATAL: Couldn't find a template matching `#{template_file}'!"
25
36
  exit false
26
37
  end
27
- puts "Rendering #{target} from #{file}..." if opts.verbose
28
38
  template = open(file, 'r') {|f| f.read}
29
- render = ERB.new(template).result(opts.instance_eval {binding})
39
+ render = ERB.new(template).result(OpenStruct.new(@opts).instance_eval {binding})
30
40
  open(target, 'w') {|f| f.write render}
31
- puts "Done rendering #{target}." if opts.verbose
32
41
  end
33
42
 
34
43
  def template_path(file)
@@ -0,0 +1,44 @@
1
+ require 'optparse'
2
+ require 'vagrant'
3
+ require 'vagrant_bootstrap/bootstrap'
4
+ require 'vagrant_bootstrap/tap_bridge'
5
+
6
+ module VagrantBootstrap
7
+ module Commands
8
+ class Bootstrap < Vagrant::Command::Base
9
+ def execute
10
+ options = {}
11
+
12
+ opts = OptionParser.new do |o|
13
+ o.banner = 'Usage: vagrant bootstrap <name>'
14
+ o.separator ''
15
+
16
+ o.on('-b', '--bridge BRIDGE',
17
+ "Specify a bridge interface. Default is tap-#{whoami}") do |b|
18
+ options[:bridge] = b
19
+ end
20
+
21
+ o.on '-t', '--template TEMPLATE', 'Supply your own TEMPLATE' do |t|
22
+ options[:template] = t
23
+ end
24
+ end
25
+
26
+ argv = parse_options(opts)
27
+ return if !argv
28
+ raise Vagrant::Errors::CLIInvalidUsage, help: opts.help.chomp if argv.length < 1
29
+
30
+ options[:template] ||= 'default.erb'
31
+ options[:bridge] ||= VagrantBootstrap::TapBridge.new.iface
32
+ options[:name] = "vagrant-#{whoami}-#{argv[0].strip}"
33
+
34
+ VagrantBootstrap::Bootstrap.new(options).setup
35
+ end
36
+
37
+ private
38
+
39
+ def whoami
40
+ @whoami ||= `whoami`.strip
41
+ end
42
+ end
43
+ end
44
+ end
@@ -3,16 +3,34 @@ module VagrantBootstrap
3
3
 
4
4
  BRIDGE = 'br0'
5
5
 
6
- def me
7
- @me ||= `whoami`.strip
6
+ def initialize
7
+ check_for_bins
8
+ create_iface unless iface_exists?
9
+ create_bridge unless bridge_exists?
10
+ configure_bridge unless bridge_configured?
8
11
  end
9
12
 
10
13
  def iface
11
14
  @iface ||= "tap-#{me}"
12
15
  end
13
16
 
17
+ private
18
+
19
+ def check_for_bins
20
+ %w[brctl ip grep].each do |bin|
21
+ unless $?.exitstatus == 0
22
+ STDERR.puts "Required bin #{bin} not found in PATH. Install it or fix your PATH and try again."
23
+ exit false
24
+ end
25
+ end
26
+ end
27
+
28
+ def me
29
+ @me ||= `whoami`.strip
30
+ end
31
+
14
32
  def iface_exists?
15
- `ip tuntap|grep "#{iface}" 2>/dev/null`
33
+ `ip tuntap|grep "#{iface}" 2>&1 > /dev/null`
16
34
  $?.exitstatus == 0
17
35
  end
18
36
 
@@ -21,34 +39,28 @@ module VagrantBootstrap
21
39
  end
22
40
 
23
41
  def bridge_exists?
24
- `brctl show #{BRIDGE} 2>/dev/null | grep "No such device" 2>/dev/null`
25
- $? == 1
42
+ `brctl show #{BRIDGE} 2>&1 | grep "No such device" 2>&1 > /dev/null`
43
+ $?.exitstatus != 0
26
44
  end
27
45
 
28
46
  def create_bridge
29
- `sudo brctl addbr #{BRIDGE}`
30
- `sudo ip link set #{BRIDGE} up`
47
+ `sudo brctl addbr #{BRIDGE} 2>&1 > /dev/null`
48
+ `sudo ip link set #{BRIDGE} up 2>&1 > /dev/null`
31
49
  end
32
50
 
33
51
  def bridge_configured?
34
- `brctl show #{BRIDGE} 2>/dev/null | grep #{iface} 2>/dev/null`
52
+ `brctl show #{BRIDGE} 2>&1 | grep #{iface} 2>&1 > /dev/null`
35
53
  $?.exitstatus == 0
36
54
  end
37
55
 
38
56
  def link_up(link)
39
- `sudo ip link set #{link} up`
57
+ `sudo ip link set #{link} up 2>&1 > /dev/null`
40
58
  end
41
59
 
42
60
  def configure_bridge
43
- create_bridge unless bridge_exists?
44
- `sudo brctl addif #{BRIDGE} #{iface}`
61
+ `sudo brctl addif #{BRIDGE} #{iface} 2>&1 > /dev/null`
45
62
  link_up BRIDGE
46
63
  link_up iface
47
64
  end
48
-
49
- def initialize
50
- create_iface unless iface_exists?
51
- configure_bridge unless bridge_configured?
52
- end
53
65
  end
54
66
  end
@@ -1,3 +1,3 @@
1
1
  module VagrantBootstrap
2
- VERSION = "0.1.11"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,4 @@
1
+ require 'vagrant'
2
+ require 'vagrant_bootstrap/commands/bootstrap'
3
+
4
+ Vagrant.commands.register(:bootstrap) { VagrantBootstrap::Commands::Bootstrap }
@@ -14,6 +14,8 @@ Gem::Specification.new do |gem|
14
14
  gem.require_paths = ["lib"]
15
15
  gem.version = VagrantBootstrap::VERSION
16
16
 
17
- gem.add_dependency 'trollop'
18
17
  gem.add_dependency 'vagrant'
18
+ gem.add_dependency 'log4r'
19
+
20
+ gem.requirements << 'brctl binary'
19
21
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant_bootstrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,10 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-25 00:00:00.000000000 Z
12
+ date: 2012-08-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: trollop
15
+ name: vagrant
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
@@ -28,7 +28,7 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: vagrant
31
+ name: log4r
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
@@ -59,9 +59,10 @@ files:
59
59
  - bin/vagrant_bootstrap
60
60
  - lib/vagrant_bootstrap.rb
61
61
  - lib/vagrant_bootstrap/bootstrap.rb
62
- - lib/vagrant_bootstrap/cli.rb
62
+ - lib/vagrant_bootstrap/commands/bootstrap.rb
63
63
  - lib/vagrant_bootstrap/tap_bridge.rb
64
64
  - lib/vagrant_bootstrap/version.rb
65
+ - lib/vagrant_init.rb
65
66
  - templates/default.erb
66
67
  - vagrant_bootstrap.gemspec
67
68
  homepage: https://github.com/SmartReceipt/vagrant_bootstrap
@@ -82,7 +83,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
83
  - - ! '>='
83
84
  - !ruby/object:Gem::Version
84
85
  version: '0'
85
- requirements: []
86
+ requirements:
87
+ - brctl binary
86
88
  rubyforge_project:
87
89
  rubygems_version: 1.8.24
88
90
  signing_key:
@@ -1,44 +0,0 @@
1
- require 'vagrant_bootstrap'
2
- require 'vagrant_bootstrap/bootstrap'
3
- require 'vagrant_bootstrap/tap_bridge'
4
- require 'trollop'
5
- require 'ostruct'
6
-
7
- module VagrantBootstrap
8
- class CLI
9
-
10
- DEFAULT_TEMPLATE_FILE = 'default.erb'
11
-
12
- BANNER = <<-EOS
13
- Easily generate a Vagrantfile in a namespaced directory
14
-
15
- Usage:
16
- vagrant_bootstrap [name] [-b adapter]
17
-
18
- If specified, the name will be used to calculate the directory name and
19
- hostname of the VM, e.g. 'vagrant_bootstrap taco' will yield a directory and hostname of
20
- '%{name}')
21
- EOS
22
-
23
- class << self
24
- def start
25
- trollopts = Trollop::options do
26
- version VagrantBootstrap::VERSION
27
- banner BANNER % {:name => VagrantBootstrap.vm_name('taco')}
28
- opt :bridge, 'The bridge to attach the VM to', :default => TapBridge.new.iface
29
- opt :quiet, "Don't output anything unless there's a problem", :default => false
30
- opt :verbose, "More verbose output", :default => false
31
- opt :template_file, 'Specify a different template file', :type => String
32
- end
33
- opts = OpenStruct.new(trollopts)
34
-
35
- # sanitize options
36
- opts.name = VagrantBootstrap.vm_name(ARGV[0])
37
- opts.template_file = DEFAULT_TEMPLATE_FILE if opts.template_file.nil?
38
-
39
- puts "Your vagrant is called #{opts.name} and your adapter is #{opts.bridge}" unless opts.quiet
40
- VagrantBootstrap::Bootstrap.new opts
41
- end
42
- end
43
- end
44
- end