virtualman 1.0.0 → 1.1.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.
- data/bin/clone_cooking +31 -0
- data/bin/clone_vm +12 -0
- data/bin/ssh_cloned +42 -0
- data/bin/virtualman +20 -0
- data/lib/virtualman.rb +5 -98
- data/lib/virtualman/conf.rb +37 -0
- data/lib/virtualman/interractive.rb +124 -0
- data/lib/virtualman/menu.rb +58 -0
- data/lib/virtualman/vm.rb +61 -0
- data/lib/virtualman/vmlister.rb +58 -0
- metadata +17 -4
data/bin/clone_cooking
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
####Required
|
4
|
+
require 'virtualman'
|
5
|
+
|
6
|
+
cloned_vms = load_conf["cloned_vms"]
|
7
|
+
|
8
|
+
cloned_vms.each do |vm|
|
9
|
+
list << vm["name"]
|
10
|
+
end
|
11
|
+
|
12
|
+
puts "----Clone_Cooking----"
|
13
|
+
puts "Which VM do you want to cook?"
|
14
|
+
|
15
|
+
chocie = Menu.unic_run(list)
|
16
|
+
|
17
|
+
selected_vm = Vm.new(choice)
|
18
|
+
|
19
|
+
if !selected_vm.running?
|
20
|
+
puts "#{selected_vm.name} is not running..."
|
21
|
+
start_vm(selected_vm)
|
22
|
+
if !selected_vm.running?
|
23
|
+
puts "As you want.."
|
24
|
+
return 1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
cmd = "ssh #{user}@#{selected_vm.ip}"
|
29
|
+
exec (cmd)
|
30
|
+
|
31
|
+
puts "Thanks!"
|
data/bin/clone_vm
ADDED
data/bin/ssh_cloned
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
####Required
|
4
|
+
require 'virtualman'
|
5
|
+
|
6
|
+
cloned_vms = load_conf["cloned_vms"]
|
7
|
+
|
8
|
+
cloned_vms.each do |vm|
|
9
|
+
list << vm["name"]
|
10
|
+
end
|
11
|
+
|
12
|
+
puts "----SSH_cloned_VM----"
|
13
|
+
puts "Which VM do you want to ssh?"
|
14
|
+
|
15
|
+
chocie = Menu.unic_run(list)
|
16
|
+
|
17
|
+
selected_vm = Vm.new(choice)
|
18
|
+
|
19
|
+
puts "With which user? [root]"
|
20
|
+
user = Menu.ask
|
21
|
+
|
22
|
+
if user.empty?
|
23
|
+
user = "root"
|
24
|
+
end
|
25
|
+
|
26
|
+
if !selected_vm.running?
|
27
|
+
puts "#{selected_vm.name} is not running..."
|
28
|
+
puts "Do you want to start it?"
|
29
|
+
puts "yes/[no]"
|
30
|
+
chocie = Menu.ask
|
31
|
+
if choice == "yes"
|
32
|
+
start_vm(selected_vm)
|
33
|
+
else
|
34
|
+
puts "As you want!"
|
35
|
+
return 1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
cmd = "ssh #{user}@#{selected_vm.ip}"
|
40
|
+
exec (cmd)
|
41
|
+
|
42
|
+
puts "Thanks!"
|
data/bin/virtualman
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
####Required
|
4
|
+
require 'virtualman'
|
5
|
+
|
6
|
+
menu = ["clone","cook","ssh_cloned","exit"]
|
7
|
+
|
8
|
+
puts "----VirtualMan----"
|
9
|
+
puts "Please select an action to do with your VM."
|
10
|
+
|
11
|
+
choice = Menu.unic_run(menu)
|
12
|
+
|
13
|
+
while choice != "exit"
|
14
|
+
send(choice)
|
15
|
+
puts "----VirtualMan----"
|
16
|
+
puts "Please select an action to do with your VM."
|
17
|
+
choice = Menu.unic_run(menu)
|
18
|
+
end
|
19
|
+
|
20
|
+
puts "Thank you come again!"
|
data/lib/virtualman.rb
CHANGED
@@ -1,98 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# This attribute contains the name of the VM in VirtualBox.
|
8
|
-
attr_reader :name
|
9
|
-
|
10
|
-
# A #Vm is just described by it's name.
|
11
|
-
# *type is for further needs
|
12
|
-
def initialize(vm_name, *type)
|
13
|
-
@name = vm_name
|
14
|
-
end
|
15
|
-
|
16
|
-
# Returns a boolean whether the VM is running or not
|
17
|
-
def running?
|
18
|
-
!`VBoxManage showvminfo #{name} | grep State | grep running`.empty?
|
19
|
-
end
|
20
|
-
|
21
|
-
# A general method to interact with the VM.
|
22
|
-
# action is the kind of action to request to VBoxManage
|
23
|
-
# *param is a list of options
|
24
|
-
def manage(action, *param)
|
25
|
-
puts "VBoxManage #{action} #{@name} #{param.join(" ")}"
|
26
|
-
puts `VBoxManage #{action} #{@name} #{param.join(" ")}`
|
27
|
-
end
|
28
|
-
|
29
|
-
# A method to stop properly a vm
|
30
|
-
# It assumes that you have the name of the VM on your personnal hosts file or DNS
|
31
|
-
# It can be modified to use GuestAdditions instead
|
32
|
-
def stop!
|
33
|
-
$stdout.sync = true
|
34
|
-
if self.running?
|
35
|
-
`ssh root@#{self.name.delete "\""} "shutdown -h now"`
|
36
|
-
puts "Waiting for complete shutdown of #{self.name}"
|
37
|
-
while self.running?
|
38
|
-
print "."
|
39
|
-
sleep (1)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Create an array tht contains all the #Vm from VirtualBox
|
47
|
-
# And implement methods to play with it as a whole.
|
48
|
-
class VmLister < Array
|
49
|
-
|
50
|
-
# Return an array with the list returned by the command "VBoxManage list vms"
|
51
|
-
# The argument *type will be used later (to specify a remote host for instance)
|
52
|
-
def perform_list(*type)
|
53
|
-
vm_list = `VBoxManage list vms`.split(/\n/).collect {|e| e[/".*"/]}
|
54
|
-
return vm_list
|
55
|
-
end
|
56
|
-
|
57
|
-
# Populate the array with the method perform_list
|
58
|
-
# The argument *type will be used later (to specify a remote host for instance)
|
59
|
-
def populate!(*type)
|
60
|
-
self.perform_list.each {|vm| self << Vm.new(vm)}
|
61
|
-
end
|
62
|
-
|
63
|
-
# A simple lister
|
64
|
-
def list
|
65
|
-
self.each {|vm| puts "#{vm.name}"}
|
66
|
-
end
|
67
|
-
|
68
|
-
# This methods returns a #VmLister object but just with the running VMs of the list.
|
69
|
-
def running?
|
70
|
-
running_vms = VmLister.new
|
71
|
-
self.collect {|vm| running_vms << vm if vm.running?}
|
72
|
-
return running_vms
|
73
|
-
end
|
74
|
-
|
75
|
-
# A general method to interact with the VBoxManage tool
|
76
|
-
# the block param could be useful for advanced links between your script and this class
|
77
|
-
def manage(action, *param, &block)
|
78
|
-
self.each do |vm|
|
79
|
-
block_param = block.call(vm.name) if block_given?
|
80
|
-
|
81
|
-
vm.manage(action, param, block_param)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# A method to automatically export the list of VMs
|
86
|
-
def backup!(folder)
|
87
|
-
self.each {|vm| vm.stop!}
|
88
|
-
sleep (5)
|
89
|
-
|
90
|
-
self.each do |vm|
|
91
|
-
filename = Time.now().strftime("#{vm.name.delete "\""}_%Y%m%dT%H%M")
|
92
|
-
vm.manage("export","-o #{folder}/#{filename}.ova")
|
93
|
-
sleep(5)
|
94
|
-
end
|
95
|
-
|
96
|
-
self.each {|vm| vm.manage("startvm", "--type headless")}
|
97
|
-
end
|
98
|
-
end
|
1
|
+
require 'virtualman/menu'
|
2
|
+
require 'virtualman/vm'
|
3
|
+
require 'virtualman/vmlister'
|
4
|
+
require 'virtualman/conf'
|
5
|
+
require 'virtualman/interractive'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
CONFIG_FILE = File.join(ENV['HOME'],'.clone_vm.rc.yaml')
|
4
|
+
|
5
|
+
def load_conf
|
6
|
+
if File.exists? CONFIG_FILE
|
7
|
+
config_options = YAML.load_file(CONFIG_FILE)
|
8
|
+
else
|
9
|
+
STDERR.puts "No configuration file found here ~/.vm_to_clone.rc.yaml"
|
10
|
+
STDERR.puts "Config file example:"
|
11
|
+
STDERR.puts "---"
|
12
|
+
STDERR.puts "source_vm:"
|
13
|
+
STDERR.puts " - name: Debian"
|
14
|
+
STDERR.puts " snapshot: ready to clone!"
|
15
|
+
STDERR.puts " - name: Gentoo"
|
16
|
+
STDERR.puts " snapshot: almost ready"
|
17
|
+
STDERR.puts "role_path: http://path/to/your/role/fodler"
|
18
|
+
STDERR.puts "cookbook_path: http://path/to/your/cookbooks.tar.gz"
|
19
|
+
STDERR.puts "roles:"
|
20
|
+
STDERR.puts "- devtest"
|
21
|
+
STDERR.puts "- devtest_jenkins"
|
22
|
+
STDERR.puts "- build_pkg_devtest_jenkins"
|
23
|
+
end
|
24
|
+
return config_options
|
25
|
+
end
|
26
|
+
|
27
|
+
def record_conf(vm_cloned)
|
28
|
+
conf = load_conf()
|
29
|
+
if conf["cloned_vms"]
|
30
|
+
conf["cloned_vms"] << {"name" => vm_cloned.name}
|
31
|
+
else
|
32
|
+
conf.merge!({"cloned_vms" => {"name" => vm_cloned.name}})
|
33
|
+
end
|
34
|
+
|
35
|
+
File.open(CONFIG_FILE, "w") {|f| f.write(conf.to_yaml) }
|
36
|
+
puts "VM #{vm_cloned.name} saved in your configuration file"
|
37
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#require 'lib/virtualman'
|
2
|
+
|
3
|
+
def choosed_option(array,choice,attribute_to_check)
|
4
|
+
array.each_with_index do |option,index|
|
5
|
+
if option[attribute_to_check] == choice
|
6
|
+
return array[index]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def choose options, *attribute_to_check
|
12
|
+
options_array = load_conf[options]
|
13
|
+
if attribute_to_check.empty?
|
14
|
+
return Menu.unic_run(options_array)
|
15
|
+
else
|
16
|
+
list = Array.new
|
17
|
+
options_array.each do |option|
|
18
|
+
list << option[attribute_to_check[0]]
|
19
|
+
end
|
20
|
+
choice = Menu.unic_run(list)
|
21
|
+
return choosed_option(options_array,choice,attribute_to_check[0])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def clone_vm
|
26
|
+
puts "----Clone_VM----"
|
27
|
+
puts "Which VM do you want to clone?"
|
28
|
+
|
29
|
+
vm_choice = choose "source_vms", "name"
|
30
|
+
vm_to_clone = Vm.new("\"#{vm_choice["name"]}\"")
|
31
|
+
|
32
|
+
puts "How do you want to name your freshly spawned VM?"
|
33
|
+
vm_name = Menu.ask
|
34
|
+
|
35
|
+
options = "--snapshot '#{vm_choice["snapshot"]}' --name #{vm_name} --register"
|
36
|
+
vm_to_clone.manage("clonevm", options)
|
37
|
+
|
38
|
+
vm_cloned = Vm.new("\"#{vm_name}\"")
|
39
|
+
return vm_cloned
|
40
|
+
end
|
41
|
+
|
42
|
+
def start_vm(vm)
|
43
|
+
if !vm.running?
|
44
|
+
puts "Do you want to start the VM? headless?"
|
45
|
+
puts "(default is no)"
|
46
|
+
puts "yes/headless/[no]"
|
47
|
+
|
48
|
+
answer = Menu.ask
|
49
|
+
|
50
|
+
if answer == "headless"
|
51
|
+
option = "--type headless"
|
52
|
+
puts "The VM is booting headless"
|
53
|
+
elsif answer == "yes"
|
54
|
+
option = ""
|
55
|
+
puts "The VM is booting"
|
56
|
+
else
|
57
|
+
puts "The vm will not be started"
|
58
|
+
return vm
|
59
|
+
end
|
60
|
+
|
61
|
+
vm.manage("startvm", option)
|
62
|
+
|
63
|
+
print "Waiting for the VM to get an IP"
|
64
|
+
while !vm.ip
|
65
|
+
print "."
|
66
|
+
sleep (1)
|
67
|
+
end
|
68
|
+
print "\n"
|
69
|
+
end
|
70
|
+
|
71
|
+
return vm.running?
|
72
|
+
end
|
73
|
+
|
74
|
+
def clone
|
75
|
+
cloned_vm = clone_vm
|
76
|
+
start_vm(cloned_vm)
|
77
|
+
record_conf(cloned_vm)
|
78
|
+
end
|
79
|
+
|
80
|
+
def cook
|
81
|
+
puts "----Cook a clone!----"
|
82
|
+
puts "Which VM do you want to cook?"
|
83
|
+
role_path = load_conf["role_path"]
|
84
|
+
cookbook_path = load_conf["cookbook_path"]
|
85
|
+
|
86
|
+
vm_choice = choose "cloned_vms", "name"
|
87
|
+
|
88
|
+
selected_vm = Vm.new(vm_choice["name"])
|
89
|
+
|
90
|
+
puts "Which role do you want to give?"
|
91
|
+
|
92
|
+
role = choose "roles"
|
93
|
+
|
94
|
+
user="root"
|
95
|
+
|
96
|
+
if start_vm(selected_vm)
|
97
|
+
cmd = "ssh #{user}@#{selected_vm.ip} '/usr/local/bin/chef-solo -j #{role_path}#{role}.json -r #{cookbook_path}'"
|
98
|
+
p cmd
|
99
|
+
`#{cmd}`
|
100
|
+
end
|
101
|
+
|
102
|
+
puts "Thanks!"
|
103
|
+
end
|
104
|
+
|
105
|
+
def ssh_cloned
|
106
|
+
puts "----SSH to cloned VM----"
|
107
|
+
puts "Which VM do you want to ssh?"
|
108
|
+
|
109
|
+
vm_choice = choose "cloned_vms", "name"
|
110
|
+
|
111
|
+
selected_vm = Vm.new(vm_choice["name"])
|
112
|
+
|
113
|
+
puts "With which user? [root]"
|
114
|
+
user = Menu.ask
|
115
|
+
|
116
|
+
if user.empty?
|
117
|
+
user = "root"
|
118
|
+
end
|
119
|
+
|
120
|
+
if start_vm(selected_vm)
|
121
|
+
cmd = "ssh #{user}@#{selected_vm.ip}"
|
122
|
+
exec (cmd)
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#The MIT LICENSE
|
2
|
+
|
3
|
+
#Copyright (c) 2010 Gabriel Horner
|
4
|
+
|
5
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
#a copy of this software and associated documentation files (the
|
7
|
+
#"Software"), to deal in the Software without restriction, including
|
8
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
#the following conditions:
|
12
|
+
|
13
|
+
#The above copyright notice and this permission notice shall be
|
14
|
+
#included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
#LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
#WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
#Forked from https://github.com/cldwalker/menu
|
25
|
+
|
26
|
+
module Menu
|
27
|
+
extend self
|
28
|
+
|
29
|
+
def ask
|
30
|
+
$stdin.reopen '/dev/tty'
|
31
|
+
$stdin.gets.chomp
|
32
|
+
end
|
33
|
+
|
34
|
+
def unic_run(array)
|
35
|
+
unic_prompt(array)
|
36
|
+
answer = ask
|
37
|
+
return unic_answer(array, answer)
|
38
|
+
end
|
39
|
+
|
40
|
+
def unic_answer(array, input)
|
41
|
+
if input[/(\d+)/]
|
42
|
+
index = $1.to_i - 1
|
43
|
+
return array[index] if array[index]
|
44
|
+
else
|
45
|
+
abort("`#{input}' is an invalid choice.")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def unic_prompt(lines)
|
50
|
+
ljust_size = lines.size.to_s.size + 1
|
51
|
+
lines.each_with_index {|obj,i|
|
52
|
+
puts "#{i+1}.".ljust(ljust_size) + " " +obj
|
53
|
+
}
|
54
|
+
print "\nSpecify your choice\nChoose: "
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# Implement a way to interact with the VirtualBox command line tool.
|
2
|
+
# Each #Vm is a Class that contains the #name of the VM. With that
|
3
|
+
# name you can then interact with it through VBoxManage for example
|
4
|
+
|
5
|
+
class Vm
|
6
|
+
|
7
|
+
# This attribute contains the name of the VM in VirtualBox.
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
# A #Vm is just described by it's name.
|
11
|
+
# *type is for further needs
|
12
|
+
def initialize(vm_name, *type)
|
13
|
+
@name = vm_name
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns a boolean whether the VM is running or not
|
17
|
+
def running?
|
18
|
+
!`VBoxManage showvminfo #{name} | grep State | grep running`.empty?
|
19
|
+
end
|
20
|
+
|
21
|
+
# A general method to interact with the VM.
|
22
|
+
# action is the kind of action to request to VBoxManage
|
23
|
+
# *param is a list of options
|
24
|
+
def manage(action, *param)
|
25
|
+
puts "VBoxManage #{action} #{@name} #{param.join(" ")}"
|
26
|
+
puts `VBoxManage #{action} #{@name} #{param.join(" ")}`
|
27
|
+
end
|
28
|
+
|
29
|
+
# A method to stop properly a vm
|
30
|
+
# It assumes that you have the name of the VM on your personnal hosts file or DNS
|
31
|
+
# It can be modified to use GuestAdditions instead
|
32
|
+
def stop!
|
33
|
+
$stdout.sync = true
|
34
|
+
if self.running?
|
35
|
+
`ssh root@#{self.name.delete "\""} "shutdown -h now"`
|
36
|
+
puts "Waiting for complete shutdown of #{self.name}"
|
37
|
+
while self.running?
|
38
|
+
print "."
|
39
|
+
sleep (1)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
# return the ip of the VM if it is running. O if it is not.
|
46
|
+
def ip
|
47
|
+
if self.running?
|
48
|
+
options = "enumerate #{self.name} | grep IP | cut -d , -f 2 | cut -d : -f 2"
|
49
|
+
cmd_ip = "VBoxManage guestproperty #{options}"
|
50
|
+
ip = `#{cmd_ip}`.strip
|
51
|
+
if ip.match /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/
|
52
|
+
return ip
|
53
|
+
else
|
54
|
+
return false
|
55
|
+
end
|
56
|
+
else
|
57
|
+
puts "The VM is not running, cannot determine IP"
|
58
|
+
return false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# Create an array that contains all the #Vm from VirtualBox
|
2
|
+
# And implement methods to play with it as a whole.
|
3
|
+
class VmLister < Array
|
4
|
+
|
5
|
+
# Return an array with the list returned by the command "VBoxManage list vms"
|
6
|
+
# The argument *type will be used later (to specify a remote host for instance)
|
7
|
+
def perform_list(*type)
|
8
|
+
vm_list = `VBoxManage list vms`.split(/\n/).collect {|e| e[/".*"/]}
|
9
|
+
return vm_list
|
10
|
+
end
|
11
|
+
|
12
|
+
# Populate the array with the method perform_list
|
13
|
+
# The argument *type will be used later (to specify a remote host for instance)
|
14
|
+
def populate!(*type)
|
15
|
+
self.perform_list.each {|vm| self << Vm.new(vm)}
|
16
|
+
end
|
17
|
+
|
18
|
+
# A simple lister
|
19
|
+
def list
|
20
|
+
self.each {|vm| puts "#{vm.name}"}
|
21
|
+
end
|
22
|
+
|
23
|
+
# Get the IP of each running vm.
|
24
|
+
def ip
|
25
|
+
self.each {|vm| puts vm.ip}
|
26
|
+
end
|
27
|
+
|
28
|
+
# This methods returns a #VmLister object but just with the running VMs of the list.
|
29
|
+
def running?
|
30
|
+
running_vms = VmLister.new
|
31
|
+
self.collect {|vm| running_vms << vm if vm.running?}
|
32
|
+
return running_vms
|
33
|
+
end
|
34
|
+
|
35
|
+
# A general method to interact with the VBoxManage tool
|
36
|
+
# the block param could be useful for advanced links between your script and this class
|
37
|
+
def manage(action, *param, &block)
|
38
|
+
self.each do |vm|
|
39
|
+
block_param = block.call(vm.name) if block_given?
|
40
|
+
|
41
|
+
vm.manage(action, param, block_param)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# A method to automatically export the list of VMs
|
46
|
+
def backup!(folder)
|
47
|
+
self.each {|vm| vm.stop!}
|
48
|
+
sleep (5)
|
49
|
+
|
50
|
+
self.each do |vm|
|
51
|
+
filename = Time.now().strftime("#{vm.name.delete "\""}_%Y%m%dT%H%M")
|
52
|
+
vm.manage("export","-o #{folder}/#{filename}.ova")
|
53
|
+
sleep(5)
|
54
|
+
end
|
55
|
+
|
56
|
+
self.each {|vm| vm.manage("startvm", "--type headless")}
|
57
|
+
end
|
58
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: virtualman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,16 +9,29 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-06 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: It is for writing scripts for UNIX-like systems to handle your VirtualBox
|
15
15
|
appliance.
|
16
16
|
email: pierre.ozoux@gmail.com
|
17
|
-
executables:
|
17
|
+
executables:
|
18
|
+
- clone_vm
|
19
|
+
- virtualman
|
20
|
+
- ssh_cloned
|
21
|
+
- clone_cooking
|
18
22
|
extensions: []
|
19
23
|
extra_rdoc_files: []
|
20
24
|
files:
|
21
25
|
- lib/virtualman.rb
|
26
|
+
- lib/virtualman/conf.rb
|
27
|
+
- lib/virtualman/interractive.rb
|
28
|
+
- lib/virtualman/menu.rb
|
29
|
+
- lib/virtualman/vm.rb
|
30
|
+
- lib/virtualman/vmlister.rb
|
31
|
+
- bin/clone_vm
|
32
|
+
- bin/virtualman
|
33
|
+
- bin/ssh_cloned
|
34
|
+
- bin/clone_cooking
|
22
35
|
homepage: http://rubygems.org/gems/virtualman
|
23
36
|
licenses: []
|
24
37
|
post_install_message:
|
@@ -42,5 +55,5 @@ rubyforge_project:
|
|
42
55
|
rubygems_version: 1.8.23
|
43
56
|
signing_key:
|
44
57
|
specification_version: 3
|
45
|
-
summary: A
|
58
|
+
summary: A simple way to manage your Virtual Machines under VirtualBox.
|
46
59
|
test_files: []
|