veewee 0.0.2 → 0.1.0a

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.
data/Gemfile CHANGED
@@ -2,4 +2,9 @@ source "http://rubygems.org"
2
2
 
3
3
  gem "veewee", :path => "."
4
4
 
5
- #gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
5
+ gem 'net-ssh'
6
+ gem 'virtualbox'
7
+ gem 'popen4'
8
+ gem 'vagrant'
9
+ gem 'thor'
10
+ gem 'highline'
data/Gemfile.lock CHANGED
@@ -1,11 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- veewee (0.0.2)
4
+ veewee (0.1.0a)
5
5
  highline (~> 1.6.1)
6
6
  net-ssh (~> 2.1.0)
7
7
  popen4 (~> 0.1.2)
8
- progressbar
9
8
  thor (~> 0.14.6)
10
9
  vagrant (~> 0.7.0)
11
10
 
@@ -30,7 +29,6 @@ GEM
30
29
  popen4 (0.1.2)
31
30
  Platform (>= 0.4.0)
32
31
  open4 (>= 0.4.0)
33
- progressbar (0.9.0)
34
32
  rake (0.8.7)
35
33
  thor (0.14.6)
36
34
  vagrant (0.7.1)
@@ -50,4 +48,10 @@ PLATFORMS
50
48
  ruby
51
49
 
52
50
  DEPENDENCIES
51
+ highline
52
+ net-ssh
53
+ popen4
54
+ thor
55
+ vagrant
53
56
  veewee!
57
+ virtualbox
@@ -1,44 +1,54 @@
1
- **VeeWee:** the tool to easily build vagrant base boxes
1
+ # Veewee is currently broken due to changes in Virtualbox 4.x
2
+ # We will fix them soon and move veewee to a plugin for vagrant
3
+
4
+
5
+ VeeWee: the tool to easily build vagrant base boxes
6
+ ===================================================
2
7
  Vagrant is a great tool to test new things or changes in a virtual machine(Virtualbox) using either chef or puppet.
3
8
  The first step is to download an existing 'base box'. I believe this scares a lot of people as they don't know who or how this box was build. Therefore lots of people end up first building their own base box to use with vagrant.
4
9
 
5
10
  Veewee tries to automate this and to share the knowledge and sources you need to create a basebox. Instead of creating custom ISO's from your favorite distribution, it leverages the 'keyboardputscancode' command of Virtualbox so send the actual 'boot prompt' keysequence to boot an existing iso.
6
11
 
7
12
  Before we can actually build the boxes, we need to take care of the minimal things to install:
13
+ - Currently this is still a very much 'it works on my machine only' code
8
14
  - Have Virtualbox 4.x installed -> download it from http://download.virtualbox.org/virtualbox/
9
-
15
+ - Have ruby and rubygems working
16
+ - Have the rake gem installed -> gem install rake
10
17
 
11
18
  ALPHA CODE: -> you're on your own....
12
19
 
13
- ## Installation:
14
- __from source__
20
+ ### WILL UPDATE SOON ####
21
+
22
+
23
+ 1)Installation: (from source)
24
+ ===========================
15
25
  $ git clone https://github.com/jedi4ever/veewee.git
16
26
  $ cd veewee
17
27
  $ gem install bundler
18
- $ bundle install
19
-
20
- __as a gem__
21
- $ gem install veewee
22
-
23
-
24
- ## List all templates
25
- $ vagrant basebox templates
26
-
27
- ## Define a new box (ex. Ubuntu 10.10 server i386)
28
-
29
- this is essentially making a copy based on the templates provided above.
30
-
31
- $ vagrant basebox define 'myubuntubox' 'ubuntu-10.10-server-i386'
28
+ $ bundle install
29
+
30
+ Installation: (as a gem)
31
+ ========================
32
+ coming soon
33
+
34
+ List all templates
35
+ ===================
36
+ $ rake templates
37
+ the following templates are available:
38
+ use rake define['<boxname>','CentOS-4.8-i386']
39
+ use rake define['<boxname>','CentOS-5.5-i386']
40
+ use rake define['<boxname>','ubuntu-10.04.1-server-i386']
41
+ use rake define['<boxname>','ubuntu-10.10-server-i386']
42
+
43
+ 3) Define a new box (ex. Ubuntu 10.10 server i386) - this is essentially making a copy based on the templates provided above.
44
+ $ rake define['myubuntubox','ubuntu-10.10-server-i386']
32
45
  template successfully copied
33
46
 
34
- -> This copies over the templates/ubuntu-10.10-server-i386 to definition/myubuntubox
35
-
47
+ -> This copies over the files in templates/ubuntu-10.10-server-i386 to definition/myubuntubox
36
48
  $ ls definitions/myubuntubox
37
49
  definition.rb postinstall.sh postinstall2.sh preseed.cfg
38
50
 
39
- ## Optionally modify the definition.rb , postinstall.sh or preseed.cfg
40
-
41
- <pre>
51
+ 4) Optionally modify the definition.rb , postinstall.sh or preseed.cfg
42
52
  Veewee::Session.declare( {
43
53
  :cpu_count => '1', :memory_size=> '256',
44
54
  :disk_size => '10140', :disk_format => 'VDI',:disk_size => '10240' ,
@@ -65,40 +75,35 @@ Veewee::Session.declare( {
65
75
  :postinstall_files => [ "postinstall.sh"],:postinstall_timeout => "10000"
66
76
  }
67
77
  )
68
- </pre>
69
78
 
70
79
  If you need to change values in the templates, be sure to run the rake undefine, the rake define again to copy the changes across.
71
80
 
72
- ## Put your isofile inside the $VEEWEE/iso directory or if you don't run
73
- $ vagrant basebox build 'myubuntubox'
74
-
75
- -> the build assumes your iso files are in 'currentdir'/iso
76
- -> if it can not find it will suggest to download the iso for you
81
+ 5) Put your isofile inside the $VEEWEE/iso directory or if you don't run
82
+ $ rake build['myubuntubox]
77
83
 
78
- ## Build the new box:
79
- $ vagrant basebox build 'myubuntubox'
84
+ -> This will show you the iso to download
80
85
 
81
- - This will create a machine + disk according to the definition.rb
82
- - Note: :os_type_id = The internal Name Virtualbox uses for that Distribution
83
- - Mount the ISO File :iso_file
84
- - Boot up the machine and wait for :boot_time
85
- - Send the keystrokes in :boot_cmd_sequence
86
- - Startup a webserver on :kickstart_port to wait for a request for the :kickstart_file
87
- - Wait for ssh login to work with :ssh_user , :ssh_password
88
- - Sudo execute the :postinstall_files
86
+ 6) Build the new box:
87
+ $ rake build['myubuntubox]
89
88
 
90
- ## Export the vm to a .box file
91
- $ vagrant basebox export 'myubuntubox'
89
+ -> This will create a machine + disk according to the definition.rb
90
+ -> Note: :os_type_id = The internal Name Virtualbox uses for that Distribution
91
+ -> Mount the ISO File :iso_file
92
+ -> Boot up the machine and wait for :boot_time
93
+ -> Send the keystrokes in :boot_cmd_sequence
94
+ -> Startup a webserver on :kickstart_port to wait for a request for the :kickstart_file
95
+ -> Wait for ssh login to work with :ssh_user , :ssh_password
96
+ -> Sudo execute the :postinstall_files
92
97
 
93
- this is actually calling - vagrant package --base 'myubuntubox' --output 'boxes/myubuntubox.box'
98
+ 7) Export the box into the boxes directory
99
+ $ rake export['myubuntubox']
94
100
 
95
- this will result in a myubuntubox.box
101
+ vagrant package --base 'myubuntubox' --output 'boxes/myubuntubox.box'
102
+ vagrant box add 'myubuntubox' 'boxes/myubuntubox.box'
96
103
 
97
- ## Add the box as one of your boxes
98
- $ vagrant box add 'myubuntubox' 'myubuntubox.box'
104
+ -> This will show you the vagrant command to export and to add it your vagrant boxset
99
105
 
100
- ## Use it in vagrant
101
- Start vagrant init in another window (as we have set the Virtualbox env to tmp before)
106
+ 8) Start vagrant init in another window (as we have set the Virtualbox env to tmp before)
102
107
  $ To import it into vagrant type:
103
108
 
104
109
  To use it:
@@ -106,14 +111,12 @@ vagrant init 'myubuntubox'
106
111
  vagrant up
107
112
  vagrant ssh
108
113
 
109
- ## If you have a setup working, share your 'definition' with me. That would be fun!
114
+ 9) If you have a setup working, share your 'definition' with me. That would be fun!
110
115
 
111
116
  IDEAS:
112
-
113
117
  - Now you integrate this with your CI build to create a daily basebox
114
118
 
115
119
  FUTURE IDEAS:
116
-
117
120
  - use snapshots to fastforward initial boot, and every postinstall command
118
121
  - export to AMI too
119
122
  - provide for more failsafe execution, testing parameters
data/Rakefile CHANGED
@@ -3,8 +3,36 @@ require 'bundler'
3
3
  require 'bundler/setup'
4
4
  Bundler::GemHelper.install_tasks
5
5
 
6
+ #We set this in the ENV file
7
+ #ENV['GEM_PATH']=File.join(File.dirname(__FILE__),"gems")
8
+ #ENV['GEM_HOME']=File.join(File.dirname(__FILE__),"gems")
9
+
10
+ def check_environment
11
+ begin
12
+ require 'vagrant'
13
+ rescue LoadError
14
+ puts "you need to install dependencies:"
15
+ puts "gem install vagrant"
16
+ exit
17
+ end
18
+
19
+ begin
20
+ require 'net/ssh'
21
+ require 'virtualbox'
22
+ require 'webrick'
23
+ require 'popen4'
24
+ rescue LoadError
25
+ puts "hmm you had vagrant installed but are missing the net-ssh or virtualbox gem"
26
+ puts "gem install virtualbox net-ssh POpen4"
27
+ exit
28
+ end
29
+ end
30
+
31
+ #See if all gems and so are installed
32
+ check_environment
33
+
6
34
  #Setup some base variables to use
7
- veewee_dir= "."
35
+ veewee_dir= File.dirname(__FILE__)
8
36
  definition_dir= File.expand_path(File.join(veewee_dir, "definitions"))
9
37
  lib_dir= File.expand_path(File.join(veewee_dir, "lib"))
10
38
  box_dir= File.expand_path(File.join(veewee_dir, "boxes"))
@@ -13,6 +41,8 @@ vbox_dir=File.expand_path(File.join(veewee_dir, "tmp"))
13
41
  tmp_dir=File.expand_path(File.join(veewee_dir, "tmp"))
14
42
  iso_dir=File.expand_path(File.join(veewee_dir, "iso"))
15
43
 
44
+ #needs to be moved to the config files to be allowed override
45
+ ENV['VBOX_USER_HOME']=vbox_dir
16
46
 
17
47
  #Load Veewee::Session libraries
18
48
  Dir.glob(File.join(lib_dir, '**','*.rb')).each {|f|
data/TODO ADDED
@@ -0,0 +1 @@
1
+ Maybe use Bittorrent to download iso - http://rubytorrent.rubyforge.org/
data/bin/veewee CHANGED
@@ -30,8 +30,6 @@ Dir.glob(File.join(lib_dir, '**','*.rb')).each {|f|
30
30
  Veewee::Session.setenv({:veewee_dir => veewee_dir, :definition_dir => definition_dir,
31
31
  :template_dir => template_dir, :iso_dir => iso_dir, :box_dir => box_dir, :tmp_dir => tmp_dir})
32
32
 
33
-
34
-
35
33
  class VeeweeCLI < Thor
36
34
 
37
35
  desc "init [NAME] [TEMPLATE]", "initializes a box from a template"
@@ -69,11 +67,10 @@ class VeeweeCLI < Thor
69
67
 
70
68
  end
71
69
 
72
-
73
-
74
70
  version=VirtualBox.version
75
- if (version.match(/^4./))
76
- VeeweeCLI.start
71
+ if (version.match(/^4.x/))
72
+ VeeweeCLI.start
77
73
  else
78
- puts "veewee only supports VirtualBox 4.x"
74
+ puts "veewee only supports VirtualBox 4.x"
79
75
  end
76
+
data/gems/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *
2
+ !.gitignore
data/lib/vagrant_init.rb CHANGED
@@ -1 +1 @@
1
- require 'veewee'
1
+ require 'veewee'
@@ -1,66 +1,63 @@
1
1
  require 'veewee/session'
2
2
 
3
- #Load Veewee::Session libraries
4
- lib_dir= File.expand_path(File.join(File.dirname(__FILE__),"..","..", "lib"))
5
- Dir.glob(File.join(lib_dir, '**','*.rb')).each {|f| require f }
6
-
7
3
  #Setup some base variables to use
8
- template_dir=File.expand_path(File.join(lib_dir,"..", "templates"))
4
+ veewee_dir= File.expand_path(File.join(File.dirname(__FILE__),"..",".."))
5
+ definition_dir= File.expand_path(File.join(".", "definitions"))
6
+ lib_dir= File.expand_path(File.join(veewee_dir, "lib"))
7
+ box_dir= File.expand_path(File.join(veewee_dir, "boxes"))
8
+ template_dir=File.expand_path(File.join(veewee_dir, "templates"))
9
9
 
10
- veewee_dir="."
11
- definition_dir= File.expand_path(File.join(veewee_dir, "definitions"))
10
+ #vbox_dir=File.expand_path(File.join(veewee_dir, "tmp"))
12
11
  tmp_dir=File.expand_path(File.join(veewee_dir, "tmp"))
12
+
13
13
  iso_dir=File.expand_path(File.join(veewee_dir, "iso"))
14
- box_dir=File.expand_path(File.join(veewee_dir, "boxes"))
14
+
15
+ #needs to be moved to the config files to be allowed override
16
+ #ENV['VBOX_USER_HOME']=vbox_dir
17
+
18
+ #Load Veewee::Session libraries
19
+ Dir.glob(File.join(lib_dir, '**','*.rb')).each {|f|
20
+ require f }
15
21
 
16
22
  #Initialize
17
23
  Veewee::Session.setenv({:veewee_dir => veewee_dir, :definition_dir => definition_dir,
18
24
  :template_dir => template_dir, :iso_dir => iso_dir, :box_dir => box_dir, :tmp_dir => tmp_dir})
19
25
 
20
- module Veewee
21
- class Command < Vagrant::Command::GroupBase
22
- register "basebox","Commands to manage baseboxes"
23
26
 
24
- desc "templates", "List the currently available box templates"
25
- def templates
26
- Veewee::Session.list_templates
27
- end
27
+ module Vagrant
28
+ module Command
29
+ class BoxCommand < Vagrant::Command::GroupBase
30
+ # Do not register anymore, as this registration is already done in Vagrant core
31
+ # Since Ruby classes are 'open', we are just adding subcommands to the 'box' command
28
32
 
29
- desc "define BOXNAME TEMPLATE", "Define a new box starting from a template"
30
- method_option :force,:type => :boolean , :default => false, :aliases => "-f", :desc => "overwrite the definition"
31
- def define(boxname, template)
32
- Veewee::Session.define(boxname,template,options)
33
- end
33
+ desc "templates", "List the currently available box templates"
34
+ def templates
35
+ Veewee::Session.list_templates
36
+ end
34
37
 
35
- desc "build BOXNAME", "Build the box BOXNAME"
36
- method_option :force,:type => :boolean , :default => false, :aliases => "-f", :desc => "overwrite the basebox"
37
- def build(boxname)
38
- Veewee::Session.build(boxname,options)
39
- end
38
+ desc "init BOXNAME TEMPLATE", "Define a new box starting from a template"
39
+ def init(boxname, template)
40
+ puts "Init a new box #{boxname}, starting from template #{template}"
41
+ Veewee::Session.define(boxname,template)
42
+ end
40
43
 
41
- desc "ostypes", "List the available Operating System types"
42
- def ostypes
43
- Veewee::Session.list_ostypes
44
- end
45
-
46
- desc "destroy BOXNAME", "Destroy the virtualmachine of a basebox"
47
- def destroy(boxname)
48
- puts Veewee::Session.destroy_vm(boxname)
49
- end
50
-
51
- desc "list", "Lists all defined boxes"
52
- def list
53
- Veewee::Session.list_definitions
54
- end
55
-
56
- desc "export [NAME]", "export the box"
57
- method_options :force => :boolean
58
- def export(boxname)
59
- if (!boxname.nil?)
60
- Veewee::Session.export_box(boxname)
44
+ desc "build BOXNAME", "Build the box BOXNAME"
45
+ def build(boxname)
46
+ puts "Building box #{boxname}"
47
+ Veewee::Session.build(boxname)
48
+ end
49
+
50
+ desc "ostypes", "List the available Operating System types"
51
+ def ostypes
52
+ puts "Operating System types:"
53
+ Veewee::Session.list_ostypes
54
+ end
55
+
56
+ desc "clean", "Clean all unfinished builds"
57
+ def clean
58
+ puts "Cleaning all unfinished builds"
61
59
  end
60
+
61
+ end
62
62
  end
63
-
64
63
  end
65
-
66
- end
@@ -2,16 +2,11 @@ module Veewee
2
2
  class Scancode
3
3
 
4
4
  def self.send_sequence(vboxcmd,vname,sequence)
5
- puts
6
- counter=0
5
+
7
6
  sequence.each { |s|
8
- counter=counter+1
9
-
10
7
  s.gsub!(/%IP%/,Veewee::Session.local_ip);
11
8
  s.gsub!(/%PORT%/,'7122');
12
9
  s.gsub!(/%NAME%/, vname);
13
- puts "Typing:[#{counter}]: "+s
14
-
15
10
  keycodes=string_to_keycode(s)
16
11
 
17
12
  # VBox seems to have issues with sending the scancodes as one big
@@ -26,15 +21,13 @@ module Veewee
26
21
  sleep 1
27
22
  }
28
23
 
29
- puts "Done typing."
30
- puts
31
24
 
32
25
  end
33
26
 
34
27
  def self.send_keycode(vboxcmd,vname,keycode)
35
28
  command= "#{vboxcmd} controlvm '#{vname}' keyboardputscancode #{keycode}"
36
29
  #puts "#{command}"
37
- IO.popen("#{command}") { |f| print '' }
30
+ IO.popen("#{command}") { |f| print '.' }
38
31
  end
39
32
 
40
33
  def self.string_to_keycode(thestring)
@@ -2,10 +2,6 @@ require 'digest/md5'
2
2
  require 'socket'
3
3
  require 'net/scp'
4
4
  require 'pp'
5
- require 'open-uri'
6
- require 'progressbar'
7
- require 'highline/import'
8
- require 'tempfile'
9
5
 
10
6
 
11
7
  module Veewee
@@ -45,43 +41,25 @@ module Veewee
45
41
 
46
42
  end
47
43
 
48
- def self.define(boxname,template_name,options = {})
44
+ def self.define(boxname,template_name)
49
45
  #Check if template_name exists
50
-
51
- options = { "force" => false, "format" => "vagrant" }.merge(options)
52
-
46
+ #puts @veewee_dir
53
47
  if File.directory?(File.join(@template_dir,template_name))
54
48
  else
55
- puts "This template can not be found, use vagrant basebox templates to list all templates"
56
- exit
49
+ puts "this template can not be found, use vagrant box templates to list all templates"
57
50
  end
58
51
  if !File.exists?(@definition_dir)
59
52
  FileUtils.mkdir(@definition_dir)
60
53
  end
61
-
62
54
  if File.directory?(File.join(@definition_dir,boxname))
63
- if !options["force"]
64
- puts "The definition for #{boxname} already exists. Use --force to overwrite"
65
- exit
66
- end
55
+ puts "this definition already exists"
67
56
  else
68
57
  FileUtils.mkdir(File.join(@definition_dir,boxname))
58
+ FileUtils.cp_r(File.join(@template_dir,template_name,'.'),File.join(@definition_dir,boxname))
59
+ puts "template succesfully copied"
69
60
  end
70
- FileUtils.cp_r(File.join(@template_dir,template_name,'.'),File.join(@definition_dir,boxname))
71
- puts "The basebox '#{boxname}' has been succesfully created from the template ''#{template_name}'"
72
- puts "You can now edit the definition files stored in definitions/#{boxname}"
73
- puts "or build the box with:"
74
- if (options["format"]=='vagrant')
75
- puts "vagrant basebox build '#{boxname}'"
76
- end
77
- if (options["format"]=='veewee')
78
- puts "veewee build '#{boxname}'"
79
- end
80
-
81
61
  end
82
62
 
83
-
84
-
85
63
 
86
64
  def self.definition_exists?(boxname)
87
65
  if File.directory?(File.join(@definition_dir,boxname))
@@ -107,20 +85,15 @@ module Veewee
107
85
  end
108
86
  end
109
87
 
110
- def self.list_templates( options = { :format => 'vagrant'})
111
- puts "The following templates are available:"
88
+ def self.list_templates
89
+ puts "the following templates are available:"
112
90
  subdirs=Dir.glob("#{@template_dir}/*")
113
91
  subdirs.each do |sub|
114
92
  if File.directory?("#{sub}")
115
93
  definition=Dir.glob("#{sub}/definition.rb")
116
94
  if definition.length!=0
117
95
  name=sub.sub(/#{@template_dir}\//,'')
118
- if (options[:format]=='vagrant')
119
- puts "vagrant basebox define '<boxname>' '#{name}'"
120
- end
121
- if (options[:format]=='veewee')
122
- puts "veewee define '<boxname>' '#{name}'"
123
- end
96
+ puts "vagrant box init '<boxname>' '#{name}'"
124
97
  end
125
98
  end
126
99
  end
@@ -138,10 +111,9 @@ module Veewee
138
111
  puts "Not yet implemented"
139
112
  end
140
113
 
141
- def self.verify_iso(filename,autodownload = false)
114
+ def self.verify_iso(filename)
142
115
  if File.exists?(File.join(@iso_dir,filename))
143
- puts
144
- puts "Verifying the isofile #{filename} is ok."
116
+ puts "isofile #{filename} is available"
145
117
  else
146
118
  full_path=File.join(@iso_dir,filename)
147
119
  path1=Pathname.new(full_path)
@@ -149,23 +121,15 @@ module Veewee
149
121
  rel_path=path1.relative_path_from(path2).to_s
150
122
 
151
123
  puts
152
- puts "The isofile is not found. The definition provided the following information:"
153
- puts "- Download url: #{@definition[:iso_src]}"
154
- puts "- Md5 Checksum: #{@definition[:iso_md5]}"
124
+ puts "Isofile is not found. The definition suggested the following URL to download:"
125
+ puts "-url: #{@definition[:iso_src]}"
126
+ puts "-md5: #{@definition[:iso_md5]}"
155
127
  puts ""
156
-
157
- question=ask("Download? (Yes/No)") {|q| q.default="No"}
158
- if question.downcase == "yes"
159
- download_progress(@definition[:iso_src],full_path)
160
- else
161
- puts "You have choosen for manual download: "
162
- puts "curl -C - -L '#{@definition[:iso_src]}' -o '#{rel_path}'"
163
- puts "md5 '#{rel_path}' "
164
- puts
165
- exit
166
- end
167
-
168
-
128
+ puts "type:"
129
+ puts "curl -C - -L '#{@definition[:iso_src]}' -o '#{rel_path}'"
130
+ puts "md5 '#{rel_path}' "
131
+ puts
132
+ exit
169
133
  end
170
134
 
171
135
  end
@@ -181,10 +145,7 @@ module Veewee
181
145
  puts "Not yet implemented"
182
146
  end
183
147
 
184
- def self.build(boxname,options)
185
-
186
- options = { "force" => false, "format" => "vagrant" }.merge(options)
187
-
148
+ def self.build(boxname)
188
149
  #Now we have to load the definition (reads definition.rb)
189
150
  load_definition(boxname)
190
151
 
@@ -199,13 +160,9 @@ module Veewee
199
160
 
200
161
  verify_iso(@definition[:iso_file])
201
162
 
202
- if (options["force"]==false)
203
- else
204
- puts "Forcing build by destroying #{boxname} machine"
205
- destroy_vm(boxname)
206
- end
207
-
208
163
  checksums=calculate_checksums(@definition,boxname)
164
+
165
+
209
166
 
210
167
  transaction(boxname,"0-initial-#{checksums[0]}",checksums) do
211
168
 
@@ -230,12 +187,11 @@ module Veewee
230
187
 
231
188
 
232
189
  #waiting for it to boot
233
- puts "Waiting for the machine to boot"
234
190
  sleep @definition[:boot_wait].to_i
235
191
 
192
+ puts "sending keys"
236
193
  Veewee::Scancode.send_sequence("#{@vboxcmd}","#{boxname}",@definition[:boot_cmd_sequence])
237
194
 
238
- puts "Starting a webserver on port #{@definition[:kickstart_port]}"
239
195
  #:kickstart_port => "7122", :kickstart_ip => self.local_ip, :kickstart_timeout => 1000,:kickstart_file => "preseed.cfg",
240
196
  Veewee::Web.wait_for_request(@definition[:kickstart_file],{:port => @definition[:kickstart_port],
241
197
  :host => @definition[:kickstart_ip], :timeout => @definition[:kickstart_timeout],
@@ -243,16 +199,15 @@ module Veewee
243
199
 
244
200
  Veewee::Ssh.when_ssh_login_works("localhost",ssh_options) do
245
201
  #Transfer version of Virtualbox to $HOME/.vbox_version
246
- versionfile=Tempfile.open("vbox.version")
247
- versionfile.puts "#{VirtualBox::Global.global.lib.virtualbox.version}"
248
- versionfile.rewind
249
- Veewee::Ssh.transfer_file("localhost",versionfile.path,".vbox_version", ssh_options)
250
- versionfile.close
251
- versionfile.delete
202
+ versionfile=File.join(@tmp_dir,".vbox_version")
203
+ File.open(versionfile, 'w') {|f| f.write("#{VirtualBox::Global.global.lib.virtualbox.version}") }
204
+ Veewee::Ssh.transfer_file("localhost",versionfile,ssh_options)
252
205
  end
253
206
  end #initial Transaction
254
207
 
255
-
208
+
209
+
210
+
256
211
  counter=1
257
212
  @definition[:postinstall_files].each do |postinstall_file|
258
213
 
@@ -315,58 +270,7 @@ module Veewee
315
270
  vm.save
316
271
  end
317
272
 
318
- def self.destroy_vm(boxname)
319
-
320
- load_definition(boxname)
321
-
322
- #:destroy_medium => :delete, will delete machine + all media attachments
323
- #vm.destroy(:destroy_medium => :delete)
324
- ##vm.destroy(:destroy_image => true)
325
-
326
- #VBoxManage unregistervm "test-machine" --delete
327
- #because the destroy does remove the .vbox file on 4.0.x
328
- #PDB
329
- #vm.destroy()
330
-
331
-
332
-
333
- vm=VirtualBox::VM.find(boxname)
334
-
335
- if (!vm.nil? && !(vm.powered_off?))
336
- puts "Shutting down vm #{boxname}"
337
- #We force it here, maybe vm.shutdown is cleaner
338
- vm.stop
339
- end
340
- sleep 3
341
-
342
- command="#{@vboxcmd} unregistervm '#{boxname}' --delete"
343
-
344
- puts "Deleting vm #{boxname}"
345
-
346
- #Exec and system stop the execution here
347
- Veewee::Shell.execute("#{command}")
348
- sleep 1
349
-
350
- #if the disk was not attached when the machine was destroyed we also need to delete the disk
351
- location=boxname+"."+@definition[:disk_format].downcase
352
- found=false
353
- VirtualBox::HardDrive.all.each do |d|
354
- if !d.location.match(/#{location}/).nil?
355
-
356
- command="#{@vboxcmd} closemedium disk '#{d.location}' --delete"
357
- puts "Deleting disk #{d.location}"
358
- Veewee::Shell.execute("#{command}")
359
- #v.3
360
- #d.destroy(true)
361
- break
362
- end
363
- end
364
-
365
-
366
-
367
- end
368
-
369
- def self.create_vm(boxname,force=false)
273
+ def self.create_vm(boxname)
370
274
 
371
275
  #Verifying the os.id with the :os_type_id specified
372
276
  matchfound=false
@@ -389,8 +293,8 @@ module Veewee
389
293
  vm.stop
390
294
  end
391
295
 
392
- if !vm.nil?
393
- puts "Box already exists"
296
+ if !vm.nil?
297
+ puts "box already exists"
394
298
  #vm.stop
395
299
  #vm.destroy
396
300
  else
@@ -398,9 +302,11 @@ module Veewee
398
302
  #Box does not exist, we can start to create it
399
303
 
400
304
  command="#{@vboxcmd} createvm --name '#{boxname}' --ostype '#{@definition[:os_type_id]}' --register"
305
+ puts command
401
306
 
402
307
  #Exec and system stop the execution here
403
308
  Veewee::Shell.execute("#{command}")
309
+ sleep 3
404
310
 
405
311
  end
406
312
 
@@ -416,8 +322,7 @@ module Veewee
416
322
  vm.os_type_id=@definition[:os_type_id]
417
323
  vm.cpu_count=@definition[:cpu_count].to_i
418
324
  vm.name=boxname
419
-
420
- puts "Creating vm #{vm.name} : #{vm.memory_size}M - #{vm.cpu_count} CPU - #{vm.os_type_id}"
325
+
421
326
  #setting bootorder
422
327
  vm.boot_order[0]=:hard_disk
423
328
  vm.boot_order[1]=:dvd
@@ -443,7 +348,7 @@ module Veewee
443
348
  end
444
349
 
445
350
  if !found
446
- puts "Creating new harddrive of size #{@definition[:disk_size].to_i} "
351
+ puts "creating new harddrive"
447
352
 
448
353
  #newdisk=VirtualBox::HardDrive.new
449
354
  #newdisk.format=@definition[:disk_format]
@@ -459,7 +364,8 @@ module Veewee
459
364
  place=results.gets.chop
460
365
  results.close
461
366
 
462
- command ="#{@vboxcmd} createhd --filename '#{place}/#{boxname}/#{boxname}.#{@definition[:disk_format]}' --size '#{@definition[:disk_size].to_i}' --format #{@definition[:disk_format]} > /dev/null"
367
+ puts "#{command}"
368
+ command ="#{@vboxcmd} createhd --filename '#{place}/#{boxname}/#{boxname}.#{@definition[:disk_format]}' --size '#{@definition[:disk_size].to_i}' --format #{@definition[:disk_format]}"
463
369
  Veewee::Shell.execute("#{command}")
464
370
 
465
371
  end
@@ -488,17 +394,20 @@ module Veewee
488
394
  results.close
489
395
 
490
396
  location="#{place}/#{boxname}/"+location
491
- puts "Attaching disk: #{location}"
397
+
398
+ puts "location=#{location}"
399
+
492
400
 
493
401
  #command => "${vboxcmd} storageattach '${vname}' --storagectl 'SATA Controller' --port 0 --device 0 --type hdd --medium '${vname}.vdi'",
494
402
  command ="#{@vboxcmd} storageattach '#{boxname}' --storagectl 'SATA Controller' --port 0 --device 0 --type hdd --medium '#{location}'"
403
+ puts "#{command}"
495
404
  Veewee::Shell.execute("#{command}")
496
405
 
497
406
  end
498
407
 
499
408
  def self.mount_isofile(boxname,isofile)
500
409
  full_iso_file=File.join(@iso_dir,isofile)
501
- puts "Mounting cdrom: #{full_iso_file}"
410
+ puts "#{full_iso_file}"
502
411
  #command => "${vboxcmd} storageattach '${vname}' --storagectl 'IDE Controller' --type dvddrive --port 1 --device 0 --medium '${isodst}' ";
503
412
  command ="#{@vboxcmd} storageattach '#{boxname}' --storagectl 'IDE Controller' --type dvddrive --port 1 --device 0 --medium '#{full_iso_file}'"
504
413
  Veewee::Shell.execute("#{command}")
@@ -534,7 +443,10 @@ module Veewee
534
443
  puts "Available os types:"
535
444
  VirtualBox::Global.global.lib.virtualbox.guest_os_types.collect { |os|
536
445
  puts "#{os.id}: #{os.description}"
537
- }
446
+ }
447
+
448
+ puts
449
+
538
450
  end
539
451
 
540
452
 
@@ -565,28 +477,11 @@ module Veewee
565
477
  end
566
478
  end
567
479
 
480
+ pp checksums
568
481
  return checksums
569
482
 
570
483
  end
571
484
 
572
- def self.download_progress(url,localfile)
573
- pbar = nil
574
- URI.parse(url).open(
575
- :content_length_proc => lambda {|t|
576
- if t && 0 < t
577
- pbar = ProgressBar.new("Fetching file", t)
578
- pbar.file_transfer_mode
579
- end
580
- },
581
- :progress_proc => lambda {|s|
582
- pbar.set s if pbar
583
- }) { |src|
584
- open("#{localfile}","wb") { |dst|
585
- dst.write(src.read)
586
- }
587
- }
588
-
589
- end
590
485
 
591
486
  def self.transaction(boxname,step_name,checksums,&block)
592
487
 
@@ -609,6 +504,8 @@ module Veewee
609
504
  end
610
505
  end
611
506
 
507
+ pp snapnames
508
+
612
509
  #find the last snapshot matching the state
613
510
  counter=[snapnames.length, checksums.length].min-1
614
511
  last_good_state=counter
@@ -620,14 +517,14 @@ module Veewee
620
517
  break
621
518
  end
622
519
  end
623
- #puts "Last good state: #{last_good_state}"
520
+ puts "Last good state: #{last_good_state}"
624
521
 
625
522
  if (current_step_nr < last_good_state)
626
- #puts "fast forwarding #{step_name}"
523
+ puts "fast forwarding #{step_name}"
627
524
  return
628
525
  end
629
526
 
630
- #puts "Current step: #{current_step_nr}"
527
+ puts "Current step: #{current_step_nr}"
631
528
  if (current_step_nr == last_good_state)
632
529
  if vm.running?
633
530
  vm.stop
@@ -637,14 +534,14 @@ module Veewee
637
534
  #puts "remove old snapshots"
638
535
 
639
536
  for s in (last_good_state+1)..(snapnames.length-1)
640
- puts "Removing step [s] snapshot as it is no more valid"
537
+ puts "removing snapname #{snapnames[s]}"
641
538
  snapshot=vm.find_snapshot(snapnames[s])
642
539
  snapshot.destroy
643
540
  #puts snapshot
644
541
  end
645
542
 
646
543
  vm.reload
647
- puts "Loading step #{current_step_nr} snapshots as it has not changed"
544
+ puts "action load #{step_name}"
648
545
  sleep 2
649
546
  goodsnap=vm.find_snapshot(snapnames[last_good_state])
650
547
  goodsnap.restore
@@ -654,7 +551,7 @@ module Veewee
654
551
 
655
552
  end
656
553
 
657
- #puts "last good state #{last_good_state}"
554
+ puts "last good state #{last_good_state}"
658
555
 
659
556
 
660
557
  if (current_step_nr > last_good_state)
@@ -665,41 +562,66 @@ module Veewee
665
562
 
666
563
  if !vm.nil?
667
564
  if vm.running?
668
- puts "Stopping machine"
565
+ puts "stopping machine"
669
566
  vm.stop
670
567
  while vm.running?
671
568
  sleep 1
672
569
  end
673
570
  end
674
571
 
675
- #detaching cdroms (used to work in 3.x)
676
- # vm.medium_attachments.each do |m|
677
- # if m.type==:dvd
678
- # #puts "Detaching dvd"
679
- # m.detach
680
- # end
681
- # end
572
+ #detaching cdroms
573
+ vm.medium_attachments.each do |m|
574
+ if m.type==:dvd
575
+ puts "detaching dvd"
576
+ m.detach
577
+ end
578
+ end
682
579
 
683
580
  vm.reload
684
- puts "We found no good state so we are destroying the previous machine+disks"
685
- destroy_vm(boxname)
581
+ puts "destroying machine+disks"
582
+ #:destroy_medium => :delete, will delete machine + all media attachments
583
+ #vm.destroy(:destroy_medium => :delete)
584
+ ##vm.destroy(:destroy_image => true)
585
+
586
+ #VBoxManage unregistervm "test-machine" --delete
587
+ #because the destroy does remove the .vbox file on 4.0.x
588
+ #PDB
589
+ #vm.destroy()
590
+
591
+ command="#{@vboxcmd} unregistervm '#{boxname}' --delete"
592
+ puts command
593
+
594
+ #Exec and system stop the execution here
595
+ Veewee::Shell.execute("#{command}")
596
+
597
+ #if the disk was not attached when the machine was destroyed we also need to delete the disk
598
+ location=boxname+"."+@definition[:disk_format].downcase
599
+ found=false
600
+ VirtualBox::HardDrive.all.each do |d|
601
+ if !d.location.match(/#{location}/).nil?
602
+ d.destroy(true)
603
+ break
604
+ end
605
+ end
686
606
  end
687
607
 
688
608
  end
689
609
 
690
- #puts "(re-)executing step #{step_name}"
610
+ puts "(re-)executing step #{step_name}"
691
611
 
692
612
 
693
613
  yield
694
-
614
+ puts "seeking #{boxname}"
695
615
  #Need to look it up again because if it was an initial load
696
616
  vm=VirtualBox::VM.find(boxname)
697
- puts "Step [#{current_step_nr}] was succesfull - saving state"
617
+ puts "saving state"
698
618
  vm.save_state
619
+ puts "waiting for 2 secs"
699
620
  sleep 2 #waiting for it to be ok
700
- #puts "about to snapshot #{vm}"
621
+ puts "about to snapshot #{vm}"
701
622
  #take snapshot after succesful execution
702
623
  vm.take_snapshot(step_name,"snapshot taken by veewee")
624
+ puts "wait 2 secs before starting"
703
625
  sleep 2 #waiting for it to be started again
704
626
  vm.start
705
627
  end
data/lib/veewee/shell.rb CHANGED
@@ -15,9 +15,7 @@ module Veewee
15
15
  begin
16
16
  PTY.spawn( command ) do |r, w, pid|
17
17
  begin
18
- r.each { }
19
- #r.each { |line| print line;}
20
-
18
+ r.each { |line| print line;}
21
19
  rescue Errno::EIO
22
20
  end
23
21
  end
data/lib/veewee/ssh.rb CHANGED
@@ -5,10 +5,9 @@ module Veewee
5
5
 
6
6
  defaults={ :port => '22', :timeout => 200 , :user => 'vagrant', :password => 'vagrant'}
7
7
 
8
- options=defaults.merge(options)
8
+ puts "checking if login works ssh => #{options[:port]}"
9
9
 
10
- puts
11
- puts "Trying ssh login with user #{options[:user]} to sshd on port => #{options[:port]}"
10
+ options=defaults.merge(options)
12
11
 
13
12
  begin
14
13
  Timeout::timeout(options[:timeout]) do
@@ -34,13 +33,11 @@ module Veewee
34
33
  end
35
34
 
36
35
 
37
- def self.transfer_file(host,filename,destination = '.' , options)
36
+ def self.transfer_file(host,filename,options)
38
37
  Net::SSH.start( host,options[:user],options ) do |ssh|
39
- puts "Transferring #{filename} to #{destination} "
40
- ssh.scp.upload!( filename, destination ) do |ch, name, sent, total|
41
- # print "\r#{destination}: #{(sent.to_f * 100 / total.to_f).to_i}%"
42
- print "."
43
-
38
+ puts "Transferring #{filename} "
39
+ ssh.scp.upload!( filename, '.' ) do |ch, name, sent, total|
40
+ print "\r#{filename}: #{(sent.to_f * 100 / total.to_f).to_i}%"
44
41
  end
45
42
  end
46
43
  puts
@@ -1,3 +1,3 @@
1
1
  module Veewee
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0a"
3
3
  end
data/lib/veewee/web.rb CHANGED
@@ -14,7 +14,7 @@ module Veewee
14
14
  def do_GET(request,response)
15
15
  response['Content-Type']='text/plain'
16
16
  response.status = 200
17
- puts "Serving file #{@localfile}"
17
+
18
18
  displayfile=File.open(@localfile,'r')
19
19
  content=displayfile.read()
20
20
  response.body=content
@@ -26,19 +26,12 @@ module Veewee
26
26
 
27
27
  def self.wait_for_request(filename,options={:timeout => 10, :web_dir => "", :port => 7125})
28
28
 
29
- webrick_logger=WEBrick::Log.new("/dev/null", WEBrick::Log::INFO)
30
-
31
29
  web_dir=options[:web_dir]
32
30
  filename=filename
33
- s= HTTPServer.new(
34
- :Port => options[:port],
35
- :Logger => webrick_logger,
36
- :AccessLog => webrick_logger
37
- )
31
+ s= HTTPServer.new(:Port => options[:port])
38
32
  s.mount("/#{filename}", FileServlet,File.join(web_dir,filename))
39
33
  trap("INT"){
40
34
  s.shutdown
41
- puts "Stopping webserver"
42
35
  exit
43
36
  }
44
37
  s.start
@@ -36,7 +36,7 @@ VBOX_VERSION=$(cat /home/vagrant/.vbox_version)
36
36
  cd /tmp
37
37
  wget http://download.virtualbox.org/virtualbox/$VBOX_VERSION/VBoxGuestAdditions_$VBOX_VERSION.iso
38
38
  mount -o loop VBoxGuestAdditions_$VBOX_VERSION.iso /mnt
39
- sh /mnt/VBoxLinuxAdditions.run
39
+ sh /mnt/VBoxLinuxAdditions-x86.run
40
40
  umount /mnt
41
41
 
42
42
  rm VBoxGuestAdditions_$VBOX_VERSION.iso
data/tmp/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *
2
+ !.gitignore
data/veewee.gemspec CHANGED
@@ -19,9 +19,6 @@ Gem::Specification.new do |s|
19
19
  s.add_dependency "popen4", "~> 0.1.2"
20
20
  s.add_dependency "thor", "~> 0.14.6"
21
21
  s.add_dependency "highline", "~> 1.6.1"
22
- s.add_dependency "progressbar"
23
-
24
- s.add_development_dependency "bundler", ">= 1.0.0"
25
22
 
26
23
  s.files = `git ls-files`.split("\n")
27
24
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: veewee
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 2
9
- version: 0.0.2
4
+ prerelease: 5
5
+ version: 0.1.0a
10
6
  platform: ruby
11
7
  authors:
12
8
  - Patrick Debois
@@ -15,7 +11,7 @@ autorequire:
15
11
  bindir: bin
16
12
  cert_chain: []
17
13
 
18
- date: 2011-02-07 00:00:00 +01:00
14
+ date: 2011-02-06 00:00:00 +01:00
19
15
  default_executable:
20
16
  dependencies:
21
17
  - !ruby/object:Gem::Dependency
@@ -25,10 +21,6 @@ dependencies:
25
21
  requirements:
26
22
  - - ~>
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- - 7
31
- - 0
32
24
  version: 0.7.0
33
25
  type: :runtime
34
26
  prerelease: false
@@ -40,10 +32,6 @@ dependencies:
40
32
  requirements:
41
33
  - - ~>
42
34
  - !ruby/object:Gem::Version
43
- segments:
44
- - 2
45
- - 1
46
- - 0
47
35
  version: 2.1.0
48
36
  type: :runtime
49
37
  prerelease: false
@@ -55,10 +43,6 @@ dependencies:
55
43
  requirements:
56
44
  - - ~>
57
45
  - !ruby/object:Gem::Version
58
- segments:
59
- - 0
60
- - 1
61
- - 2
62
46
  version: 0.1.2
63
47
  type: :runtime
64
48
  prerelease: false
@@ -70,10 +54,6 @@ dependencies:
70
54
  requirements:
71
55
  - - ~>
72
56
  - !ruby/object:Gem::Version
73
- segments:
74
- - 0
75
- - 14
76
- - 6
77
57
  version: 0.14.6
78
58
  type: :runtime
79
59
  prerelease: false
@@ -85,42 +65,10 @@ dependencies:
85
65
  requirements:
86
66
  - - ~>
87
67
  - !ruby/object:Gem::Version
88
- segments:
89
- - 1
90
- - 6
91
- - 1
92
68
  version: 1.6.1
93
69
  type: :runtime
94
70
  prerelease: false
95
71
  version_requirements: *id005
96
- - !ruby/object:Gem::Dependency
97
- name: progressbar
98
- requirement: &id006 !ruby/object:Gem::Requirement
99
- none: false
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- segments:
104
- - 0
105
- version: "0"
106
- type: :runtime
107
- prerelease: false
108
- version_requirements: *id006
109
- - !ruby/object:Gem::Dependency
110
- name: bundler
111
- requirement: &id007 !ruby/object:Gem::Requirement
112
- none: false
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- segments:
117
- - 1
118
- - 0
119
- - 0
120
- version: 1.0.0
121
- type: :development
122
- prerelease: false
123
- version_requirements: *id007
124
72
  description: Expand the 'vagrant box' command to support the creation of base boxes from scratch
125
73
  email:
126
74
  - patrick.debois@jedi.be
@@ -136,14 +84,15 @@ files:
136
84
  - .rvmrc
137
85
  - Gemfile
138
86
  - Gemfile.lock
139
- - README.md
87
+ - README
140
88
  - Rakefile
89
+ - TODO
141
90
  - bin/veewee
91
+ - gems/.gitignore
142
92
  - iso/.gitignore
143
93
  - lib/vagrant_init.rb
144
94
  - lib/veewee.rb
145
95
  - lib/veewee/command.rb
146
- - lib/veewee/config.rb
147
96
  - lib/veewee/export.rb
148
97
  - lib/veewee/scancode.rb
149
98
  - lib/veewee/session.rb
@@ -176,6 +125,7 @@ files:
176
125
  - templates/ubuntu-10.10-server-i386/postinstall.sh
177
126
  - templates/ubuntu-10.10-server-i386/postinstall2.sh
178
127
  - templates/ubuntu-10.10-server-i386/preseed.cfg
128
+ - tmp/.gitignore
179
129
  - trials/docu-vbox.txt
180
130
  - trials/f.rb
181
131
  - trials/t.rb
@@ -194,7 +144,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
194
144
  requirements:
195
145
  - - ">="
196
146
  - !ruby/object:Gem::Version
197
- hash: 1789913568085881237
147
+ hash: 1588562477501260201
198
148
  segments:
199
149
  - 0
200
150
  version: "0"
@@ -203,15 +153,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
203
153
  requirements:
204
154
  - - ">="
205
155
  - !ruby/object:Gem::Version
206
- segments:
207
- - 1
208
- - 3
209
- - 6
210
156
  version: 1.3.6
211
157
  requirements: []
212
158
 
213
159
  rubyforge_project: veewee
214
- rubygems_version: 1.3.7
160
+ rubygems_version: 1.5.0
215
161
  signing_key:
216
162
  specification_version: 3
217
163
  summary: Vagrant box creation
data/lib/veewee/config.rb DELETED
@@ -1,5 +0,0 @@
1
- module Veewee
2
- class BaseBoxConfig < Vagrant::Config::Base
3
- configures :basebox
4
- end
5
- end